ADPCM 웨이브 파일 출력하기 |
| programming/sound 2002/09/16 23:39 |
게임을 만들다 보면 불어나는 리소스 크기로 애로사항이 자주 생기곤 합니다. 특히나 사운드 파일은 덩치도 크고, 압축도 거의 안되죠. 이런 문제는 ADPCM (Adaptive Differential Pulse Code Modulation ) 방식의 wav를 사용하는 것이 가장 무난한 해결 방법이라고 할 수 있겠습니다.
ADPCM 은 정확히 1/4로 압축하는 방식으로 인스톨된 게임의 용량은 물론 IO 억세스 타임도 1/4로 줄일 수 있습니다. (RAW PCM형태의 200메가 정도의 사운드 파일은 50메가로 줄어드는…)
ADPCM 원리는 간단하게 설명하자면, 두 샘플 간의 차이 값을 이용해서 다음 샘플의 간격을 조절해서 4비트로 줄이는 방식입니다. 실제로 저장된 데이터는 4비트로 16단계(부호1비트 + 레벨 3비트)이지만 이전 파형의 흐름에 따라 계산된 적절한 스케일을 곱해서 원래 파형에 근접하게 됩니다. 실제로 음파의 특성을 고려한 것이기 때문에 원음과 큰 차이 없는 소리를 만들어 냅니다. (단 샘플 레이트가 떨어질 경우에는 특성이 적게 나타나기 때문에 거친 잡음이 생기기도 합니다.)
ADPCM도 코덱에 따라 구현되는 방식이 다른 데, 가장 많이 쓰이는 코덱은 IMA (Intel) ADPCM 과 MS ADPCM 입니다. (사운드 포지(sound forge) 같은 툴을 사용하여 저장할 수 있습니다.) 개인적으로 저는 퀄리티도 괜찮고, 디코딩도 매우 빠른 IMA ADPCM 방식을 선호합니다. (셈플레이트도 22khz 면 무난한거 같네요.)
간단하게 IMA ADPCM 을 읽고 출력하는 샘플을 만들어서 같이 첨부합니다. 사운드 샘플을 읽는 루틴 외에는 적당히 줄였습니다. (사운드는 Les Claypool 아저씨의 음반에서 뽑았으며, 16bit 22Khz Mono IMA ADPCM으로 저장했습니다. 약 14초로 150KB 정도 됩니다.)
셈플의 ADPCM 디코딩 부분은 테이블 최적화를 된 상태라서, 디코딩을 딱 알아볼 수가 없습니다. 좀 살펴보시려면, 소스보다는 아래 링크의 셈플이나 리소스 페이지의 사운드란에 관련 페이지들을 참고하세요. (저는 아래 소스로 도움 많이 받았습니다.)
http://www.zip.com.au/~erikd/libsndfile/libsndfile-0.0.28.tar.gz
ps. 셈플이 signed 16비트 형에 맞춰져 있으니 Gp32 같은 unsigned 16 비트형을 사용하는 플렛폼에선 셈플에 +32768 을 하셔야 할겁니다.
adpcm.zip
댓글을 달아 주세요
많은 감사 우수한 위치! 나는 너의 웹사이트를 사랑한다!
많은 감사 우수한 위치! 나는 너의 웹사이트를 사랑한다!
너는 아름다운 웹사이트가 있는다!