C.W.K.
Stream
Lesson 03 of 04 · published

parts library 로서의 MIR (Demucs)

~13 min · mir, demucs, stem-separation, parts-library

Level 0식은 재
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"librosa, madmom, Demucs — 서랍 속 부품이지, 그 안에 사는 틀이 아냐."

framework 아니라 부품

Tier A 는 성숙한 오픈소스 음악정보검색(MIR)이 돌려: 템포/비트/코드/키엔 librosamadmom, 잡다한 특징엔 essentia, stem 분리엔 Demucs, pitch 엔 basic-pitch. 중요한 규율은 Bonfire 가 이걸 어떻게 쓰느냐야: parts library 로, Bonfire 자기 인터페이스 뒤로 감싸 — 절대 엔진이 그 안에 지어지는 framework 로가 아니라. 엔진은 Demucs 가 아니라 Bonfire 의 StemSeparator 에 의존해. 내년에 Demucs 를 더 나은 걸로 갈아끼워도 엔진은 눈치 못 채. 정확히 Ember 가 diffusers 한테 갖는 규율이야: 인터페이스를 소유하고, 구현을 빌려.

스포트라이트 Demucs: stem 분리

Demucs 는 완성된 믹스를 stem 으로 쪼개 — 드럼, 베이스, 보컬, 그리고 'other'(기타와 건반이 보통 여기 떨어져). 학습 도구한텐 그 능력 하나가 놀랄 만큼 값져:

  • 배우는 걸 isolate. 베이스 라인 배워? 베이스 stem 만 solo 하면 나머진 빠져.
  • 대체할 파트를 mute 하고 나머지 위에서 연주. 이게 backing-track 수야 — 원곡 리드를 죽이고, 드럼+베이스+코드를 남기고, 네 단순화 버전을 위에 얹어 쳐. (v1 믹서의 original / solo / chord 채널이 정확히 이걸 위한 거야.)
  • stem 별 더 깨끗한 분석. 빽빽한 풀 믹스보다 isolate 된 악기에서 코드·pitch 감지가 훨씬 정확해 — 그래서 stem 이 더 나은 Tier-A 결과를 모델로 되먹여.

무거워서, 백엔드에 살아

stem 분리는 GPU 를 굶주려. Demucs 는 office/server 하드웨어(Apple Silicon, MPS, 512 GB M3 Ultra)의 Python 백엔드에서 돌아, 절대 브라우저에서 안 돌아. 의도된 배치야: 클라이언트는 가볍게 두고 무거운 짐은 실리콘이 있는 데서 들어. (MIR 레이어는 Stage 2 일 — 엔진 골격과 UI 가 먼저 출하됐고; 이건 분석 레이어가 지어지는 설계지, 오늘 모든 라이브러리가 배선됐다는 주장이 아냐.)

Code

Demucs 는 감싼 부품, 너를 소유하는 의존성이 아냐·python
class StemSeparator:
    """Demucs 를 감싸. 엔진은 Demucs 가 아니라 THIS 인터페이스에 의존.
    나중에 구현을 갈아끼워도 위쪽은 아무것도 안 변해."""

    def separate(self, audio: AudioBuffer) -> dict[str, AudioBuffer]:
        # 무거움: 백엔드 MPS(M3 Ultra)에서 돌아, 브라우저 절대 아님.
        return demucs_apply(audio)   # -> {drums, bass, vocals, other}

# stem 이 easy-mode 한테 사주는 것:
#   isolate("bass")                 -> 악기 하나만 따로 공부
#   mute("vocals"); keep(rest)      -> 위에서 칠 backing track
#   analyze(stems["other"])         -> 더 깨끗한 코드/pitch 감지
#
# 엔진은 StemSeparator 를 알아. Demucs 는 모르고.

External links

Exercise

많이 의존하는 라이브러리 하나를 골라. 내년에 위쪽을 안 건드리고 그 라이브러리를 갈아끼우고 싶을 때 네 코드가 부를 얇은 인터페이스를 써 봐. 그 인터페이스를 몇 줄로 못 쓰겠으면, 아마 라이브러리 안에 framework 로 지어진 거야 — 부품으로 쓰는 게 아니라.
Hint
테스트: 같은 인터페이스 뒤에서 라이브러리를 완전히 다른 걸로 바꿔도 호출자가 0 개 바뀌나? 그렇다면 부품이야. 호출자가 곳곳에서 라이브러리 자기 타입과 관용구로 들어가면, 네가 그 안에 사는 framework 야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 피파warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.