S1でFM音源を鳴らす
FM音源と言えばヤマハが開発、販売していた音源チップです。1980年代前半にシンセサイザDX7に採用されて世界の音楽シーンを席巻しましたし、1980年代の中盤以降は8ビットパソコン、アーケードゲームや家庭用ゲーム機に採用されてゲーム音楽の幅を大きく拡げました。
FM音源にもいろいろ種類がありますが、8ビットパソコンで多く採用されていたのが下の写真にあるYM2203です。これは従来の音源チップであるPSG(AY-3-8910)と互換性を持たせてあり、PSGを操作するソフトウェアは変更なしで使えるといった利点もありました。ちなみにYM2203はOPNとも呼ばれています。
写真右側にあるのは専用DACであるYM3014です。YM2203のFM音源部はデジタルで出力されるのでこれをアナログ音声にするためDACを介する必要があります。音源チップを入手する際はこの点にご留意を。
さて、S1用のFM音源カードと言えば、月刊I/O 1986年5月号に上記チップを使用した製作記事が掲載されています。一方、オフィシャルで拡張カードが販売されていたかはわかりません。今回は、月刊I/Oの記事を参考にして進めていきたいと思います。
回路を考える
月刊I/O 1986年5月号に掲載された回路図を示しました。
上の回路図から、横着できそうなところと変更するところを考えていきます。
- YM2203に入力するクロック信号は、S1本体から出ている2MHzクロックを使用する。これで、水晶発振子まわりの発振回路は省略できる。
- データバスに接続しているLS245はなくても動きそうなので省略する。
- MPUE信号はS1固有の信号なので代わりにL3互換のE信号を使用する。これでレベル3でも使えるかも。
- 音声信号はS1本体のSOUND IN信号に入れて本体のスピーカから音を鳴らすようにする。これでオペアンプ1回路分省略できる。
- A0信号が直接YM2203に入っているが反転させて入れるようにする。これで、I/Oポートは$FF1Fがアドレス、$FF1Eがデータになります。これは標準搭載PSGのI/Oポート$FFE4,$FFE5と合わせています。
- LS32に入るA6,A7信号はA5,A6信号のまちがいだと思うので変更。
上記から変更した回路図を以下に示しました。
回路の変更点を補足すると…
- ロジックICは入手しやすいHCシリーズにします。
- オペアンプは回路から単電源のものでも大丈夫のようなので、+5Vで動作する手持ちのLM358にしました。
- 音声出力部分にはFM,SSG側双方に音量調整用の半固定抵抗をつけ、そこからコンデンサを介してSOUND INに接続します。
テスト回路で確認
それでは早速実装、とその前にこのFM音源が壊れていないか、この回路で動作するかを確認するためテスト回路を組むことにしました。マーク5用の6声PSGを作るで作成したテスト用回路図を参考に組んだのが以下の回路になります。
制御にはAVRマイコンを使用します。これに16MHzのセラロックを接続し8分周して2MHzのクロックで動作させます。このクロック信号はそのまま外部に出力してFM音源のクロックとしても使用します。
AVRマイコンに演奏プログラムを書き込んだら電源ON。お、音が鳴りましたが想定より1オクターブ高い音です。リセットスイッチを押すと想定の音程になるので、どうやらパワーオンリセットが速すぎるのかもしれません。リセット信号線に100uFの電解コンデンサをつけたところ、うまく演奏されるようになりました。
実機で動かす
それでは実機で動かしていきます。ブレッドボードを配線したらショートしていないかをテスターで確認します。さらに信号観測用にロジックアナライザを接続して、エッジ端子をS1本体に接続します。これでハードウェア側の準備は完了。
一方、ソフトウェアですがS1用ソフト&ツールにある演奏プログラムを変更して使用します。クロックは3.58MHzから2MHzに、またプレスケーラ(分周比)をFM部 1/3、SSG部 1/2になるように変更します。これらプログラムをディスクイメージにして仮想FDDに転送したら、いよいよ電源ON。
仮想FDDから演奏プログラムをロードし実行します。おお、音が鳴りました…が鳴っているのはSSG部分だけでFM部分が聞こえない。音量を調整すべく可変抵抗を回すも変化なし。何回かプログラムを繰り返し実行しているとFM部から雑音が聞こえるようになりました。SSG部からは正常に音が出ているし、ロジアナで波形を確認してもデータ書き込みに問題はなさそう。なので何が原因かよくわかりません。
半日悩んでわからないのでググってみたところ、FM音源に書き込んだ後、次に書き込みするまでにウェイトを入れる必要があることが分かりました。なるほどソフトウェア側に問題があったわけですね。演奏プログラムを修正して再度実行したところ、おおっ、無事演奏されました! 動作検証の動画を用意しましたので興味のある方はどうぞ。
この回路用に使用した演奏プログラムについてはページ下のリンクからダウンロードできます。
参考までに、ロジアナで観測した各信号のタイミングチャートを示しました。
拡張PSGとして使えるか
次は拡張PSGとして使えるかを検証します。拡張PSGのI/Oポートは$FFE6がデータ、$FFE7がアドレスとなります。S1用の拡張PSGを作るの記事を参考に回路を変更しました。
アドレスデコード用に74HC133を、ROMKIL信号用に74LS06を追加しますが、スペースがないため新たにブレッドボードを用意しました。
それでは動かしてみます。S1 BASICが起動したらPLAY文で検証します。おっ、きちんと演奏されますね。ただ、標準搭載PSGと比べると音量が少し小さいようです。そこで、SSG側から出力される部分の抵抗値を低くしました。470Ωにしたところいい感じになりました。
以下の動画はメロディチャイムを演奏させてみた検証動画です。
先ほどの演奏プログラムのアドレスを変更して検証したところ、こちらも問題なく演奏されました。なお、この演奏プログラムを実行した後、PLAY文で演奏すると音程が1オクターブ上がります。
最後は、ロジアナで観測した各信号のタイミングチャートです。
まとめ
ウェイト処理が必要であるという部分で悩みましたが、無事、FM音源を動作させることができました。前半の回路はS1のBモードやレベル3でも使えるのではないかと思います。IRQ信号を割り込み信号としてS1に接続すればタイマ機能も使えますし、汎用I/Oはジョイスティック端子として使えますね。S1専用のユニバーサルカードがあればそれに回路を実装したところですが今じゃ入手は困難ですね。うーん、PCBを設計するしかないのかなぁ
ダウンロード
演奏プログラム - opntest_022.zip (32KB)
[MD5:e7c98e51c66cac7c409e8d94d9a2c8a6]
追記(2020-01-18)
ユニバーサル基板に実装しました。実装するにあたってI/Oポートアドレスを切り替えられるようにしたのとFM音源からのINT割り込み信号を本体のIRQまたはFIRQ信号に接続できるようにしました。
追記
プリント基板を作成しました。詳細はこちらのページ。
◆関連ページ◆