液晶搭載マイコン・モジュール (9) PLAY命令追加
(※これまでの関連記事はカテゴリーの「液晶搭載マイコンモジュール」をご覧ください。)
昨日に引き続きまして液晶搭載マイコン・モジュールのサウンド機能を強化しました。
今回の追加機能はPLAY文です。昔のマイコン時代のBASICにあった”ドレミファソラシド”を文字列の”CDEFGAB”に置き換えて演奏させるあれです。
完成後のサンプル動画(音声付)はこちらです。
これは以下のPLAY文を実行したものです。
i = play("O4L3ED#ED#EO3BO4DCO3A2RCEAB2REG#BO4C2R");
i = play("EO4ED#ED#EO3BO4DCO3A2RO3CEAB2REO4CO3BA2");
■Play文の文法の説明
※できるだけ昔のマイコンのPlayコマンドを思い出して作ったつもりですが、Cのような制限があります。
@音符 : 音符を"CDEFGAB"(=ドレミファソラシド)で表します。
音符の後に#/bを付けると半音上げ/下げとなります。
音符の後に数字(0~6)を付けることでその音符の長さを指定できます。
(音符の数字と長さの関係はC参照。)
音符又は音符の長さの後に”.”を付けると付点音符となります。
数字を付けない場合はCで指定されるデフォルト長になります。
A休符 : "R"の後に数字(0~6)を付けることで休符を指定できます。
(休符の数字と長さの関係はC参照。)
休符または休符の長さの後に”.”を付けると付点休符となります。
数字を付けない場合はCで指定されるデフォルト長になります。
Bオクターブ: "O" の後に数字(1~5)でオクターブ指定となります。
C長さ : "L" の後に数字(0~6)で音符・休符のデフォルト長さ指定になります。
数字は音符の長さを1/(2^n)としたときのnを指定します。
つまり全音符は0、 二分音符は1、四分音符は2、八分音符は3、
十六分音符は4、三十二分音符は5、六十四分音符は6です。
(※一文字で表現することで解析処理を容易にするためにこうしました。)
D音量 : "V" の後に数字(1=LOWまたは2=High)で音量指定となります。
■ソフトの説明
今回のソフトは主に以下3つの機能追加でできています。
@文字列解釈ルーチン
main.c内のplay()関数に作りこまれています。
これはswitch-case文の活用で乗り切りました。
AタイマT16のCH2使ってをPLAY文の音符、休符の長さに合わせたwaitルーチン
main.c 内のplayWait()関数内に作りこまれています。
元々のサンプルにCH0を使ったWait()関数があり、ほとんどその真似っこでできました。
※main.c変更以外にvector.c にCH2割り込み処理関数を定義する必要があります。
B音符ごとの周波数、長さの定義
main.c内のinitPlay()関数内でテーブルに設定しています。
テンポもここで指定します。
ソースを公開しますので、細部は中をご覧ください。
「play.zip」をダウンロード (DL後に開発環境C17WBIFからImportしてください。)
※※注意事項※※
@ このソフトはCQ出版社殿が「液晶マイコン基板特設ページ」で提供されているサンプルコードを
流用して開発されています。
A 個人での使用、改変、流用は自由です(大いにやってください。)が、外部公開する場合は
@のように必ず流用元を明記してください。
B このサンプルコードを使用して万一発生した直接的、間接的ないかなる内容の損失に対しても、
流用元及び当Blogの管理人は一切の保証責任を負いません。
次はBGM機能に挑戦したいと思います。
以上
にほんブログ村 ←記事が面白かったらクリックしてやってください。
コメント