« Arduino - ブレッドボードでArduino | トップページ | AVR - chiptune »

AVR - MMLでPSG音源

Avrimg0013


というわけで懐かしなPSG音源に手を出してみる

秋月で売られている YMZ294 という音源チップで、YM2149 や AY-3-3910 と音源仕様は同じもの

基本的に同時発音数は3音で、PSGのみかノイズのみかミックスするかが選べて、一応全チャンネル共通のエンベロープ(不便)にノイズ周期、音量がある

既にこれで遊んでいるユーザーさんが多いので詳しいことは割愛するけど、このYMZ294はIOポートを省いたものなのでピン数が少なくて小さいのが利点
そのIOポートは、ジョイスティックやテープレコーダーを接続するためのものなので、現在なら必要ないと思う

逆にチャンネル独立で出力されていたのが、全チャンネルが1つにまとめて出力されるのでパラアウトが出来ない

で、MIDI化している人が多いので、ここは1つ MML によるシーケンスで発音させることに挑戦

手元には2個あって、更に友人から AY-3-8910 を2個頂戴した

さんきゅうですhappy02

てなわけで、音源チップは最低でも5個搭載で、最終的にはMIDI化してしまおうという方向で・・・sweat02

と、その前に ATmega48 を使ってAVRライタを作った

Avrimg0010

ベースは USBasp で考え、細かいところは省いた・・・

配線ミスっていたり、後からスイッチ付けたりで、ジャンパが苦し紛れに飛んでいるけど、何の問題もなく動いた・・・かえって怖い

 

Avrimg0009

まずはお決まりのATmega168周辺の回路を組み上げ

配線はデータ8本、制御線を /WR と /CS は1本にまとめ、それと A0 の2本の計10本

複数のチップをカスケードするなら、1つにつき /WR と /CS を1本ずつ増やしていくだけかな

8番ピンの 4/8 と /IC(RESET) は Hi に固定しているけど、最終的にはリセットはあっても良いかも

赤いLEDはテンポの1拍おきに点滅

Avrimg0011

こんな感じで、YMZ294とATmega168を接続

沢山並んでいる赤いジャンパは2個カスケードさせるための予備配線

出力はフィルタも何もかまさず、ダイレクトに可変抵抗につないで、そのままスピーカへ出すだけ・・・聞こえればいいのでsweat02

しっかり MML での演奏を確認出来た・・・懐かしい

 

ついでに、貰った AY-3-8910 もテスト

Avrimg0012

制御方法が若干異なるので、ソフト側で変更する必要があるのだが、配線は思っていた通りでドンピシャだった・・・sign03

で、制御だけを変更してみたら無事にちゃんと演奏された

けど、クロックがYMZ294のもの(4MHz)をそのまま流用しているから、音程が1オクターブ高くなってしまった

調べてみると最大は 2MHz ということらしく、その倍の 4MHz を入れているので、当然音程がオクターブ高くなる
YMZ294は内部で2MHzに分周している

2MHzに分周するのも面倒なので(というかフリップフロップICが手元にないので)、このチップの場合はオクターブを下げるようにした

なぜ YMZ294 はクロックを内部で2分周しているのか不明だったのだけど、これでその意味が分かった

もともとが2MHzで動作する仕様で、3MHzだろうと8MHzだろうと、必ず分周して2MHzにしているわけですね

但し、音がやたらと揺れている・・・ガンガンにLFO掛かっているような、気持ち悪い感じの出音になっている
3つの出力をそのまま接続しているだけなので仕方ないか

 

で、先に結果のサンプルをファイルにしておきます(mp3)

2曲あって、ループが終了すると急に曲が切り替わるのでびっくりしないように

ちなみに、エンベロープなど一切使用していない、ただ音程を流しているだけのもの

ダウンロード PSG-SAMPLE.zip (9025.0K)

これは YMZ294 と AY-3-8910 の出音をそのままPCのマイクインから録音したもので、出力が弱い分、PC側でノーマライズだけしてある

サンプル曲の内容はちょっと言えない・・・内緒sweat01

 

ATmega168では表題の通りMMLで演奏しているけど、何も考えずにストレートで作ったのでちょっと処理が重い感じがする(ソースは汚いので要望があれば)

MMLの仕様自体が規格化されていないので、誰でもわかるくらいのコマンドに絞り、プラス音源特有アンドちょいオリジナルコマンドといった感じでまとめてみた

但し、タイミングによっては途中でテンポを切り替えると数秒間停止してしまうことがあって、まだまだ潜在的なバグがあるのは確認済み

 

データの配置はフラッシュから直接 pgm_read_byte() で読み取っているので、フラッシュ容量目一杯まで曲を置ける・・・と思う

音程(周波数)テーブルは、元々は内臓のEEPROMに配置していたけど、SRAMに余裕があるのと、いちいちEEPROMを転送するのが面倒sweat02なので、SRAMを256バイト分占有して配置

一応defineでSRAM、EEPROM、フラッシュに配置して読めるようにはしてあって、そのうちI2Cでの外部EEPROMとSDカードにも対応する(あくまで)予定

 

ちなみに音程テーブルはアルゴ算法堂さんの「PSGへの道」より拝借しております

勝手ながらこの場を借りて御礼申し上げます。ありがとうございましたm(_ _)m

 

まんまMMLデータを配列で定義してコンパイルしているので、処理としては全く最適ではない

そのうちPCからMMLをコピペして転送し演奏させるようなことを考えていたけど、非効率なんで恐らく作らないだろうなあ・・・sweat02

|

« Arduino - ブレッドボードでArduino | トップページ | AVR - chiptune »

電子工作」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/204580/41100581

この記事へのトラックバック一覧です: AVR - MMLでPSG音源:

« Arduino - ブレッドボードでArduino | トップページ | AVR - chiptune »