
某オークションで中古の YM2151 を 1000 円くらいで入手して音を聴いてみました。 通常 YM2151 とセットで使われる DAC YM3012 は今回入手できなかったため、 秋月電子で手に入る安価な 16-bit DAC uPD6376 を使用しました。uPD6376 は YM2151 のシリアル出力をそのまま入力できないため、 YM2151 のシリアルデータを CPLD に作成した形式変換回路で変換し、uPD6376 に入力しました。 オペアンプは単一電源用途では定番の LM358N を使用しました。
YM2151 は、4 オペレータの FM 音源が 8 チャンネル入った IC です。ステレオ演奏にも対応しています。 1980 年後半から主にアーケードゲーム基板に採用された音源 IC です。パソコンでは SHARP の X68000 に搭載されていました。 詳しくは Wiki 等で調べてみてください。(^^;

YM2151 は、今となっては新品ではほとんど入手不可能と思います。 入手方法としては、ネットのオークション等で出品されるまで待ち続けるか、 YM2151 が載っている、なるべく安いアーケード基板を買ってきて、 はんだゴテとはんだ吸い取り器で丁寧に取り外すのが現実的と思います。
YM2151 が載っていて、かつ手に入れやすいアーケード基板は SYSTEM 16B (SEGA) や CPS-1 (CAPCOM) あたりだと思います。SYSTEM 16B だと「フラッシュポイント」や「テトリス」が安く、 2000円~3000円くらいで手に入るのではないかと思います。CPS-1 だと「スト2」シリーズですかね。(^^; [2011-11-23]「四川省」、「四川省2」が YM2151 載っててしかも安いです。500 円で出品確認。
今回単品で入手した YM2151 は、ピンがかなり痛んでおり、それを修復しようとしたところ誤って1ピン(GND)を折ってしまいました。(^^; 仕方がないので樹脂を少し削って1ピンの根元に太めの UEW をハンダ付けしてなんとか凌いでいます。 見た目もかなりボロボロだし、DATE CODE の部分がなぜか削られていてなんか怪しいです。 こんなのが本当に動くのかかなり不安でしたが、意外としっかり動いてくれました。IC はソケットにマウントしていますが、 次に外して付ける際にまた別のピンが折れそうで恐いのでもう着脱したくありません。
マイコンは H8/3052F25 を使用しました(25[MHz] 動作)。回路図は作成せず、下の結線図のみで製作しました。
[H8/3052] [YM2151] [XC9572PC44] [uPD6376]
Phi1 (23) --> GCK3 (7) --> CLK (16)
SO (21) --> 9
SH1 (20) --> 11
SH2 (19) --> 13
A0 (36) --> A0 (4) (PU10k) 18 --> LSI
A1 (37) --> /IC (3) (PU10k) --> 19
GND --> RSI
20 --> LRCK
A8 (45) <-> D0 (10) (PU10k)
A9 (46) <-> D1 (12) (PU10k)
A10 (47) <-> D2 (13) (PU10k)
A11 (48) <-> D3 (14) (PU10k)
A12 (49) <-> D4 (15) (PU10k)
A13 (50) <-> D5 (16) (PU10k)
A14 (51) <-> D6 (17) (PU10k)
A15 (52) <-> D7 (18) (PU10k)
A16 (53) --> /WR (5) (PU10k)
A17 (54) --> /RD (6) (PU10k)
A18 (55) --> /CS (7) (PU10k)
PU10k = Pull Up wih 10k-Ohm resistor
YM2151 の制御は H8/3052 の外部バスを使わずにポートで行っています。 ここは最初から外部バスを使うようにしておけばよかったと後悔しています。
D0-D7 は双方向バスですが、いまのところ /WR のみ使用し(/RDは 'H' 固定)、 H8/3052 のポートは常時出力設定で制御しています。試作回路を組んでいろいろ動かし、 調べてから分かったことですが、正しくは YM2151 に書き込みを行う前に ステータス(A0 は 'L' でも 'H' でも良い)を読み出し、その MSB (BSY) がクリアセットされていることを確認してから書き込みを行わなくてはなりません。 が、今回はとりあえず動かすということで、書き込みの後、十分な時間ウェイトを挿入して制御しています。 必要なウェイト時間(つまり YM2151 に書き込んでから BSY がクリアされるまでの時間)は YM2151 に与えるクロック周波数によって変わってくるようで、4[MHz] で駆動する場合と 3.58[MHz] で駆動する場合とでは、3.58[MHz] の場合の方が長いウェイト時間が必要です。
YM2151 の出力はデジタルでシリアル形式ですが、そのシリアル出力形式が独特なため、通常は専用の DAC である YM3012 が使われます。YM3012 を使う限り YM2151 の出力形式を気にする必要はありませんが、今回は YM3012 がないので、YM2151 の出力をより一般的なシリアル形式に変換する回路を CPLD に実装します。
CPLD のソースをここに置いておきます。 動いた時点で動作確認をやめたので、まだどこかバグってるかもしれません。
作ったのが少し前のため、すでに細かいことは忘れてしまいましたが、 要するに YM2151 のシリアル出力は 13 ビットで、10-bit の仮数部と 3-bit の指数部から構成されています。 指数部に指定された数だけ仮数部をシフト(ただし 7 ビットのシフトは禁止)することによって 16-bit のデータが得られます。
上のソースのコメントにもありますが、注意が必要なのは、10-bit の仮数部が、以下のように符号なし 10-bit 値であり、その中点が 200h となっていることだと思います。
hex | decimal
---------+---------
10'h3ff | +511
: |
10'h201 | +1
10'h200 | 0
10'h1ff | -1
: |
10'h000 | -512
---------+---------
これに対して uPD6376 の入力形式は「MSBファーストの 2's コンプリメント」です。 要するに下表のような関係になっています(データシートより)。
(MSB) (LSB) | decimal | Output [V]
---------------------+---------+------------
0111 1111 1111 1111 | +32767 | 2.6
0111 1111 1111 1110 | +32766 |
: | : |
0000 0000 0000 0001 | +1 |
0000 0000 0000 0000 | 0 | 1.6
1111 1111 1111 1111 | -1 |
: | : |
1000 0000 0000 0001 | -32767 |
1000 0000 0000 0000 | -32768 | 0.6
---------------------+---------+------------
上の表から下の表への変換を行えば良いわけですが、まず YM2151 の表を "2's complement" に変換するには MSB (bit 9) を反転してやれば良いことがわかります。 この値を uPD6376 の表に対応させるために、符号拡張を行います。 符号拡張とは何かと言うと、仮数部が -512 で、シフトする回数が 0 の場合、 10 0000 0000 (10 ビット表現の -512) → 1111 1110 0000 0000 (16 ビット表現の -512) のように、符号を「拡張」して 10 ビット表現と 16 ビット表現とで同じ値になるように、 余ったビットに符号ビットをコピーすることです。最後に指数部の値に応じて左シフトすれば今回欲しかった "16-bit 2's complement" のデータ形式が完成します。あとはこれを MSB から順に出力してやるだけです。
DAC uPD6376 の回路は FC 互換機のプロジェクトで製作したものを流用しています。 YM2151 は L と R を交互に出力するため、uPD6376 もそのように入力します。このために uPD6376 の 1 ピンはオープンにしています。

uPD6376 からの出力を LM358N (バッファアンプ)に通し、 2SC1815 で電流増幅して 220[uF] のコンデンサで DC 成分を取り除いてイヤフォンに接続します (1 回路しか示していませんが、ステレオのため L と R の 2 回路分製作します)。

以前 YM2203 を PC から制御する回路を 1943 基板から回路をパクって作りましたが、 YM2203 は PSG 出力と FM 出力のミックスを IC 外部で行う必要があり、その音量比を、たとえば PC-9801 に合わせるのか、1943 などのゲーム基板に合わせるのか、悩んでしまいます。一方、 YM2151 の出力はデジタルなので、 D/A 変換をどうするかだけしか考えなくて良いので楽です。 特に IC にこだわりがないなら FM 音源は YM2151 に軍配が上がるのではないかと思います。
今回の試聴回路は DAC に uPD6376、オペアンプに LM358N と安物ばかりで構成しましたが、 実際に出てくる音は作った本人が驚くほどすばらしく、PC で YM2151 エミュレータを動かして 出力した音よりも断然演奏が生き生きしています(というより私の PC の音声回路のアナログ部分がしょぼい可能性が高い)。 しっかり音質にこだわった回路にすればどんなにすばらしい演奏になるだろうかと妄想してしまいますが、 多分 YM2151 の場合は演奏をデジタルのまま取り込んで保存し、別に作った PCM 再生用高音質 DAC で再生するのが実用的かと思います。
なんか載せれる演奏データがあったら録音してここに載せます(掲載に問題ないデータとか教えてください)。 MDX ドライバ自作中です(80%)。← なぜ自作する(^^;