液晶搭載マイコン・モジュール (10) BGM機能
(※これまでの関連記事はカテゴリーの「液晶搭載マイコンモジュール」をご覧ください。)
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出版社殿が「液晶マイコン基板特設ページ」で提供されているサンプルコードを
流用して開発されています。
A 個人での使用、改変、流用は自由です(大いにやってください。)が、外部公開する場合は
@のように必ず流用元を明記してください。
B このサンプルコードを使用して万一発生した直接的、間接的ないかなる内容の損失に対しても、
流用元及び当Blogの管理人は一切の保証責任を負いません。
表示と音でやりたいことは大体できてきましたので、そろそろこのモジュールならではの使い方を考えようかと思います。
以上です。
にほんブログ村 ←記事が面白かったらクリックしてやってください。
コメント