Skip to content

sound-Lab/sound-Lab-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

36 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Netlify Status

intro

  • Sound LAB은 μ‹œν€€μ„œλ₯Ό μ›Ήμš©μœΌλ‘œ μ œμž‘ν•œ μž‘κ³‘ μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.
  • κ°„λ‹¨ν•œ μ‘°μž‘λ²•μœΌλ‘œ μ†μ‰½κ²Œ μž‘κ³‘ν•  수 μžˆλ„λ‘ μ œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


Contents



Motivation

Sound LAB은 μž‘κ³‘ μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. 과거에 μ°Έμ—¬ν–ˆλ˜ νŒ€ ν”„λ‘œμ νŠΈμ—μ„œ WebRTCλ₯Ό μ΄μš©ν•˜μ—¬ μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈλ₯Ό ν•˜λ©΄μ„œ Web API에 λŒ€ν•΄ μžμ—°μŠ€λŸ½κ²Œ ν₯λ―Έκ°€ 생겼고 λ‹€μ–‘ν•œ Web API에 도전해보고 μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. ν‰μ†Œ μŒμ•…μ„ 즐겨듣고 λ””μ œμž‰μ— 관심이 μžˆμ–΄ μ˜€λ””μ˜€μ™€ κ΄€λ ¨λœ Web APIλ₯Ό 쑰사해보닀 Web Audio APIλ₯Ό μ΄μš©ν•œ μ‚¬μš΄λ“œλž©μ„ κ΅¬μƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.



μž‘μ—… κΈ°κ°„

  • 1μ£Όμ°¨

    기획 및 λ””μžμΈ μž‘μ—…

  • 2, 3μ£Όμ°¨

    개발 및 배포

    • κΈ°λŠ₯ κ΅¬ν˜„
    • ν”Όλ“œλ°± 반영 및 λ¬Έμ„œ μž‘μ„±


Git Work Flow

  • κΈ°λŠ₯λ³„λ‘œ feature 브랜치 생성 ν›„ 개발
  • λ‹¨μœ„ κΈ°λŠ₯ μ™„λ£Œ ν›„ master 브랜치둜 병합


배포



듀토리얼

title

  • 메인 νŽ˜μ΄μ§€μ—μ„œ 곑 타이틀을 μž…λ ₯ν•©λ‹ˆλ‹€.

  • μž‘κ³‘ νŽ˜μ΄μ§€λ‘œ 화면이 μ΄λ™ν•©λ‹ˆλ‹€.

  • μƒ˜ν”Œ 파일이 제곡되고 μž¬μƒν•΄ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • νŠΈλž™ μΆ”κ°€λ₯Ό ν΄λ¦­ν•œ ν›„ μ•…κΈ°λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

    νŠΈλž™ μΆ”κ°€ μ‹œ μ„ νƒν•œ 악기에 따라 ν™”λ©΄ ν•˜λ‹¨μ— 곑은 νŽΈμ§‘ν•  수 μžˆλŠ” μ‹œν€€μ„œκ°€ μ„ΈνŒ…λ©λ‹ˆλ‹€. λ™μ‹œμ— νŠΈλž™ λ¦¬μŠ€νŠΈμ— μ„ νƒν•œ μ•…κΈ°μ˜ νŠΈλž™μ΄ μΆ”κ°€λ©λ‹ˆλ‹€.

  • ν™”λ©΄ ν•˜λ‹¨ μ‹œν€€μ„œ λΈ”λŸ­μ„ ν΄λ¦­ν•˜λ©΄μ„œ 곑을 νŽΈμ§‘ν•©λ‹ˆλ‹€.

  • 곑을 μ €μž₯ν•œ ν›„ URL을 톡해 κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



μ£Όμš”κΈ°λŠ₯

  • μ‹œν€€μ„œ

    sequencer
  1. 32λ°•μžμ˜ μ‹œν€€μ„œ λΈ”λŸ­μ΄ 16λ§ˆλ”” μ”© A파트 B파트 λ‚˜λˆ μ„œ 화면에 μ„ΈνŒ…λ©λ‹ˆλ‹€.

  2. 각 λ°•μžμ— ν•΄λ‹Ήν•˜λŠ” μ‹œν€€μ„œ λΈ”λŸ­μ„ ν΄λ¦­ν•˜λ©΄ ν•΄λ‹Ή λ§ˆλ””μ— μ†Œλ¦¬κ°€ μž…λ ₯λ©λ‹ˆλ‹€.

  3. 각 νŒŒνŠΈμ— ν•΄λ‹Ήν•˜λŠ” λ³€κ²½ 사항이 ν™”λ©΄ 상단 악보에 λ°˜μ˜λ©λ‹ˆλ‹€.

  4. μž¬μƒν•˜λŠ” λ™μ•ˆμ—λ„ νŽΈμ§‘μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.


  • νŠΈλž™ 리슀트

    trackList
  1. νŠΈλž™μ΄ 순차적으둜 νŠΈλž™ λ¦¬μŠ€νŠΈμ— μΆ”κ°€λ©λ‹ˆλ‹€.

  2. νŠΈλž™λ³„ μ‚­μ œ, μŒμ†Œκ±°λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  3. νŽΈμ§‘μ„ μ›ν•˜λŠ” νŠΈλž™μ„ ν΄λ¦­ν•˜λ©΄ ν™”λ©΄ ν•˜λ‹¨ μ‹œν€€μ„œκ°€ νŠΈλž™μ— λ§žλŠ” μ•…κΈ°λ‘œ λ³€κ²½λ©λ‹ˆλ‹€.


  • BPM 쑰절 κΈ°λŠ₯

    ν™”λ©΄ 상단에 μžˆλŠ” bpm μ‘°μ ˆμΉΈμ—μ„œ μ›ν•˜λŠ” 속도λ₯Ό μž…λ ₯ν•˜λ©΄ μž¬μƒ 속도λ₯Ό λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΅œλŒ€ 240 μ΅œμ € 40 bpmμž…λ‹ˆλ‹€.

  • URL 곡유 κΈ°λŠ₯

    곑을 μ €μž₯ν–ˆμ„ 경우 URL을 톡해 곑 νŽΈμ§‘ νŽ˜μ΄μ§€λ‘œ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.



Usage

  • Requirements

    • μ΅œμ‹  λ²„μ „μ˜ Chrome Browser μ‚¬μš©μ„ ꢌμž₯ν•©λ‹ˆλ‹€.

    • Localμ—μ„œ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ 사전 μ€€λΉ„κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

  • Installation

    Root 디렉토리에 .env νŒŒμΌμ„ μƒμ„±ν•˜κ³ , λ‹€μŒ ν™˜κ²½λ³€μˆ˜λ₯Ό μž…λ ₯ν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€.

    • Front-end

      REACT_APP_SOUND_LAB_PUBLIC_URL=https://api.soundlab.agency/
      $ git clone https://github.com/sound-Lab/sound-Lab-client.git
      $ cd sound-Lab-client
      $ npm install
      $ npm start
    • Back-end

      MONGO_DB_URL>
      $ git clone https://github.com/sound-Lab/sound-Lab-server.git
      $ cd sound-Lab-server
      $ npm install
      $ npm run dev


기술 μŠ€νƒ

  • Front End

    React β”‚ Redux Saga β”‚ Tone.js β”‚ Styled-components

  • Back End

    Node.js β”‚ Express β”‚ MongoDB Atlas & Mongoose


  • μŠ€νƒ μ„ μ • 이유

    • React

      μœ μ €μ˜ 곑 νŽΈμ§‘ 그리고 μž¬μƒλ¨μ— 따라 λΉˆλ²ˆν•˜κ²Œ μΌμ–΄λ‚˜λŠ” λ³€ν™”λ₯Ό 효과적으둜 λ Œλ”λ§ν•˜κΈ° μœ„ν•΄ Reactλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

    • Redux Saga

      곑 νŽΈμ§‘μ— 따라 λΉˆλ²ˆν•˜κ²Œ μΌμ–΄λ‚˜λŠ” νŠΈλž™ μƒνƒœ λ³€ν™”λ₯Ό κ³΅μœ ν•˜κ³  μžˆλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ λ‹€μˆ˜ μ‘΄μž¬ν•˜κΈ°μ— μ „μ—­ μƒνƒœ κ΄€λ¦¬μ˜ ν•„μš”μ„±μ„ 느꼈고 Reduxλ₯Ό λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€.

      React μ»΄ν¬λ„ŒνŠΈμ™€ 비동기 μš”μ²­ 둜직의 관심사 뢄리λ₯Ό μœ„ν•΄ Middleware둜 Redux-sagaλ₯Ό λ„μž…ν•˜μ˜€μŠ΅λ‹ˆλ‹€. sagaλ₯Ό μ„ νƒν•œ μ΄μœ λŠ” μ§„μž… μž₯벽이 λ†’μ§€λ§Œ Generator ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ μ•‘μ…˜μ„ μˆœμˆ˜ν•˜κ²Œ μœ μ§€ν•  수 μžˆλ‹€λŠ” 점 그리고 비동기 μš”μ²­μ„ λ™κΈ°μ μœΌλ‘œ μž‘μ„±ν•  수 μžˆλ‹€λŠ” μ μ—μ„œ μ„ νƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    • Tone.js VS P5.js

      μ˜€λ””μ˜€μ™€ κ΄€λ ¨λœ κΈ°λŠ₯을 효율적으둜 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ Web audio API와 κ΄€λ ¨λœ ν”„λ ˆμž„μ›Œν¬ ν˜Ήμ€ 라이브러리λ₯Ό μ„ νƒν•΄μ•Όν–ˆμŠ΅λ‹ˆλ‹€.

      • Tone.jsλŠ” μŒμ•… μ œμž‘μ„ μœ„ν•œ ν”„λ ˆμž„μ›Œν¬λ‘œ Web audio APIλ₯Ό 기반으둜 λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€. κΈ°λŠ₯ κ΅¬ν˜„μ— κ΄€λ ¨λœ λ‹€μ–‘ν•œ λ©”μ„œλ“œμ™€ 자료λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

      • P5.jsλŠ” Canvas APIλ₯Ό μ†μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” 라이브러리둜 HTML μ˜€λ””μ˜€ μš”μ†Œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ˜€λ””μ˜€ κ΄€λ ¨ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜μ§€λ§Œ 주된 κΈ°λŠ₯이 μ•„λ‹ˆλ©° μ˜€λ””μ˜€ μ‹œκ°ν™”μ— νŠΉν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

      두 개의 ν”„λ ˆμž„μ›Œν¬λ₯Ό λΉ„κ΅ν–ˆμ„ λ•Œ Tone.jsκ°€ ν”„λ‘œλ©•νŠΈ λͺ©μ μ— λΆ€ν•©ν•œλ‹€κ³  νŒλ‹¨ν•˜μ—¬ μ„ νƒν–ˆμŠ΅λ‹ˆλ‹€.



기술적 μ±Œλ¦°μ§€

  • μŒμ•… 객체 ꡬ쑰 ꡬ성

    λ‹€μ–‘ν•œ μ•…κΈ°μ˜ μ†Œλ¦¬κ°€ 각각의 μŒμ„ λ‚΄λ©΄μ„œ μž¬μƒλ  수 μžˆλ„λ‘ μ•„λž˜μ™€ 같은 ν˜•νƒœλ‘œ νŠΈλž™μ„ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

    • μŒμ•… νŠΈλž™

      ν•˜λ‚˜μ˜ μŒμ•… κ°μ²΄λŠ” tracks λ°°μ—΄λ‘œ κ΅¬μ„±λ˜μ–΄ 있고, 각 νŠΈλž™μ€ λ§ˆλ”” λ°°μ—΄κ³Ό μŠ€νƒ­ λ°°μ—΄ 그리고 μ„ νƒλœ μ•…κΈ°μ˜ μ½”λ“œ 정보가 λ“€μ–΄μžˆμŠ΅λ‹ˆλ‹€.

      νŠΈλž™ ꡬ쑰λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ design pattern 쀑 factory pattern을 ν™œμš©ν•˜μ—¬ νŠΈλž™ 객체 생성 ν™˜κ²½μ„ λ‹¨μˆœν™”ν–ˆμŠ΅λ‹ˆλ‹€.

      1. factory νŒ¨ν„΄μ„ μ΄μš©ν•΄ TracksFactory ν˜•μ„±
      2. νŠΈλž™ μΆ”κ°€ μ‹œ ν•΄λ‹Ή TracksFactoryλ₯Ό μ΄μš©ν•΄ νŠΈλž™μ— ν•„μš”ν•œ steps ν˜•μ„±
      νŠΈλž™ 생성 μ½”λ“œ
      function Tracks(tracks) {
        this.codeName = tracks.codeName;
        this.bars = tracks.bars || Array(16).fill(0);
        this.steps =
          tracks.steps ||
          tracks.codes.map((code) => ({
            name: code,
            step: Array(64).fill(0),
          }));
      }
      
      function TracksFactory() {}
      
      TracksFactory.prototype.tracksClass = Tracks;
      TracksFactory.prototype.createSteps = function (tracks) {
        return new this.tracksClass(tracks);
      };
      
      const stepsFactory = new TracksFactory();
      
      const tracks = stepsFactory.createSteps({
        type: instrument[0].name,
        codes,
      });

      μœ„μ™€ 같은 ꡬ쑰둜 νŠΈλž™ 객체 생성 ν™˜κ²½μ„ 단좕할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ„ νƒλ˜λŠ” 악기에 따라 λ‹€λ₯Έ ν™˜κ²½μ„ μ œκ³΅ν•΄ ν•˜λ‚˜μ˜ μƒμ„±μžλ‘œ λ‹€μ–‘ν•œ νŠΈλž™ ꡬ쑰λ₯Ό ν˜•μ„±ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

    • μŒμ•… progress bar ꡬ성

      μž¬μƒ μ‹œκ°„μ„ μ‹œκ°ν™”ν•˜κΈ° μœ„ν•΄ μž¬μƒμ€‘μΈ μŠ€νƒ­μ˜ indexλ₯Ό λΉ„μœ¨ μΉ˜ν™˜ν•˜μ—¬ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

      1. μœ μ €κ°€ μž…λ ₯ν•œ bpm에 60초λ₯Ό λ‚˜λˆˆ ν›„ κ·Έ 값에 16λ§ˆλ””λ₯Ό κ³±ν•΄ progress bar time을 μ‚°μΆœν–ˆμŠ΅λ‹ˆλ‹€.
      2. ProgressBar component의 props둜 μ‚°μΆœν•΄λ‚Έ 값을 λ‚΄λ €μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.
      3. styled-components의 νŠΉμ§• 쀑 propsλ₯Ό μ΄μš©ν•  수 μžˆλŠ” 점을 μ΄μš©ν•˜μ—¬ 건내받은 값을 μ΄μš©ν•˜μ—¬ μž¬μƒ μ‹œκ°„μ„ μ‹œκ°ν™”ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
      Progress bar μ‹œκ°ν™” μ½”λ“œ
      const ProgressBar = styled.div`
        animation: ${(props) => `progressAnimationStrike ${props.time}s linear`};
        animation-iteration-count: infinite;
      
        @keyframes progressAnimationStrike {
          from {
            width: 0;
          }
          to {
            width: 100%;
          }
        }
      `;

      μœ„μ™€ 같은 ꡬ쑰둜 λ³„λ„μ˜ 데이터 κ΅¬ν˜„μ—†μ΄ μž¬μƒ μ‹œκ°„μ„ μ‹œκ°ν™”ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  • μ €μž₯

    • 문제

      μƒˆλ‘œκ³ μΉ¨κ³Ό URL 접근에 λŒ€μ‘ν•˜κΈ° μœ„ν•΄ 곑 μ €μž₯ κΈ°λŠ₯을 κΈ°νšν–ˆμŠ΅λ‹ˆλ‹€. 초기 기획 단계에 νŠΈλž™μ„ μΆ”κ°€ν•  λ•Œλ§ˆλ‹€ μ„ νƒν•œ 악기에 따라 ν•΄λ‹Ή μ•…κΈ° sample 객체λ₯Ό λ‘œλ“œν•œ ν›„ λ¦¬λ•μŠ€μ— 보관, μ €μž₯ μ‹œ μ•…κΈ° sample 객체와 ν•¨κ»˜ 데이터 λ² μ΄μŠ€μ— μ €μž₯ν•˜λŠ” 방식을 κ΅¬μƒν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ΅¬ν˜„ λ‹¨κ³„μ—μ„œ μ•…κΈ° μŒμ› sample 객체가 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯λ˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

    • 원인

      Tone.jsλ₯Ό μ΄μš©ν•΄ λ‘œλ“œν•œ μŒμ› sample κ°μ²΄λŠ” Audio context ν˜•νƒœλ‘œ λ³€ν™˜λ˜μ–΄ λΈŒλΌμš°μ €μ—μ„œ μ‚¬μš©λ˜μ—ˆκ³  데이터 λ² μ΄μŠ€μ— μ €μž₯ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 곑 νŽΈμ§‘ 화면에 μ§„μž…ν–ˆμ„ λ•Œ Audio contextλ₯Ό μƒˆλ‘­κ²Œ ν˜•μ„±ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

    • ν•΄κ²° 방법

      기쑴에 κΈ°νšν•˜μ˜€λ˜ 방식(νŠΈλž™ μ„ νƒμ‹œ sample객체 λ‘œλ“œ)이 μ•„λ‹Œ 화면에 μ§„μž…ν–ˆμ„ λ•Œ λͺ¨λ“  sample 객체λ₯Ό λ‘œλ“œ ν›„ λ¦¬λ•μŠ€ μƒνƒœλ‘œ μ €μž₯. νŠΈλž™ μΆ”κ°€ μ‹œ μ„ νƒλœ 악기에 따라 μ €μž₯된 μŒμ› sample 객체λ₯Ό λ¦¬λ•μŠ€μ—μ„œ 가져와 μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ ꡬ쑰λ₯Ό λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.

      μ‹œλ„ν•œ ꡬ쑰 변경은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

      1. 곑 μ €μž₯ μ‹œ μŒμ› sample 객체 μ œμ™Έ, νŽΈμ§‘λœ λ§ˆλ”” μ •λ³΄λ§Œ 데이터 λ² μ΄μŠ€μ— μ €μž₯.
      2. 기쑴에 νŠΈλž™μ„ μΆ”κ°€ν•  λ•Œλ§ˆλ‹€ μ„ νƒλœ μ•…κΈ° μŒμ› sample 객체λ₯Ό λ‘œλ“œν•˜λŠ” κ΅¬μ‘°μ—μ„œ 곑 νŽΈμ§‘ 화면에 μ§„μž…ν–ˆμ„ λ•Œ λͺ¨λ“  μ•…κΈ° sample 객체λ₯Ό λ‘œλ“œν•˜μ—¬ Audio context둜 λ³€ν™˜ν•˜λŠ” ꡬ쑰둜 λ³€κ²½.
    • κ²°κ³Ό

      μœ„μ™€ 같은 λ³€κ²½μœΌλ‘œ 곑 νŽΈμ§‘ 화면에 μ§„μž…ν–ˆμ„ λ•Œ λ‘œλ”©μ— 1초 μ •λ„μ˜ μ‹œκ°„μ΄ μ†Œμš”λ˜μ—ˆμœΌλ‚˜ 기쑴에 νŠΈλž™μ„ μΆ”κ°€ν•  λ•Œλ§ˆλ‹€ μ•…κΈ° μŒμ› sample 객체λ₯Ό λ‘œλ“œν•˜κΈ° μœ„ν•΄ μ†Œμš”λ˜λ˜ μ‹œκ°„μ„ μ ˆκ°ν•  수 μžˆμ—ˆκ³  URL을 ν†΅ν•œ μ ‘κ·Ό 그리고 μƒˆλ‘œκ³ μΉ¨μ— λŒ€μ‘ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


  • μžλ™ μž¬μƒ

    • 문제

      이전 νŒ€ ν”„λ‘œμ νŠΈ λ•Œ λΈŒλΌμš°μ €λ³„λ‘œ κ΅¬ν˜„λ˜μ–΄μžˆλŠ” λ©”μ„œλ“œκ°€ 상이해 디버깅에 어렀움을 κ²ͺμ—ˆλ˜ κ²½ν—˜μ΄ μžˆμ–΄ Chrome λΈŒλΌμš°μ € 그리고 Opera λΈŒλΌμš°μ €λ₯Ό μ΄μš©ν•΄ κ°œλ°œμ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 그러던 쀑 Chrome λΈŒλΌμš°μ €μ—μ„œ μ €μž₯ν–ˆμ—ˆλ˜ 곑 νŽΈμ§‘ 화면에 μ§„μž…ν–ˆμ„ λ•Œ μž¬μƒλ˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

    • 원인

      μž¬μƒμ΄ λ˜μ§€ μ•Šμ•˜λ˜ μ΄μœ λŠ” Chrome λΈŒλΌμš°μ €μ—μ„œ 비ꡐ적 μ΅œκ·Όμ— κ°œμ •ν•œ Chrome 71 auto play policy λ•Œλ¬Έμ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ‚΄μš©μ€ μœ μ €μ˜ action(ex. click, key down)이 μ—†μœΌλ©΄ Audio Context의 μƒνƒœκ°€ suspended둜 μƒμ„±λ˜μ–΄ μžλ™ μž¬μƒμ΄ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

      λ‹Ήμ‹œ play button 클릭 이전 Audio Contextλ₯Ό μž¬μƒν•  수 μžˆλŠ” μƒνƒœλ‘œ λ³€κ²½ν•΄μ£ΌλŠ” 둜직이 μ—†λ‹€λŠ” 사싀을 νŒŒμ•…ν–ˆμŠ΅λ‹ˆλ‹€.

    • ν•΄κ²° 방법

      문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ•„λž˜μ™€ 같이 변경을 μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

      1. 곑 νŽΈμ§‘ 화면에 μœ μ €κ°€ μ§„μž…ν–ˆμ„ λ•Œ AudioContext의 state 확인.
      2. suspended일 경우 resume μƒνƒœλ‘œ λ³€κ²½ν•˜μ—¬ play button을 ν΄λ¦­ν–ˆμ„λ•Œ resume μƒνƒœλ‘œ μž¬μƒ
    • κ²°κ³Ό

      μœ„μ™€ 같은 λ³€κ²½μœΌλ‘œ Chrome λΈŒλΌμš°μ €μ—μ„œλ„ μ €μž₯된 곑을 λ°”λ‘œ μž¬μƒν•  수 μžˆλ„λ‘ λŒ€μ‘ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ‹€μ–‘ν•œ λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œ ν…ŒμŠ€νŠΈν•˜κ³  λŒ€μ‘ν•΄μ•Όν•œλ‹€λŠ” 점을 λ˜μƒˆκ²ΌμŠ΅λ‹ˆλ‹€.



ν”„λ‘œμ νŠΈλ₯Ό λ§ˆμΉ˜λ©΄μ„œ

  • κΈ°νšλΆ€ν„° κ°œλ°œκΉŒμ§€ 혼자 ν•΄μ•Ό ν•˜λŠ” 상황에 슀트레슀λ₯Ό λ°›κ³  개발 일정이 λ”λ””κ²Œ μ§„ν–‰λ˜λ©΄ μ΄ˆμ‘°ν•¨μ— 잠 λͺ» 듀기도 ν–ˆμŠ΅λ‹ˆλ‹€. 개인 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ νŒ€ ν”„λ‘œμ νŠΈμ™€ λ‹€λ₯΄κ²Œ λͺ¨λ“  문제λ₯Ό 슀슀둜 ν•΄κ²°ν•΄λ‚˜κ°€μ•Ό ν•œλ‹€λŠ” 점이 νž˜λ“€λ•Œλ„ 있고 λ™λ£Œλ“€κ³Ό ν•¨κ»˜ 문제λ₯Ό ν•΄κ²°ν•˜λ©΄μ„œ ν˜‘λ ₯ν•˜λ˜ λ•Œκ°€ 그립기도 ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ§λ©΄ν•œ λ¬Έμ œμ— λŒ€ν•΄ λ‹€μ–‘ν•œ κ΄€μ μœΌλ‘œ 접근해보렀 ν–ˆλ˜ κ²½ν—˜μ΄ 개인적 μ„±μž₯에 λ§Žμ€ 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • μ• μžμΌ μŠ€ν”„λ¦°νŠΈ 기간에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μž‘μ„±ν•˜μ§€ λͺ»ν•΄ μ•„μ‰½μŠ΅λ‹ˆλ‹€. μ§€μ†ν•΄μ„œ μœ λ‹›, λ¦¬λ•μŠ€ λ¦¬λ“€μ„œ 그리고 E2E ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•΄ μ•ˆμ •μ μΈ μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€ μ˜ˆμ •μž…λ‹ˆλ‹€.

About

Sound LAB - Think and make like a musician

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published