27년 묵은 N64도 울게 만드는 초경량 음성 코덱
원제 Obscure audio codec is a perfect fit for the N64
115 포인트댓글 7
Key Point
27년 전 콘솔에서 현대 음성 압축 표준(Opus 수준) 품질을 CPU 부담 거의 없이 구현한 설계의 우아함과 실제 포팅 과정이 보여주는 하드웨어 제약 극복의 실례.
핵심 요약
- N64의 저장 공간과 CPU 제약을 극복하기 위해 개발된 ULC(Ultra Low Complexity Codec)라는 신규 음성 코덱이 완성되었다.
- N64는 PlayStation과 달리 카트리지 용량이 극도로 제한되어 있었고, Nintendo의 ADPCM은 4배 압축을 제공했지만 5분 스테레오 음악에 12MB가 필요했으며, MP3는 재생이 너무 무거워 배경 음악에 사용할 수 없었다.
- ULC는 MP3처럼 MDCT 변환을 사용하는 트랜스폼 코덱이지만 복잡한 대역 분할과 허프만 인코딩 없이 4비트 단위(니블) 간단한 구문으로 계수를 저장해, MP3의 핵심만 남기고 불필요한 복잡성을 제거했다.
- ULC는 노이즈 필 기능을 갖춰 심벌과 하이햇 같은 악기 소리를 효과적으로 인코딩하며, 16kbps에서도 사용 가능한 음질을 제공한다.
- N64의 극소 메모리(DMEM 4KB)로 인해 기본 2048샘플 블록을 처리하기 위해 16비트 고정소수점(Q1.14) 구현을 선택했고, 거의 들을 수 없는 수준의 노이즈 증가로 트레이드오프했다.
- RSP 코프로세서에서 IMDCT 변환을 수행하도록 포팅하는 과정에서 RSPL이라는 중간 언어를 거쳐 약 1400줄의 MIPS 어셈블리를 작성했으며, 초기에는 LLM의 도움을 받되 검증하며 단계적으로 진행했다.
- 최종 구현은 44100Hz 스테레오 음악 재생에 CPU 4%, RSP 5% 시간만 소비하며, 음질과 비트레이트는 Opus에 가깝지만 ADPCM 대비 4배의 복잡성만 필요하다.
- Libdragon 라이브러리에 투명하게 통합되었으며, Half-Life N64 포트는 2500개 사운드와 27곡의 음악을 64MB 카트리지에 담기 위해 ULC를 활용했다.