YM2203はFM音源といえどSSG音源も内蔵していたり、AY-3-8910のように外部デバイスを接続するための8ビットパラレルポートも持っているので、 YM2149などから置き換えを狙ったICだということが分かります。 ソフト的なレジスタ配置もSSGを継承しており、信号のタイミングさえあわせれば比較的簡単に移行できそうです。
YM2203から出力されるのは専用DACへのデジタルデータで、SSG音源は1チャンネルごとに別のポートから出力され、
配線をつないで最終的にミックスさせる必要があります。
楽器のFM音源として見たスペックですが、4オペレータで3音同時発音ができます。
その他の機能としては私が持っているTX81Zよりも貧弱で、アルゴリズムは8種類、Multipleは0.5倍・1倍~15倍の整数のみ、
LFOは無いがSSG-EGという繰り返しのエンベロープパターンが使えるなどの特徴があります。
あと、TX81ZはTL(OUT)のパラメータが%表記でしたがYM2203は0~127です。またTLとSLは減衰表記になっているので、
TX81Zのパラメータをそのまま入れるとめちゃくちゃになりますが、きちんと計算すれば結構同じ音で鳴ります。ADSRの速度が違うようですが、これは致し方ないでしょう。
YM2203を使う重要なポイントとして、FM音源とSSG音源のレジスタのアクセスにかかる時間やタイミングが異なるため、 共通のアクセスルーチンを使うなら遅いFMの方に合わせないといけません。 回路設計の初段階で音が出なかった時に、ICが壊れているのか、配線が間違っているのか、通信タイミングを間違っているのか、 レジスタにセットする値がおかしいのかすごく迷いました。
上の表はYM2608(OPNA)のアプリケーションノートの抜粋で、音源レジスタに書き込む時のウエイトの時間を示しています。
YM2203のデータシートをインターネットで探してもアプリケーションマニュアルのようなものはまったく見当たらず、
PC-9801時代のFM音源ドライバを読まないといけないことが多々あるのですが、YM2203でもこのタイミングは同一と考えてよいと思います。
具体的な時間ですが、今回はマスタークロックに4MHzを加えるので17サイクルのところで4.25us、47サイクルのところで11.75us、
83サイクルのところで20.75usのウエイトを挿入しなければいけません。
この音源ICにはステータスリードというモードがあって、FM音源が処理中かどうかを判別するBUSYフラグを読むことで状況に応じた適切なウエイト時間を決めることができます。 SC1602という液晶モジュールを使った時にもBUSYフラグのポーリングを行ったことがあるので、同じプログラムが流用できそうです。
※ 3現象のオシロのため、bit7信号をあとから貼り付けています。
このような流れで処理が進んでいきます。
MIDIキーボードを弾いた時は以下のようにデータが転送されていきます。
音声の出力はYM2203から直接行われるわけではなく、専用のDAC YM3014を使います。
現在広く流通しているリニアPCMのDACとは異なり、こちらは仮数ビット10bit+指数ビット3bit+無効ビット3bitという特殊フォーマットで送られてきて、
最終的に16bitのダイナミックレンジを持つということです。つまり、リニアな部分は10bitだけなんですね。
で、3bitで表される部分で乗算されるということなのですが、それの中心点になるのがMPから入力されるアナログ電圧です。
MP端子はVcc/2を入力するところで、RB端子からリファレンス用のVcc/2が出力されているので、OPアンプのボルテージフォロワを介して元に戻すようにとデータシートに書いてあります。 内部でやれよと言いたくなるのですが、事情があるのでしょう。
回路を作っている時に面白いというか厄介な波形が出てきたので紹介します。
指定してるFMのパラメータは純粋なサイン波なのになんだコレ?矩形波のような音がします。
MPに正しい電圧が加わっていない場合やノイズが載っている場合にこのような波形が出るようです。
よく観察すると、波形が7つのブロックに分かれています。つまり、これが指数部の切り替わりだったんですね。
続いてもう一枚。サイン波の頭の部分がずれています。どうやら出力がクリップするとこのような波形が出るようです。
チャンネルを1つだけ最大でONする場合は問題ないのですが、2個3個とONしていくとひどくなってきます。
これに関してはYM2203内部でそういう計算をしているため、ハード・ソフト側で対応できないので放っておきました。
TX81Zで出力の値が%表記になっていたのはこれを回避するためだったのでしょうか?
※ もしかしたらDACの次にボルテージフォロワを付け忘れているのが原因かもしれません。