Z80マイコンでFM音源(YM2151)を鳴らそう

KZ80-YM2151

前回動かしたKZ80-CPUBとSBC8080 SUBルーズキットマイコンで何か音を出してみるというのをやってみます。前回のマイコンボード2枚だと音源は装備してませんので、以前もご紹介したFM音源(YM2151)ボードを使います。

KZ80-YM2151をつくる

KZ80-YM2151 FM音源ボードですが、githubで基板データを公開しています。REV1のままですが、そのままでSBC8080やKZ80-CPUBが装備しているバスにつないで演奏できるはず。

基板を製造する方は、githubのKiCad/PCBフォルダに YM2151.zipという製造データをzipで固めたものがありますので、そちらをFusionPCBなりJLCPCBなの深センの基板製造会社へ5枚とかの単位で依頼するとすぐできてきます。おすすめ。

github.com/kuninet/Z80_YM2151

1枚だけほしいという方は、オレンジピコさんで買えます

store.shopping.yahoo.co.jp/orangepicoshop/pico-a-013.html

また、このボードですが ひろましゃ氏 が作ったArduinoUnoでYM2151を演奏する「arduino-vgmplayer」でも動くようにArduinoUnoの端子も装備しているという、一風変わったボードとなっております。

github.com/h1romas4/arduino-vgmplayer

部品組み付けなどの注意

部品組み付けなどについての注意点は、以下のwikiにまとめてありますのでご一読ください。

github.com/kuninet/Z80_YM2151/wiki

普通にICソケットとか部品をハンダ付けしていけは出来上がります。ArduinoUnoとつなぐ予定のない方は、Arduino用端子のピンヘッダはハンダ付けしなくてOKです。

FM音源 YM2151と専用DAC YM3012の入手が国内ではなかなか難しいかもしれません。わたしは 「arduino-vgmplayer」を作成された ひろましゃ氏からいただいたり、オレンジピコさんで一時期販売していただいていたときにゲットしました。

水晶発振子はキャンタイプのDIP14幅のものを想定しています。取り付けてみると上記写真のように部品目の印刷が逆さまになっちゃいますが、それで正しい向きです。カッコ悪くてすいません。

オペアンプは単一電源4回路タイプのものを使用してください。秋月電子で200円ぐらいで売ってるLMC660CNを私は使用してます。

ジャンパ設定などは上記のWikiを確認してください。今回は「SBC8080バスにつなぐ場合」の設定にしておいてください。YM2151のチップイネーブル(CE)とかリセット信号のもらい方とか、そのあたりの配線切り替えを実施するジャンパーです。SBC8080でしか使わない場合はジャンパのところを短絡してしまってもOKです。

I/OアドレスはSBC8080 SUBルーズキットの技術資料をみていただくと分かる通り、SBC8080 SUBルーズキットのシリアルLSIで I/Oアドレス $00-$3Fまでは使用済みですので、本ボードのI/Oジャンパーは$40に設定するのが吉です。後述する音楽再生プログラム(VGMプレーヤ)もI/Oアドレス$40を期待したプログラムとなっています。

マイコンへの接続と音楽再生

基板への部品組み付けが終わったら、KZ80-CPUB+SBC8080 SUBルーズキットとつないで、音楽再生してみます。

マイコンへの接続

マイコンとつなぐために今回は40PフラットケーブルでSBC8080バスにつないでみます。そのためには40Pフラットケーブルに3口以上のコネクタが必要です。こんな感じ。

こちらは秋月電子で売ってる200円の40Pリボンケーブルに、千石電商などで取り扱っているコネクタを3つ追加で圧接したものです。

www.sengoku.co.jp/mod/sgk_cart/detail.php?code=8877-N54M

圧接には万力さまなどがあると良いようですが、私は Amazonで圧接用ペンチを買いました。意外と圧接する機会があるので重宝しています。(私だけ???)

amzn.to/3KtyN34

ちなみに共立電子の通販でも取り扱っていたりします。50Pぐらいまでのコネクタは圧接したことがありまして、レトロPCでフラットケーブルにコネクタを圧接しがちな方にも最適ですw

eleshop.jp/shop/g/g78U141/

フラットケーブルでKZ80-CPUB、SBC8080 SUBルーズキット、KZ80-YM2151 FM音源ボードの3枚の基板を接続し、ジュラコンスペーサで縦積みしてみました。また、FM音源ボードの音は弱いので、大きい音で再生するためSONYのアクティブスピーカーを接続しました。

音楽再生のための手順

音楽再生のためには、演奏プログラムと曲データが必要です。以下のgithubのKZ80-YM2151ボードのところにVGM音楽データ再生プログラムとサンプルのVGMデータを置いてあります。

github.com/kuninet/Z80_YM2151/tree/master/sample_music

VGM音楽再生プログラム(KZ80_YM2151.hex)とサンプル曲データ(kanon2151.hex)をTeraTERMでマイコンに流し込んでください。その際 TeraTEAMのシリアル設定の「送信遅延」をちょっといじっておくのが吉です。1行送信あたり50mSecぐらいの待ちを入れておくと安心です。

IntelHexの送信の際は、まずUniversal Monitor側でLコマンドを実行して受信待ちにした状態で、2つの IntelHex形式データを流し込んでください。流し込むためにはIntelHex形式のファイルをSAKURAエディタなどで開いて、データを全選択(ctrl+a)してコピー(ctrl+c)し、TeraTERMの画面へ Alt+v で貼り付けすると送信されます。Z80マイコンとのあいだの通信速度は9600bpsですので、曲データの送信には少々時間がかかります。80年代のカセットテープからのロードの気分でしばらくお待ちください。

演奏プログラムは$8100番地から、曲データは$9000番地から読み込まれます。流し込みがおわるとUniversal Monitorのプロンプト” ] “が出てきますので、Gコマンドで$8100番地からプログラムを実行してください。VGM音楽データ演奏プログラムが動き出して$9000番地からのデータをFM音源ボードへ送信して演奏が始まります。

以下にFM音源で演奏したサンプル曲を、パソコンで録音したものをおいておきます。

githubにUPしている演奏プログラムは、KZ80-CPUBのクロックが7.3728MHzで動作する前提でwaitを入れています。この周波数より使用しているクロックが速かったり遅かったりした場合は演奏スピードがおかしい感じになってしまうかもです。ご了承ください。

今回のZ80マイコンは演奏プログラムと合わせて32kバイトのメモリー領域となってますので、あまり長いVGMフォーマット音楽データは再生できませんが、インターネットを探すとYM2151のVGMフォーマット音楽データがみつかりますので色々と鳴らして楽しんでいただければと思います。

以前、YM2203 FM音源ボードとCP/Mを使って大きな音楽データを鳴らしたことがありました。基本的には同じような仕組みでYM2151用の大きい音楽データを鳴らすことも可能なはずです。どなたかチャレンジしていただければと思いますです。

コメント