FM音源の出力までの道のり
はじめに
現在のPC環境では音声を出力するにはソフト的に音声を合成し出力しています。
一昔前のパソコンではPSGやFM音源機能を搭載していて、すべての音声をパラメータで
指定し、自分で加工した音源データにより、色々な音色を再現していました。
現在のパソコンはその様なデータをエミュレートし、かなり細部まで鳴らすこともできますが、
FM音源のチップ自体を理解する事は現行のシステムでは難しくなってきました。
そこで、マイコンを使用し、直接ハードを叩いて、実際のチップで勉強していくのが目的です。
かなり個人的な内容ですが、がんばりたいと思います。
(自分のスキルアップが目的です。)
第2ステップ
H8/3048でSN76489ANをコントロールすることを目的とします。
PIC16F84のショボイドライバーとは違うものを考えています。(うまくいくのか?)
一応 transdata( 1, 1, "cdefg" ); とかでデータをRAMに転送して、play(
1, 0x07 ); とかで
いかにもそれっぽく鳴らすことを構想しています。
最終的には周波数をズラして音に厚みをつけたり、ポルタメントができたら良いと
思います。
回路図
イエローソフト社製のH8/3048用ボードを使用した回路図です。
まだ動作テストはしていませんが参考に掲載します。(コネクタからの回路図です)
テストで鳴らすことが確認出来次第、6声出力バージョンも掲載します。
この場合、SN76489ANが2個搭載されます。
現在はテストの為、基板上のコネクタに亀の子の様に基板を取り付けて
テストしています。
さらにその基板からソケットでブレッドボードに配線を接続し、SN76489を
コントロールしています。かなり強引ですがちゃんと鳴ります。(今はSN76489ANを1石)
空中に飛んでいる配線が虹の様に見えます。(ブルーレインボー?)
これで鳴らしたゼビウスのBGM(mp3:476KB)です。
各信号のタイミング
SN76489ANのタイミングチャートです。
H8/3048からSN76489ANに1バイトのデータを書き込むには、
1.CE、WE、READYをハイにする。
2.データを出力する。(H8/3048のPB)
3.CEをローにする。(このあと少しタイマーを入れる)
4.WEをローにする。
5.H8/3048のPAの3ビット目(PA2)がハイになるまで待つ。
(SN76489ANにデータが書き込まれた時点で自動的にハイになる)
6.CEをハイにする。(このあと少しタイマーを入れる)
7.WEをハイにする。(このあと少しタイマーを入れる)
この順番に信号を出力すると、1バイトの転送が可能です。
この石を購入したときにコピーしてもらったデータシートでは、「6.」「7.」が逆になって
いて、その順番でコントロールしてもうまく鳴りませんでしたが、手動ロジックで色々試した
結果、「6.」「7.」の順番でコントロールしたら正常に鳴りました。
転送データのフォーマットと音程
転送データのフォーマットと音程のデータです。
H8/3048からSN76489ANに音量(アッテネータ)を書き込むには(チャンネル1)、
データフォーマットの「REG ADDR」にレジスタ・アドレスフィールドのTONE1 アッテネーション
から「001」を割り当て16進数で 9XH (X:は音量で、0が最大〜Fが最小)を
PBに出力します。
音程は2バイト必要で、注意が必要です。1バイト目が下位4ビットを出力し、
2バイト目が上位6ビットを出力します。オクターブ4のドの場合は、データフォーマットの
「REG ADDR」にレジスタ・アドレスフィールドのTONE1 周波数から「000」を割り当て
16進数で 8BH を1バイト目に出力し、 1AH を2バイト目に出力することで、
音階を奏でることが可能です。
サウンドドライバー
単音でゼビウスのBGMが鳴るものが完成しました。音階をテーブルに格納した
ものを直接指定して鳴らしています。(sndrv.c)かなりヘボいプログラムです。
C言語なので秋月のAKI-H8でも少しの変更でいけるのではないでしょうか。
3声のドライバを現在構想中です。(siyou.txt)
手に入りました
一応YAMAHAのYM2151の日本語データシートが手に入ったため、なんとか
そいつで行こうと思う。数名の方からWebに掲載されているサイトを教えていただき
ました。どうもありがとうございました。