YM2151 FM OPM を聴いてみる

概要

某オークションで中古の YM2151 を 1000 円くらいで入手して音を聴いてみました。 通常 YM2151 とセットで使われる DAC YM3012 は今回入手できなかったため、 秋月電子で手に入る安価な 16-bit DAC uPD6376 を使用しました。uPD6376 は YM2151 のシリアル出力をそのまま入力できないため、 YM2151 のシリアルデータを CPLD に作成した形式変換回路で変換し、uPD6376 に入力しました。 オペアンプは単一電源用途では定番の LM358N を使用しました。

戻る


YM2151 について

YM2151 は、4 オペレータの FM 音源が 8 チャンネル入った IC です。ステレオ演奏にも対応しています。 1980 年後半から主にアーケードゲーム基板に採用された音源 IC です。パソコンでは SHARP の X68000 に搭載されていました。 詳しくは Wiki 等で調べてみてください。

↓製作した YM2151 試聴環境 (クリックで拡大)

今回単品で入手した YM2151 は、ピンがかなり痛んでおり、それを修復しようとしたところ誤って1ピン(GND)を折ってしまいました。 仕方がないので樹脂を少し削って1ピンの根元に太めの UEW をハンダ付けしてなんとか凌いでいます。 見た目もかなりボロボロだし、DATE CODE の部分がなぜか削られていてなんか怪しいです。 こんなのが本当に動くのかかなり不安でしたが、意外としっかり動いてくれました。IC はソケットにマウントしていますが、 次に外して付ける際にまた別のピンが折れそうで恐いのでもう着脱したくありません。


YM2151 をマイコンと接続する

マイコンは 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 の出力データを変換する

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 まわりの回路

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 で再生するのが実用的かと思います。


自作 YM2151 ハードその2 - SF2 サウンド再生ボード

某格闘ゲーム(実基板所有)の音源構成を再現した試作ボードです。 音源構成は YM2151 で FM 8 音、OKI M6295 で ADPCM 4 音となっています。 制御部と音源部はコネクタで分離してあるため大抵の CPU で制御可能になっています。 SF2 では Z80 で音源を制御するため、 Z80 + CPLD + ROM + RAM で実機と互換性のあるハードを構成しています。


製作した SF2 サウンド再生ボード

SF2 の BGM は力強いバスドラムと低再生レートのスネアドラムによる熱い演奏がたまりません。たまに聴きたくなるのでこのボードを引っ張り出してきて聴いています。 DAC は標準の YM3012 を使用しましたが、音質の印象としては多分 uPD6376 の方が良い気がします。(気がしているだけです)


自作 YM2151 ハードその3 - FPGA につなぐ [2013/5]

昨年の暮れから年初にかけて FPGA 用に MC6809 を Verilog-HDL で記述したので、その動作確認を兼ねてアーケードの「ダブルドラゴン」(実機所有) の音源制御部を FPGA に実装し、 YM2151 を FPGA につないで演奏させてみました。


製作した FPGA 接続用 YM2151 音源ボード

DAC は最初の試作と同様 CPLD (フォーマット変換) + uPD6376 を使用しました。

YM2151 は 5V、FPGA は CMOS 3.3V ロジックのため、YM2151 → FPGA 方向の信号は 74VHC244 で 5V → 3.3V にレベル変換しています。逆に、FPGA → YM2151 方向は 74LS244 で 3.3V → 5V にレベル変換しましたが、データシートによると YM2151 の '1' の入力電圧は 2.0V 以上のため 3.3V 出力直結でも問題なく動作するはずです。(未確認)

配線後まったく動作しなかったので調査したところ、自作 MC6809 の LBSR 命令にバグがあり、 これを修正したところ動作するようになりました。自作 MC6809 のバグをみつけることができたので製作した甲斐がありました。

基板に LM1972 (電子ボリューム) を載せてみましたが、多分アナログ/デジタル VDD/GND の配線をテキトーにやったせいで、かなり音質が劣化してしまったため使わないことにしました。

動作確認(演奏)の様子を少しだけ動画にしました。

戻る


(C) 2011-2013 Ki inserted by FC2 system