上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top



 (※これまでの関連記事はカテゴリーの「液晶搭載マイコンモジュール」をご覧ください。)



 PLAY文まで動作しましたので、それを改良してBGM演奏ができるようにしました。



 



 前回はPLAY文で指定した楽譜が演奏しおわるまで止まってしまい、次の処理には行けませんでした。今回のものではPLAY文は解析までで、演奏は割り込み処理で行いますので、演奏しながら処理を進められます。つまりBGM演奏ができます。なお、BGM以外の音楽をすぐに演奏したいこともあると考え、FGM(ForeGroundMusic)をBGMに優先して演奏する機能も付けました。



 動作サンプルは以下の通りです。


 



■ソフトの方式



 前回の物は、PLAY文の中で、1音を解釈するたびに発声し、音符の長さだけタイマーでウェイトを入れる方式になっていました。これですと演奏し終わるまでPLAY文から抜けることができません。



 今回の物では、PLAY文では解釈した内容をバッファ(BGM_buffer_xx,FGM_buffer_xx)に格納して終了します。PLAY文では演奏しません。



 バッファに格納されたデータの演奏はT16.CH2のタイマー割り込みで行います。ソース内での関数は、void t16ch2Int(void) です。このタイマーは前回のものではワンショットにしてPLAY文の中で音符ごとに長さを設定していましたが、今回はこれをリピートモードで使っています。



 



 タイマー割り込み周期を、PLAY文がサポートする最短の長さ=1/64音符に設定しており、その割り込みの中でカウンタを持たせて、音符の長さをカウントするようにしました。1音符が終わるたびにバッファから次の音符データを取り出して演奏します。



 



割り込み処理の中では、FGM/BGM両方に対応します。FGMが鳴っている間BGMは発声を押さえますが、発声以外のシーケンスは変わらず動かすことでBGMのリズムを崩さないようにしています。



 



■ソースについて



 今回もソースを開示しますので、細部は中をご覧ください。



「PLAY2.zip」をダウンロード (DL後に開発環境C17WBIFからImportしてください。)



今回大幅に修正、追加したのは以下の関数です。



void t16ch2Int(void)



int play(int BGM_FGM,unsigned char *str)



void playOnOff(int ON_OFF)



※※注意事項※※



   ① このソフトはCQ出版社殿が「液晶マイコン基板特設ページ」で提供されているサンプルコード
      流用して開発されています。



   ② 個人での使用、改変、流用は自由です(大いにやってください。)が、外部公開する場合は
      ①のように必ず流用元を明記してください。 



   ③ このサンプルコードを使用して万一発生した直接的、間接的ないかなる内容の損失に対しても、
      流用元及び当Blogの管理人は一切の保証責任を負いません。





 



表示と音でやりたいことは大体できてきましたので、そろそろこのモジュールならではの使い方を考えようかと思います。



 



以上です。



 





にほんブログ村 その他趣味ブログ 電子<br /><br />工<br /><br />作へ
にほんブログ村 ←記事が面白かったらクリックしてやってください。





2010.04.21 Wed l 液晶搭載マイコンモジュール l コメント (0) トラックバック (0) l top

コメント

コメントの投稿












トラックバック

トラックバック URL
http://diyelec.blog.fc2.com/tb.php/84-fb16b188
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。