브라우저에서 TB-303을 '밑바닥부터' 구현하기: 완벽한 에뮬레이션과 엔지니어링의 착각
칼 세이건은 “애플파이를 밑바닥부터(from scratch) 만들려면, 먼저 우주를 창조해야 한다”고 했습니다. 소프트웨어 엔지니어링의 세계에서도 마찬가지입니다. 우리는 항상 거인들의 어깨 위에 서서 코드를 작성하죠. 최근 해커뉴스(Hacker News)에서 흥미로운 논쟁을 촉발한 글을 하나 읽었습니다. 바로 Loopmaster라는 웹 기반 라이브 코딩 환경에서 전설적인 신디사이저인 Roland TB-303을 ‘밑바닥부터’ 구현했다는 튜토리얼이었습니다.
15년 넘게 백엔드 시스템과 인프라를 설계해 온 엔지니어의 관점에서, 그리고 오래된 하드웨어 긱(Geek)으로서 이 프로젝트와 이를 둘러싼 HN 커뮤니티의 반응은 현대 소프트웨어 개발의 몇 가지 핵심적인 모순을 정확히 찌르고 있었습니다. 오늘은 브라우저 기반의 오디오 에뮬레이션이 가지는 기술적 한계, 그리고 완벽한 시스템이 오히려 결함을 가진 레거시를 이기지 못하는 아이러니에 대해 이야기해 보겠습니다.
‘From Scratch’라는 단어의 무게
해커뉴스의 한 유저가 남긴 뼈 있는 농담이 이 프로젝트의 본질을 잘 보여줍니다.
“언어 자체에 diodeLadder() 같은 프리미티브(primitive)가 내장되어 있는데, 대체 얼마나 ‘밑바닥부터’ 만들었다는 건가요? :)”
솔직히 말해서 저도 글을 읽으며 같은 생각을 했습니다. 진정한 의미의 ‘빌드’라기보다는 기존에 잘 추상화된 오디오 라이브러리를 조립하는 ‘시뮬레이션’에 가깝습니다. 하지만 그렇다고 해서 이 웹 앱이 가치가 없다는 뜻은 아닙니다. 브라우저 환경에서 이 정도 수준의 오디오 엔진을 구현하는 것은 생각보다 훨씬 까다롭습니다. WebAudio API와 WASM을 활용해 실시간으로 오디오 버퍼를 처리하면서 가비지 컬렉션(GC)으로 인한 오디오 드롭아웃을 방지하는 것은 꽤나 고통스러운 엔지니어링 과제이기 때문입니다. 누군가의 말처럼 “의미 없는 AI 생성 쓰레기(AI slop)“가 넘쳐나는 요즘, 브라우저 위에서 돌아가는 SuperCollider 같은 환경을 직접 구축했다는 점은 충분히 박수받을 만합니다.
결함이 만들어내는 완벽함: Roland Sync와 레이턴시
제가 이 스레드에서 가장 흥미롭게 읽은 대목은 TB-303의 하드웨어적 ‘결함’에 대한 이야기였습니다. 80년대 일렉트로닉 음악의 뼈대를 만든 것은 아이러니하게도 시스템의 불완전성이었습니다.
당시 여러 대의 TB-303과 TR-909를 5핀 DIN 케이블(Roland Sync)로 연결해 동기화했는데, 이 동기화 프로토콜의 구현은 사실상 엉망이었습니다. 기기 간에 지연(Latency)이 발생했고 타이밍이 미세하게 어긋났죠. 하지만 분산 시스템 엔지니어라면 기겁할 이 ‘네트워크 지연’이, 음악적으로는 기기들의 오차가 겹겹이 쌓이면서 기계가 흉내 낼 수 없는 완벽한 ‘그루브(Groove)‘를 만들어냈습니다.
현대의 디지털 에뮬레이션이 가장 고전하는 부분이 바로 이 지점입니다. 우리는 클럭을 마이크로초 단위로 정확하게 맞추는 데는 도가 터 있지만, 아날로그 회로의 온도 변화에 따른 불안정성이나 D650 CPU의 기괴한 타이밍, 그리고 불완전한 프로토콜이 만들어내는 유기적인 지터(Jitter)를 수학적으로 모델링하는 것은 완전히 다른 차원의 문제입니다. 완벽한 코드가 오히려 가장 부자연스러운 결과를 낳는 셈입니다.
Jeskola Buzz: 모든 시니어 엔지니어의 악몽
스레드 후반부는 자연스럽게 과거의 명기들에 대한 향수로 이어졌고, 그중에는 Jeskola Buzz에 대한 끔찍한 괴담(?)도 포함되어 있었습니다.
2000년 10월, Buzz의 개발자가 하드 드라이브 고장으로 소스 코드를 통째로 날려먹으면서 개발이 영구 중단된 사건입니다. 당시 그는 코드를 누구와도 공유하지 않았고, 백업도 없었으며, 원격 SVN 서버조차 사용하지 않았다고 합니다. 결국 하드 드라이브 복구 업체를 부르기 위해 커뮤니티가 크라우드 펀딩까지 열어야 했죠.
우리는 지금 Git과 분산 환경, CI/CD 파이프라인이 당연한 시대에 살고 있어서 이 이야기를 들으며 헛웃음을 지을지 모릅니다. 하지만 가슴에 손을 얹고 생각해 봅시다. 당신의 회사 인프라 어딘가에, 퇴사한 개발자가 남겨두고 간 문서화되지 않은 ‘수동 클릭(Click-ops)’ 기반의 클라우드 리소스나, 백업 스크립트가 조용히 실패하고 있는 레거시 DB가 단 하나도 없다고 자신할 수 있습니까? 형태만 바뀌었을 뿐, Jeskola Buzz의 비극은 지금도 매일 AWS와 GCP 어딘가에서 일어나고 있습니다.
결론: 에뮬레이션은 하드웨어를 대체할 수 있는가?
다시 Loopmaster의 TB-303으로 돌아와 보겠습니다. 이 소프트웨어가 오리지널 303의 소리를 완벽히 재현하느냐 묻는다면, 대답은 ‘아니오’입니다. 한 유저의 지적처럼 Accent multiplier 값을 0.5에서 0.1로 극한까지 튜닝해야 그나마 비슷한 뉘앙스가 나옵니다. 진정한 아날로그의 질감을 원한다면 RE-303이나 QS-303 같은 물리적 하드웨어 복각판을 구하거나, 차라리 구형 iMac에 QEMU를 돌려 Rebirth를 설치하는 것이 나을 수도 있습니다.
하지만 이 프로젝트의 진정한 가치는 완벽한 복제에 있지 않습니다. 복잡한 아날로그 신호 처리 로직(Diode Ladder Filter 등)을 웹 브라우저라는 접근성 높은 플랫폼으로 끌어와, 누구나 코드로 소리를 실험할 수 있는 환경을 제공했다는 데 있습니다.
엔지니어로서 우리는 때로 ‘완벽한 아키텍처’나 ‘100% 동일한 에뮬레이션’이라는 환상에 집착합니다. 하지만 TB-303의 역사가 증명하듯, 때로는 시스템의 결함과 타협 속에서 가장 창의적인 결과물이 탄생하기도 합니다. 다만, 그 창의적인 결과물을 담은 소스 코드는 제발 원격 저장소에 백업해 두시길 바랍니다.
References
- Original Article: https://loopmaster.xyz/tutorials/tb303-from-scratch
- Hacker News Thread: https://news.ycombinator.com/item?id=47291574
- Sonic Potions RE-303: https://www.sonic-potions.com/re303