이번엔 배경음악 테스트입니다~
제 실력에 원본 곡을 귀로 듣고 음악 만드는 건 불가능하니,
이번에도 MAME의 힘을 빌렸습니다. ㅋ
원본 ASO는 사운드 출력을 위해 YM3526 칩을 쓰고 있습니다.
YM3526이 뭐냐고요? 일명 OPL 이라고 불리는 FM 칩이지요.
참고로 MSX에서는
MSX-AUDIO(필립스 뮤직모듈 포함)와 MoonSound, 달소리 등의 카트리지에 OPL 호환칩이 들어있습니다.
ASO의 YM3526 은 메인 클럭이 4MHz 이고, MSX 쪽의 MoonSound 등은 3.58MHz라서
MSX에서 재생하면 소리가 좀 낮은 음이 나올걸로 예상됩니다요...
MAME의 YM3526 에뮬 소스를 약간 손봐서(!), 먼저 OPL 레지스터 write 하는 부분을 덤프해봤습니다.
사실 덤프된 데이터 만으로는 똑같이 재생할 수는 없는데요.
실제 ASO의 사운드 루틴에서는 어떻게 타이밍을 처리하고 있을까?
일단 두 가지 가정을 해봤습니다.
1. 타이밍을 맞추기 위해, 외부 타이머 또는 비디오 sync 등의 인터럽트를 썼다면,
음악 데이터는 크기가 작기 때문에, 데이터 write 후 어느정도 대기 시간이 보여야 된다.
MAME의 모든 사운드 에뮬에서는 최종 PCM 출력을 얻기위한 콜백 함수가 있습니다.
이 때 얻어지는 샘플 갯수를 보면, 실제 시간을 반대로 계산 할수가 있습지요.
2. 만약 YM3526 내의 타이머를 인터럽트로 활용했다면, 이건 왕재수 상황 ㅎ.ㅎㅋ
FLAG 레지스터 read/write 를 보면, 인터럽트 주기를 파악할수 있는 것이죠.
그럼, 결론은?
실제로는 2번이었습니다. (사실 이쪽을 기대했었어요. ㅋ)
FLAG 레지스터의 IRQ 리셋 하는 것을 체크하면, 타이밍이 눈에 보입니다.
배경음악 출력이라면, 타이머 주기를 바꿀 것 같지는 않고,
아마도 60Hz 등 일정한 속도로 처리하지 않을까 생각했던 것이지요.
아래는 제가 덤프해서 가공한 데이터입니다.
컬럼 두개가 보이는데, 왼쪽은 레지스터 번호, 오른쪽은 데이터입니다. (모두 write 하는 부분)
0x04번 레지스터에 0x80을 write하면, IRQ 리셋이지요.
요걸 기준으로 MoonSound에 데이터를 출력해서, 음악이 나오는지 확인해봤습니다.
결과는 아래 동영상으로 확인하셔요~ ㅎ.ㅎ
위의 동영상 보시면, 처음 예상과는 달리 타이머 주기가 고정된게 아닌걸 알수 있습니다.
게임 처음 시작하면, 기지에서 슈웅~ 하고 출격하는 장면이 나오는데,
이때는 타이머가 좀 빠르게 세팅된것 같더군요.
그 후, 메인 테마가 나올때는 30Hz 로 속도가 고정됩니다.
위의 ASO_BGM 프로그램에서는 그냥 처음부터 쭈욱 30Hz 로 동기 맞춰서 출력하고 있고요.
데이터를 잘 분석하면,
배경 음악과 총알, 폭파음 등의 효과음 채널도 분리할수 있을 듯 하네요. ㅎ.ㅎㅋ