curious4dev

中国旅行、Arduinoなどを使った電子工作、その他色々。

*

FM音源YM2203をArduinoで鳴らしたい #1

 

お疲れ様です。高橋です。

きっかけ

4月から現在に掛けてのコロナな最近、会社のとある先輩と一緒に仕事する機会が多くなりました。一緒に休憩時間にタバコ吸いに行った際の雑談中、レトロゲームの音楽について色々教えてもらいました。

その先輩は私と年齢がほぼ同じで、ゲーム遍歴もほぼ同じだったのですが、異なるのは、先輩はPC88畑を歩んできた点。もともとPSG音源にしか関心が向いていなかった私の嗜好に、FM音源という波がやってきました。

先輩は様々なゲームの音楽を忠実に耳コピしたものを、M88(PC88エミュレータ)上で動作する、BASIC言語で書かれたMML(楽曲記述言語)をディスクイメージにして送ってくれたり、MUCOM88 for windowsという古代祐三が作ったFM音源楽曲制作ツール用のファイルを送ってくれて、私を徐々に洗脳していきます。

色々聞いたのですが、衝撃だったのがPC-88版のイース2のオープニングの耳コピ。

これは実機の音楽ですが、聞き分けが出来なくらい忠実に耳コピで再現しているレベルの物を送ってくれたのです。激しく感動しました。採譜が完璧なのは当たり前で、音色や音の粒1つ1つに対するこだわり(微小なデチューン、ノイズやドラム部分の細かい技巧)に、恐怖しました。

従来私は、3和音に耳コピし直してPSG音源YMZ294で鳴らす際、Arduino側のファームウェアはインパクトドリルさんの物をそのまま流用し、ただそこに音程と長さだけを流して満足していたのですが、この先輩はFM音源ドライバーなる、FM音源用のファームウェアすらも音楽に最適化するような形でPC88上で実装していたとの事です。

そんなこんなで、FM音源の実機で鳴らしたいという欲が出てきました。

FM音源のチョイス

FM音源といってもPSGと違って色々な種類があります。すべてを説明するのは大変なのでググってもらうとして、今回は先輩が使っていたPC88に搭載されていた、YM2203というICを使って、演奏デバイスを作ることにしました。

PC88には、サウンドボード2というYM2608が搭載されてる音源ボードも後に出たらしいのですが、YM2608はADPCM音源を用いる事が出来るために、別途ADPCM用のメモリを外付けする必要が・・・と、なんか面倒くさそうな予感がしたので、素直にYM2203をチョイス。YM2203はYMZ294と違って、それ単体ではFM音源は鳴らず、別途YM3014という2203専用のDACが必要ですが、秋葉原にある家電屋ケンちゃんには、セットで1,000円で売っているので、特に苦労せずセットで購入する事が出来ました。

YMZ294は9pin * 2の18pinでしたが、YM2203は20pin * 2の40pin。YMZ294比で倍以上のピン数に恐怖しましたが、半分くらいはゲーム用のコントローラー用ピンである事がわかったため、実際に使うピン数は半分くらい。恐怖は和らぎました。

参考資料

最終目的は、先輩が過去から現在に渡って作った膨大なMML資産を本物の音源ICで演奏するデバイスを構築し、サッと先輩の耳元で聴いてもらう事です。「FM音源 Arduino」などでググると出てくるたくさんの資料群で、大変参考にさせていただいたのが下記です。

GR-SAKURA FM音源シールド – lipoyangさんの、GR-SAKURAというルネサス系のCPUを使ったFM音源演奏デバイス

YM2203 JukeBox – zenmaiさんの、Arduino nanoとYM2203を使ったFM音源演奏デバイス

YM2203 DataSheet – これが無くちゃはじまらない。YM2203のピンアサインやレジスタマップなど。

S98仕様 – MUCOM88がYM2203に送信するデータのログファイル。レジスタ書き込みログ。

zenmaiさんのYM2203 JukeBoxが、今回の目的と、私のCPUの好みに合致していたので、基本的な回路はこちらを参考(というか丸パクリ)にさせていただき、音声出力部分の回路については、lipoyangさんの作例を参考にさせていただきました。

概要設計

現状の概要設計は下記の通りです。

「1. muc(MML)」は、MUCOM88用の楽曲記述言語です。先輩はこれを作るスキルを持ってますので、今後の楽曲追加が期待できます。理想はこのMMLをArduinoに持っていって演奏出来れれば一番なんですが、MMLを解釈する処理、FM音源のレジスタを叩く処理をやるには、あまりにArduino nanoではメモリが足りないため、MUCOM88が出力する、YM2203のレジスタを叩くログ(S98ファイル)を、microSDカード経由でデバイスに持ってくる。デバイス側ではマイクロSDからデータを読み込み、そのまま素直にYM2203に出力すれば音が鳴ります。

回路図を読み解く

zenmaiさんの回路をベースとし、アナログ音源部分をlipoyangさんのものにする方向性で資料を読み進めていきましたが、lipoyangさんの回路図の最終出力の部分。

R7が4.7μとなっており、R8が220、となっています。4.7μな抵抗なんてあるわけないし、220も220kなのか、そのまま220なのかがわからない。資料を読み進めていくと

との記述を発見。

Oh!MZ 1985年12月号を求めて

Oh!MZの1985年12月号を読めば、正解が載っていると考え、早速国会図書館へ行きます。

ここは無料で(超重要)、日本で出版された全ての書籍・雑誌が閲覧・コピー出来るという優れた場所です。

駿河屋BEEPに行くと、黄金期である80年代後半~90年代前半の雑誌は1冊3,000円くらいするのがザラなので、国会図書館でのコピーは必然と言って良いでしょう。

入館後20分で当該記事を入手。

1985年前後のPC雑誌は、FM音源ボードの実装記事や、ソフトウェア的な記事など、かなりハードウェアに近い記事が豊富で、一瞬トランジスタ技術?!と錯覚する程です。

というわけで、正解はR7は4.7kΩ、R8は220Ωでした。

スッキリ。

ブレッドボードに実装

zenmaiさんとlipoyangさんの回路図を参考に必要部品を全て購し、いざ実装の儀に移ります。

0.1μFは在庫が大量にありましたが、今回は贅沢に金属皮膜抵抗を使うことにしたので、1本単位で千石で購入。


完了。

音がならない #1

Arduinoに書き込みスケッチは、zenmaiさんの物をそのまま流用します。満を持してMUCOM88から先輩作のYs2 openingをS98に出力し、マイクロSDに書き込み。

ところが音がなりません。

スケッチとS98フォーマットのデータ、S98データ仕様をにらめっこして原因判明。

S98のデータ部は、最新仕様ですと

[DUMP DATA FORMAT]

00 aa dd  DEVICE1(normal)
01 aa dd  DEVICE1(extend)
02 aa dd  DEVICE2(normal)
03 aa dd  DEVICE2(extend)
...
FF        1SYNC
FE vv     nSYNC
FD        END/LOOP

のようになっております。コマンド、アドレス、データ、という3バイトが延々と繰り返されます。たまに1バイトのコマンド(\xFFや\xFD)、2バイトのコマンド(\xFE)があります。

zenmaiさんのこのスケッチは、S98仕様のコマンドの\x00、\xFD、\xFE、\xFFだけを許与しており、それ以外が来ると

Serial.print(“command err:”);
Serial.print(dd,HEX);
while(1);

と、エラーを返す仕様になっていました。

MUCOM88で出力するS98をバイナリエディタで見てみると、01コマンドが多用されていたため、01が来た場合無視して次に進むよう修正し、問題解決。

が、それでも鳴らない。。。

ampの出力の手前や、YM2203のPSG出力箇所にsound outを強引に行って鳴らそうとしても、うんともすんとも言わない。

音がならない #2

会社の中でIoTを専門にされている方に教えを請うと「オシロで信号見たほうが良い」というアドバイスが。「大変ごもっともですが、オシロなんて高くてとても買えません」とキレながら言うと、「400円でオシロ作れるよ」とこちらのサイトを教えてくれました。

九州工業大学が作った、Processing+Arduinoで動作するオシロです。

私はArduino nanoは中国から大量に購入済み、かつ、コンデンサも抵抗も在庫していたので、早速実装。

ArduinoからYM2203に信号を出力する箇所、4MHzを出力する箇所にピンを当てて波形を見てみると、それっぽい信号が出ているようです。

しかし、YM2203からのPSG出力部分の3本のピン、そして、DACへ送る信号のピン数本をチェックしましたが、こいつらは一切何も出力していませんでした。

結論と対策

おそらく、家電屋ケンちゃんで購入したYM2203+YM3014のセット(\1,000)の内、少なくともYM2203は故障していると思われます。中古引き抜き品なので、こういう事もあるでしょう。。

8月のお小遣いがチャージされたあと、aliexpressでYM2203とYM3014を10個ずつ購入し、再チャレンジしてみようと思います。

 

 

以上、よろしくお願い致します。

 - 電子工作

  関連記事

音階LED実装 #2

お疲れ様です。高橋です。 本日も昨日に引き続き半田付け。 今日の進捗 昨日の残り …

電子オルゴール設計

お疲れ様です。高橋です。 電子オルゴールがどんな形状になるのか、実体配線図を作っ …

赤外線リモコンをケースに格納

お疲れ様です。高橋です。 先日作ったATtiny13Aの赤外線リモコンを、ケース …

ArduinoIDE1.6.4+ATTiny13Aで赤外線リモコン(難航)

お疲れ様です。高橋です。 先日から引き続いて、ATTiny13Aで赤外線リモコン …

音階LED仮組み

お疲れ様です。高橋です。 先日設計し直した音階LEDを、B型基板上に部品を載せて …

マウスを分解してみた(リベンジ)

お疲れ様です。高橋です。 壊れたマウスを貰った 本日、壊れたマウスを貰いました。 …

YMZシールドの作成 #2

お疲れ様です。高橋です。 先日から作っていたYMZシールドですが、本日完成しまし …

上司離着席検知システムの作り方

お疲れ様です。高橋です。 上司離着席検知システムの作り方は下記の通りです。 必要 …

耳コピミキサー 試作

お疲れ様です。高橋です。 iPhoneから流す音と電子ピアノから流す音を合成する …

ArduinoIDE1.6.4+ATTiny13Aで赤外線リモコン

お疲れ様です。高橋です。 先日実験したArduinoで赤外線リモコンの問題点、そ …