작년에 T-Wave를 만들었는데, 이번엔 조금 다른 사운드 카트리지를 만들어봅니다.
카트리지 이름은 'MoonBase'로 지었습니다. 우리말로 하면 '달기지' 정도?ㅋ
[서론]
PSG, PPI 1BIT 사운드는 MSX1부터 기본으로 들어간 사운드인데요.
그 후 MSX-AUDIO, MSX-MUSIC가 표준기기로 추가되었습니다.
나중에 90년대에 선라이즈가 OPL4 칩을 이용한 MoonSound 카트리지가 등장했구요.
근데 MSX-MUSIC 경우는 본체에 내장된 기종이 나올 정도로 보편화되었지만,
MSX-AUDIO는 사용자가 많지 않았습니다.
나중에 나온 저가형 MSX-MUSIC에 완전히 밀려버렸지요 ㅎ.ㅎ
MSX-AUDIO는 기본 OPL 사운드에 4BIT ADPCM 입출력, 뮤지컬 키보드, 미디 입출력까지 들어간...
좀 후덜덜한 외장 기기였습니다.
ADPCM 샘플 메모리는 기본 32KB가 내장이고, 최대 256KB로 증설가능합니다.
당시 많은 MSX1 기종의 메인램이 32KB였던걸 고려하면, ADPCM 기능 하나만으로도 좀 오버스펙이었습니다요~
필립스의 MSX-AUDIO인 MusicModule 카트리지에는 8BIT PCM 사운드도 추가되어있었구요.
유럽쪽은 뮤직모듈이 흔해서 그랬던걸까요? 유저들이 만든 MSX-AUDIO 용 뮤직 디스크가 꽤 있습니다.
물론 Unknown Reality 같은 유명한 데모에서도 ADPCM을 들을 수 있죠.
"Jump Jump~" 목소리가 나오는 데모는 샘플램이 256KB가 아니면 플레이 안되고 스킵됩니다 ㅎ.ㅎ
이거 들으려고 뮤직모듈을 사자마자 뜯어서 램 추가했었지요~
그 후 문사운드를 구해서 IMS, MOD 등을 주로 듣다보니, MSX-ADUIO쪽은 좀 멀어지긴했네요.
물론 MPX로 MP3를 듣는 시간도 꽤 늘었구요.
.
.
.
그렇게 수년이 흘렀습니다.
2016년 정모때였나요? 준소프트님이랑 잠깐 얘기나눴던 기억이 나네요.
그게 "ADPCM을 추가해서 만드실 계획은 없나요?"였죠.
문사운드의 OPL4는 기본적으로 OPL, OPL2, OPL3 하위 호환이 됩니다.
MSX-AUDIO의 Y8950 칩은 OPL에 ADPCM과 GPIO가 추가되어있는데요.
OPL4에 ADPCM을 추가하게 되면, 굳이 두개 카트리지를 꽂을 필요없이 하나면 충분하겠죠?
구하기 힘든 MSX-AUDIO 보다는 OPL4를 확장하는게 더 쉬우니까요.
이제 2021년입니다.
그렇게 목마른 사람이 우물을 파는 해가 되었습니다 ㅎ.ㅎ
[본론]
MoonBase의 기본(최소) 기능은 Y8950의 4BIT ADPCM 출력입니다.
(그 외의 부가기능은 다음편에서 알려드리겠습니다요)
야마하 사운드칩에서 흔하게 보이는 ADPCM은 두종류가 있는데요. ADPCM-A, ADPCM-B이죠.
Y8950에 들어간 놈은 ADPCM-B입니다.
최대 16KHz 출력이 가능하구요.
샘플램 256KB를 다 채우면, 16KHz 샘플을 32초 동안 플레이가능합니다.
8KHz 정도의 낮은 음질이라면 64초를 버틸 수 있겠네요.
기본 환경은 ADPCM을 문사운드의 OPL4와 조합해서 MSX-AUDIO + OPL2 환경으로 만들어주는겁니다.
OPL4를 Full로 사용하는 S/W는 MSX-AUDIO의 OPL를 함께 쓸 확률이 없으니,
이렇게 조합하면 여러가지로 활용이 가능하겠죠?
MSX-AUDIO는 최대 두개의 카트리지를 쓸 수 있습니다.
Primary는 C0H, C1H 포트를 사용하고
Secondary는 C2H, C3H 포트를 사용합니다.
문사운드(OPL4)의 FM 사운드(OPL3)는 Main C4H, C5H 포트와 Sub C6H, C7H 포트를 사용합니다.
야마하가 OPL 하위 호환을 위해 이렇게 일부러 이렇게 만들어놨어요.
칩 매뉴얼 보시면 Main/Sub의 FM 레지스터(20H ~ FFH)가 동일하게 되어있습니다.
그러니까 OPL2의 FM 사운드를 두개 넣었다고 보시면 무방합니다.
(레지스터 00H ~ 1FH 사이는 칩별로 조금씩 차이가 있어요.)
그러면, 달기지에서 C0H, C1H 포트로 레지스터 00H ~ 1FH를 구현하고,
FM 레지스터는 문사운드의 C6H, C7H 포트로 쓰도록 해주면??
두개를 잘 활용할 수 있겠죠?
이걸 수식으로 적어보면요 ㅋ
OPL4 = OPL3 + Wave
OPL4 = OPL2 + OPL2 + Wave
OPL4 + MoonBase = OPL2 + (OPL2 + MoonBase) + Wave
OPL4 + MoonBase = OPL2 + Y8950 + Wave
이렇게 되겠습니다.
왜 이 짓(?)을 하는지 이해가 안되시면, 위의 [서론]을 다시 읽어보세요ㅋㅋ
마음 같아서는 MoonBase에 OPL4를 때려넣고 싶지만,
이미 OPL4 호환기기가 워낙 많기도 하고...
OPL4 관련 칩들을 구하는것도 쉽지않고... 뭐 그렇습니다.
(흐... 제가 쓰는 뮤직모듈은 카트리지가 두꺼워서, 확장슬롯에 꽂아두기가 좀 힘듭니다.
이것도 사실 좀 문제였어요.)
그럼, ADPCM 부터 구현해보아요~
로직을 VHDL로 다 때우면 CPLD 용량을 많이 잡아먹으니, 최대한 외부 플래쉬롬을 활용해서 구현합니다.
일단 기본적인 컨트롤 레지스터와 샘플 메모리 R/W 및 ADPCM 디코딩, PCM 출력부분을 넣었습니다.
타이머 2개와 인터럽트는 미완인데, 대부분 뮤직 디스크들은 구동이 되네요. 타이머를 안쓰나봐요.
아래 영상은 실제로 구동한 모습입니다.
테스트를 위해, "GT 본체 + V4 + MoonBase" 딱 요렇게만 환경을 구성했어요.
영상에서는 MSX-AUDIO 전용인 Impact4 뮤직 디스크가 실행됩니다.
처음부터 끝까지 자동재생이라 테스트하기 좋군요.
전체 재생시간이 30분을 넘어가니까, 대충 돌려보세요 ㅎ.ㅎ
FM으로는 만들기 힘든 드럼, 박수, 목소리를 ADPCM으로 어떻게 활용하는지 쉽게 확인가능합니다.
(주의: 영상에서는 OPL 사운드 없이 ADPCM만 나옵니다!)
[요약]
OPL4 카트리지를 MSX-AUDIO 처럼 활용하려면?
-> MoonBase(달기지) 카트리지와 합체하세요.
그럼, 오늘은 여기까지이구요. 다음편에서 또 이어지겠습니다~