기타를 치면 바흐 스타일 화음이 실시간으로 따라온다?
음악과 프로그래밍의 접점에서 꽤 흥미로운 프로젝트가 하나 등장했어요. Contrapunk이라는 프로젝트인데요, 기타 입력을 실시간으로 분석해서 대위법(counterpoint) 스타일의 하모니를 자동으로 생성해주는 도구예요. 그리고 이걸 Rust로 만들었다는 게 기술적으로 눈길을 끄는 부분이에요.
대위법이 뭐냐면, 바흐 시대부터 내려오는 작곡 기법 중 하나인데요, 하나의 멜로디에 대해 독립적인 다른 멜로디 라인을 규칙에 맞게 쌓아 올리는 거예요. 그냥 코드(화음)를 깔아주는 것과는 달라요. 각 성부(voice)가 자기만의 멜로디를 가지면서도 동시에 들으면 조화롭게 어울리는, 꽤 복잡한 음악 이론이 뒤에 깔려 있거든요.
실시간 오디오 처리, 왜 Rust인가
이 프로젝트에서 기술적으로 가장 핵심적인 도전은 레이턴시(지연 시간)예요. 기타를 치는 순간 화음이 나와야 하는데, 여기서 수십 밀리초만 늦어져도 연주자 입장에서는 "따로 노는 느낌"이 나거든요. 사람이 음악적 지연을 인지하는 임계값이 대략 10~20ms 정도라고 알려져 있어요.
그래서 Rust가 좋은 선택이 되는 거예요. Rust는 가비지 컬렉터(GC)가 없어요. Java나 Go 같은 언어는 GC가 돌아갈 때 순간적으로 프로그램이 멈추는 현상(stop-the-world)이 생길 수 있는데, 실시간 오디오 처리에서는 이게 치명적이에요. 소리가 뚝뚝 끊기거나 노이즈가 생기거든요. Rust는 메모리를 컴파일 타임에 관리하기 때문에 런타임에 예측 불가능한 멈춤이 없어요. 이게 오디오 DSP(Digital Signal Processing) 분야에서 Rust가 주목받는 가장 큰 이유예요.
실시간 오디오 처리의 파이프라인을 간단히 설명하면 이래요. 먼저 기타 신호가 오디오 인터페이스를 통해 들어오면, 피치 디텍션(pitch detection) 알고리즘으로 지금 어떤 음을 치고 있는지 파악해요. 이게 뭐냐면, 소리의 파형을 분석해서 주파수를 알아내는 건데요, 기타처럼 배음(overtone)이 복잡한 악기에서는 이게 꽤 까다로운 문제예요. 그 다음, 인식된 음을 기반으로 대위법 규칙 엔진이 돌아가면서 적절한 하모니 성부를 계산하고, 그 결과를 오디오로 합성해서 출력하는 거죠. 이 모든 과정이 오디오 버퍼 하나 분량(보통 128~512 샘플, 수 밀리초) 안에 끝나야 해요.
대위법 규칙을 코드로 옮기는 건 어떤 느낌일까
대위법에는 꽤 엄격한 규칙들이 있어요. 예를 들어, 두 성부가 동시에 같은 방향으로 완전 5도나 옥타브로 진행하면 안 된다든지(병행 5도/8도 금지), 성부 간의 간격이 너무 벌어지면 안 된다든지 하는 것들이요. 이런 규칙들을 프로그래밍적으로 구현한다는 건, 일종의 제약 조건 만족 문제(constraint satisfaction problem)를 실시간으로 푸는 것과 비슷해요.
재미있는 건, 이런 음악 이론적 규칙이 결국 수학적으로 표현 가능한 패턴이라는 점이에요. 음정 간의 관계는 숫자로 나타낼 수 있고, 금지되는 진행은 조건문으로 걸러낼 수 있고, 가능한 후보 음 중에서 가장 "음악적인" 선택을 하는 건 일종의 스코어링 함수로 구현할 수 있어요. 머신러닝 없이도 규칙 기반으로 꽤 음악적인 결과를 만들어낼 수 있다는 게 이 프로젝트의 접근 방식이에요.
오디오 프로그래밍 생태계에서의 Rust 위치
오디오 프로그래밍 영역에서 Rust는 최근 몇 년간 존재감이 꽤 커지고 있어요. 기존에 이 분야는 C/C++가 거의 독점하고 있었거든요. JUCE(C++ 오디오 프레임워크)가 업계 표준이었고, 대부분의 DAW 플러그인이 C++로 작성되어 있었어요.
하지만 Rust 쪽에서도 생태계가 하나둘 갖춰지고 있어요. cpal은 크로스 플랫폼 오디오 I/O 라이브러리이고, dasp는 디지털 오디오 시그널 처리를 위한 크레이트예요. nih-plug 같은 프레임워크를 쓰면 Rust로 VST3/CLAP 플러그인도 만들 수 있고요. Contrapunk 같은 프로젝트가 나올 수 있는 토양이 이미 어느 정도 마련되어 있는 셈이에요.
비슷한 맥락에서, Spotify의 오디오 처리 파이프라인 일부가 Rust로 작성되어 있다는 건 잘 알려진 사실이고, 최근에는 오디오 플러그인 포맷인 CLAP의 레퍼런스 구현에도 Rust가 활용되고 있어요.
한국 개발자에게 주는 시사점
Rust를 배우고 싶은데 뭘 만들어볼지 고민하는 분들에게 오디오 프로그래밍은 꽤 좋은 도메인이에요. 일단 결과물이 눈에(정확히는 귀에) 바로 들리니까 피드백 루프가 빠르고, 실시간 처리라는 제약 조건 때문에 Rust의 장점을 제대로 체감할 수 있거든요. GC가 없다는 게 왜 중요한지, 제로 코스트 추상화가 실전에서 어떤 의미인지를 몸으로 느낄 수 있는 분야예요.
또 하나 주목할 점은, 음악 + 코딩의 교차 영역이 점점 더 재미있어지고 있다는 거예요. AI 작곡 도구들이 쏟아지는 요즘, 이렇게 전통적인 음악 이론을 규칙 기반으로 구현하는 접근은 또 다른 가치가 있어요. LLM이 확률적으로 그럴듯한 결과를 내놓는 것과 달리, 대위법 규칙 엔진은 왜 그 음이 선택되었는지 완벽하게 설명 가능하거든요. 설명 가능한 음악 생성이라는 관점에서 볼 때 의미 있는 접근이에요.
정리하면
Contrapunk는 "Rust + 실시간 오디오 + 음악 이론"이라는 세 가지 축이 만나는 지점에 있는 프로젝트예요. 기술적으로 완전히 새로운 건 아니지만, 이 조합 자체가 Rust의 강점을 잘 보여주는 사례라 배울 점이 있어요.
혹시 여러분 중에 Rust로 오디오나 미디어 관련 프로젝트를 해보신 분 계신가요? 아니면 음악 이론을 코드로 옮겨본 경험이 있으신 분? 어떤 도전이 있었는지 궁금하네요.
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공