FM音源の出力までの道のり



 
 
 
 
 
 
 
 
 
 

2000. 9.13

  はじめに
   現在のPC環境では音声を出力するにはソフト的に音声を合成し出力しています。
  一昔前のパソコンではPSGやFM音源機能を搭載していて、すべての音声をパラメータで
  指定し、自分で加工した音源データにより、色々な音色を再現していました。
  現在のパソコンはその様なデータをエミュレートし、かなり細部まで鳴らすこともできますが、
  FM音源のチップ自体を理解する事は現行のシステムでは難しくなってきました。
  そこで、マイコンを使用し、直接ハードを叩いて、実際のチップで勉強していくのが目的です。
  かなり個人的な内容ですが、がんばりたいと思います。
  (自分のスキルアップが目的です。)
 

 最初の目的
   いきなりFM音源を出力するには初心者の私にとってかなり敷居が高いので、まずは
  PIC16F84を使用し、PSG(プログラマブルサウンドジェネレータ)に近いSN76489AN
  というチップで音声を鳴らすことを考えています。
   このチップは約20年くらい前に東芝のパソピア7という幻の名機にて使用していた音源に
  かなり近いので、家にある資料とデータシートを元にしてコントロールしてみます。
 

 今後の予定
   上記のチップで確認後、ワンチップでもソフト的な機能で融通がきくH8/3048(秋月製)にて
  同じ機能を実施出来る様にし、最終的にはFM音源(今のところYM2151)で出力したいと
  思います。
  最終目標はNAMCOにて一世を風靡した通称「めがてん」さんがよく使っていたFM音源と
  PSGを混ぜたような音’めがてんPSG’(勝手につけた)をマイコン上から鳴らすのが
  目標です。
 

 補足
   ■PSG(プログラマブル・サウンド・ジェネレータ)
      GI製のチップで3声同時に出力可能です。ノイズの機能もあるので、
     簡単な爆発音とかを出力できます。ノイズとPSGを1声で鳴らすこともできるので
     かなり前に、コナミレーザーを再現したりしました。(PC−88ですが・・・)
      このチップには2ポートのI/Oの機能もあるので、当時はかなり一世を風靡
     しました。ゲーセンゲームのコントローラーはこの機能でコントローラーの状態を
     読み込んでいたんだと思います。(全てではないでしょうが)

   ■めがてん
      元NAMCOの方で、代表作にドラゴンスピリット、ドラゴンセーバー、オーダイン、
     ダートフォックス等があります。
     その中でも個人的に気に入ったものの中に、オーダインのラウンドXがあり、
     この曲の音色に上記にある めがてんPSG がなっています。
     最初この音色を聞いたとき、音の成分はPSGなのにもうひとつ余分な成分が
     重なっていたので、当初PSGとFMを重ねて鳴っているとばかり思っていました。
     しかしX68Kで鳴らしている音色を聞くと、FM1声で鳴らして、もう1声で深み
     を出していることがわかって、スゴイと思いました。(めがてんの説明じゃないだろ)
 

 回路図

   PIC16F84を使用した回路図です。
  テストの結果、正常に鳴らせることに成功しています。2000. 8. 7の回路図は
  PIC16F84とSN76489ANのデータバスが逆になっていたので、修正しています。
  SN76489ANの供給クロックは現在はモジュール型の水晶発振を使用しています。
  データシート通りの3.579545MHzのクロックで供給しています。
   SN76489ANの7ピンの出力部には、大阪の日本橋の共立電子産業のLM386
  アンプ回路を接続しています。
 

 各信号のタイミング

   SN76489ANのタイミングチャートです。
  PIC16F84からSN76489ANに1バイトのデータを書き込むには、
     1.CE、WE、READYをハイにする。
     2.データを出力する。(PIC16F84のPORTB)
     3.CEをローにする。(このあと少しタイマーを入れる)
     4.WEをローにする。
     5.PIC16F84のPORTAの3ビット目(PORTA)がハイになるまで待つ。
       (SN76489ANにデータが書き込まれた時点で自動的にハイになる)
     6.CEをハイにする。(このあと少しタイマーを入れる)
     7.WEをハイにする。(このあと少しタイマーを入れる)
  この順番に信号を出力すると、1バイトの転送が可能です。
   この石を購入したときにコピーしてもらったデータシートでは、「6.」「7.」が逆になって
  いて、その順番でコントロールしてもうまく鳴りませんでしたが、手動ロジックで色々試した
  結果、「6.」「7.」の順番でコントロールしたら正常に鳴りました。
 

 転送データのフォーマットと音程

   転送データのフォーマットと音程のデータです。
  PIC16F84からSN76489ANに音量(アッテネータ)を書き込むには(チャンネル1)、
  データフォーマットの「REG ADDR」にレジスタ・アドレスフィールドのTONE1 アッテネーション
  から「001」を割り当て16進数で 9XH (X:は音量で、0が最大〜Fが最小)を
  PORTBに出力します。
   音程は2バイト必要で、注意が必要です。1バイト目が下位4ビットを出力し、
  2バイト目が上位6ビットを出力します。オクターブ4のドの場合は、データフォーマットの
  「REG ADDR」にレジスタ・アドレスフィールドのTONE1 周波数から「000」を割り当て
  16進数で 8BH を1バイト目に出力し、 1AH を2バイト目に出力することで、
  音階を奏でることが可能です。
 

 サウンドドライバー

   現在はかなりショボイドライバーです。PICマイコンはかなり高速に動作するので、
  3声+ノイズをフルに動作させても問題ないと考えられます。
  パソピア7はZ80の4MHzで6重和音(SN76489×2)をしていたので、それより速い
  PIC16F84だったら余裕と考えられます。
  現在のドライバーでは単音で同じ音符で繰り返す曲でゼビウスのBGMが鳴り続ける
  ものは作っています。
   今後はPICではドライバープログラムが大変と考えられるので、そろそろH8マイコンに
  移ろうかと計画しています。H8だったら曲だけのコントロールならかなりイケそうな
  感じです。MMLもきちんとしていて周波数がズラせるものができれば、グラディウス
  の曲ならかなり再現できるのではないかとか、往年のNAMCOの曲は楽譜があるので
  かなり鳴らせると思います。
   希望が多ければPICで3声+ノイズを鳴らすドライバーも考えても良いのですが、
  データを作るのが大変なので、あまり意味がないと思っています。
 

 困ってしまったこと

   最終の目標はYAMAHAのYM2151をコントロールすることですが、購入したところで
  コピーしたデータシートがかなり程度が悪く、データが読みとれないので、メーカーに
  問い合わせてみた所、過去のデータシートは出すことができないとの回答でした。
  非常に残念なことでしたが、仕方ありません。
  読みとれることができなければ手は出せませんので、別の研究に入ろうと思います。

  
 
 

ホームページへ戻る