2021년 7월 15일 목요일

MoonBase 제작 #3 - OPLL 용 PCM Drum




음... 기억하시는 분이 있으려나요?

21년전ㅋ paraMSX 0.13 버전에서 FM 사운드가 처음으로 들어갔는데요.

그시절엔 OPLL 사운드를 합성하는 방법을 몰라서, 적당한 PCM으로 걍 때려넣었습니다.

FM 사운드가 이상하다는 피드백이 난무했었지요...ㅎ.ㅎ


갑자기 이 얘기를 왜 했냐면요~

그 때 넣었던 FM Drum을 이번에 또 만들었거든요ㅋ


MSX-AUDIO, OPL4 모두 훌륭한 사운드를 만들어내지만,

대부분 게임에서는 MSX-MUSIC (OPLL)을 활용합니다.

이런 경우는 MoonBase랑 MoonSound를 합체해봐야 전기만 먹을뿐이겠죠? ㅎ.ㅎ


그.래.서.

MoonBase의 동작 모드를 하나 더 추가했습니다.

OPLL에 어울리는 드럼 사운드를 만들어내는거죠. PCM으로요!


근데 FM 사운드에 PCM 드럼을 섞는게, 이미 오래전부터 익숙하실겁니다요.

YM2608, YM2610 같은 칩의 음악을 많이 들어보셨을꺼에요.

MoonBase는 내장된 PCM음원으로 드럼 소리를 만드는거니까,

구조적으로는 YM2608쪽에 더 가깝겠네요.


MoonBase의 드럼 샘플은 44.1KHz 8BIT MONO PCM으로 들어갑니다.

본체의 OPLL 사운드와 드럼 사운드가 적당히 밸런스가 맞아야 듣기 좋으니까,

드럼 출력레벨을 8단계로 조절할 수 있도록 해놨습니다.

제 GT 기준으로 레벨4가 적당한 출력이 되도록 레벨 테이블을 만들었습니다.

쓰시는 FM내장 기종 또는 외장 FMPAC에 맞도록 조절하시면 되겠네요.


MoonBase의 왼쪽에는 3단 스위치가 있습니다.

이걸로 BIOS 또는 ADPCM / PCM 드럼 선택이 가능합니다.

자세한건 다음번에서 소개해드리겠구요.

이번엔 PCM 드럼 소리만 영상으로 감상하시죠.


영상에서는 OPLL 사운드를 쓰는 오리지널 Fire Hawk 버전과

Audio BIOS 1.3을 지원하도록 패치된 Fire Hawk 버전을 함께 사용했습니다.

영상 데모는 아래순으로 진행됩니다.

1. OPLL 사운드

2. Audio BIOS 1.3 OPL3 사운드

3. OPLL + PCM Drum 사운드

4. 외부 믹서 조절






그럼, 다음편에서 뵈어요~ ㅎ.ㅎ


2021년 7월 10일 토요일

MoonBase 제작 #2 - MoonSound와 합체

테스트 용 PCB가 나왔네요~ ㅎ.ㅎ




S/W 입장에서 본 MoonBase 카트리지는 기본적으로 MSX-AUDIO 호환입니다.

Y8950 칩 대신,

- 외부 OPL4 카트리지에서 Sec.FM 파트를 가져오고

- MoonBase에서 ADPCM-B 파트를 구현해서

합체합니다.


MSX-AUDIO의 I/O 포트는 C0H 및 C1H 주소를 사용하는데요.

MoonBase도 동일한 주소를 제공합니다.

만약 컨트롤 레지스터 번호가 20H ~ FFH 영역(FM 파트)이 되면,

외부 슬롯 커넥터쪽의 C6H, C7H 포트로 컨트롤이 전달됩니다.

결국 외부 OPL4 카트리지의 Sec.FM 파트가 동작하게 되는거겠지요.


실제 사용 시, 아래처럼 MoonBase 위에 OPL4 카트리지를 장착합니다.

OPL4의 오디오 출력을 MoonBase로 입력하면 ADPCM과 믹스되어 최종출력됩니다.

오디오 밸런스는 문사운드 카트리지를 기준으로 되어있구요.





MSX-AUDIO 파트는 더 이상 설명이 필요없겠네요.

그냥 영상으로 보시죠~ ㅎ.ㅎ


세가지 뮤직/데모 디스크를 구동하는 모습입니다.

먼저 MSX-AUDIO 전용인 Muzax3, Impact4의 영상이 나오고,

마지막으로 MSX-AUDIO과 MSX-MUSIC을 함께 쓰는 Unknown Reality의 영상이 나옵니다.





그럼, 다음편에서 뵈어요~ ㅎ.ㅎ


2021년 6월 25일 금요일

MoonBase 제작 #1 - 달기지 건설

작년에 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(달기지) 카트리지와 합체하세요.



그럼, 오늘은 여기까지이구요. 다음편에서 또 이어지겠습니다~