hello_ymfm_wasm

FM音源って何?

YM2612 の細かい話に入る前に、FM音源そのものの考え方を見るには Yamaha の説明がわかりやすいです。

YM2612 について

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
    +------+

ピンの概要

FM での音作り

PCM / DAC の前に、まずは YM2612 がどうやって FM の音を作るかを見ると理解しやすいです。

基本の考え方は次の通りです。

まずは次のページを見ると流れを掴みやすいです。

FM Sound Chip での音作り

A0 と A1 は、どの制御ポートにアクセスするかを選びます。 address/data の切り替えと、port 0 / port 1 の切り替えに使います。

chip.write() と YM2612 のピンの対応

void ym2612::write(uint32_t offset, uint8_t data) は、YM2612 のアクセス方法を単純化したものです。

対応表:

例:

chip.write(0, 0x30);
chip.write(1, 0x01);

これは次の意味です。

  1. address port 0 でレジスタ 0x30 を選ぶ
  2. data port 0 から、そのレジスタに 0x01 を書く

つまり、software 側は抽象的に音を変えているのではなく、 YM2612 固有の制御値をこの pin の組み合わせで chip に送り、 YM2612 の register に書き込んで音を作っています。

PCM / DAC on YM2612

YM2612 は 6 channel の FM 音源として有名ですが、簡単な DAC playback path も持っています。

DAC 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 はリセット信号です。 チップを初期化して、レジスタをクリアします。

参考資料