YM2612 の細かい話に入る前に、FM音源そのものの考え方を見るには Yamaha の説明がわかりやすいです。
YM2612 は Yamaha が開発した sound chip です。 Sega Mega Drive / Genesis で使われました。
この chip には次のような機能があります。
http://www.chipdir.nl/pinusr/ym2612.txt
+--()--+
GND | 1 24| 0M(CLK)
D0 | 2 23| Vcc
D1 | 3 22| A.Vcc
D2 | 4 21| MOL
D3 | 5 20| MOR
D4 | 6 19| A.GND
D5 | 7 18| A1
D6 | 8 17| A0
D7 | 9 16| /RD
? |10 15| /WR
/IC |11 14| /CS
GND |12 13| /IRQ
+------+
GND: デジタル側の groundA.GND: 音声出力まわりのアナログ側 groundVcc: デジタル側の電源A.Vcc: 音声出力まわりのアナログ側電源0M (CLK): マスタークロック入力
MOL: 左音声出力ピンMOR: 右音声出力ピン
D0-D7: 8-bit 双方向データバスA0: アドレス選択ピンA1: アドレス選択ピン
/RD: 読み取り信号 active low/WR: 書き込み信号 active low/CS: チップ選択信号 active low/IRQ: 割り込み要求信号 active low/IC: リセット信号 active low
Pin 10: 通常用途では未使用
資料によっては NC、別資料では TEST ピンとされています。PCM / DAC の前に、まずは YM2612 がどうやって FM の音を作るかを見ると理解しやすいです。
基本の考え方は次の通りです。
DT MULTI TL AR D1R D2R SL RR などの値で、各 operator の音の性格を決めるまずは次のページを見ると流れを掴みやすいです。
operator1.html
1 つの operator のパラメータを変えた時に、どんな変化が出るかを見るページです。operator2.html
2 つの operator を組み合わせて、変調や algorithm の違いを試すページです。YM2612 synth demo
複数 operator / 複数 channel を組み合わせて、もう少し複雑な音作りを試せる demo です。A0 と A1 は、どの制御ポートにアクセスするかを選びます。
address/data の切り替えと、port 0 / port 1 の切り替えに使います。
A1=0, A0=0: address port 0A1=0, A0=1: data port 0A1=1, A0=0: address port 1A1=1, A0=1: data port 1chip.write() と YM2612 のピンの対応void ym2612::write(uint32_t offset, uint8_t data) は、YM2612 のアクセス方法を単純化したものです。
offset: A1 と A0 で選ばれるアクセス先に対応data: D0-D7 に乗る 8-bit の値に対応対応表:
offset = 0: A1=0, A0=0 -> address port 0offset = 1: A1=0, A0=1 -> data port 0offset = 2: A1=1, A0=0 -> address port 1offset = 3: A1=1, A0=1 -> data port 1例:
chip.write(0, 0x30);
chip.write(1, 0x01);
これは次の意味です。
0x30 を選ぶ0x01 を書くつまり、software 側は抽象的に音を変えているのではなく、 YM2612 固有の制御値をこの pin の組み合わせで chip に送り、 YM2612 の register に書き込んで音を作っています。
YM2612 は 6 channel の FM 音源として有名ですが、簡単な DAC playback path も持っています。
0x2A: DAC data0x2B: DAC enableDAC playback を有効にすると、channel 6 を通常の FM の代わりに PCM 風の sample playback に使えます。
これは後の世代の chip にあるような大きな PCM engine ではありません。 software 側が sample byte を継続して chip に書き込む、より単純な DAC 経路です。
実際には次の用途で重要です。
この repository では、現在の browser 側 PCM 関連サポートは主に VGM playback 経由です。 VGM の DAC/stream command を読んで、その sample byte を YM2612 の DAC register write に流しています。
Q: なぜ GND と A.GND の2種類があるの?
A: YM2612 にはデジタル回路とアナログ回路があります。
アナログ回路は音声出力に使われるので、A.Vcc と A.GND は MOL と MOR の後ろにある音声出力回路のために分けられています。
Q: なぜ /CS が必要なの?
A: /CS は「今のバスアクセスは YM2612 宛てです」と伝える信号です。
これがないと、同じバス上の複数のチップが同時に反応する可能性があります。
Q: /IRQ は何に使うの?
A: /IRQ は、主に YM2612 の内部タイマーイベントが起きたことを CPU に知らせるために使われます。
Q: /RD と /WR は何?
A: /RD と /WR はデータ線ではなく制御信号です。
実際のデータは D0-D7 を通ります。
Q: D0-D7 は何をするの?
A: D0-D7 は 8-bit のデータピンです。
CPU と YM2612 の間でデジタルデータをやり取りします。
Q: /IC は何に使うの?
A: /IC はリセット信号です。
チップを初期化して、レジスタをクリアします。