[ 超簡単 Sound Player ]
音を出したいと、ライブラリーを見ながらいじっていたら「もしかしてここに音符を並べたら電子楽器(オルガン)になりそうと思いました。
音楽センスの無い私には、音符を書いた楽譜はありませんが並べれば音が出そうです。童謡程度の低レベルから、工夫すればもう少しましな音が出るかも知れません。音出しです「チャイムの代わりに使って人や犬を呼ぶとか・・・!」使い道は色々あるのではないでしょうか。
それと、デジタルで倍音等が出易いので、オカリナの様なきれいで澄んだ音は期待出来ません。
高温をカットするなど工夫が必要です。[ 音を出す ]
音を出すには[Sound コマンド]を並べれば音は出て来ます。例えば次のようにします。
これを利用して、音楽にしようというものです。
Sound_Play(262,300) ; //とすれば262Hz(ド)の音が300mSecの長さで出ます。続けて音を出すと処理時間が少しあって、多少音が切れますが少し不自然なのでもっと意識的にスペースを入れた方がよさそうです。
音を出す所は圧電ブザーを使いました、音が小さいので板に貼り付けて大きくしたい所です。
PIC12F629の場合、8ピンと小型に出来2.4V(電池/NI-MHなど2本)でも動くので手軽に遊べます。音符は全部で15個程度しか扱えません。工夫すれば何とか増えるかも!
PIC12F638にすると2KBフルに使えるので、音符も100個程度扱えて簡単な童謡は演奏出来るでしょう。インターネットで音符を探したのですが、あまりありません。図書館で本を借りるか、名前を調べ購入するとか、知っている人に聞いた方がよさそうです。
借り物は気合が入らないので、購入する方が良いと思います。
[ 楽譜など ]
音 程 音 階 音階A ド 262 Hz 523 Hz レ 294 587 ミ 330 659 ファ 349 699 ソ 392 784 ラ 440 880 シ 494 988 音符を並べて音楽を作る、ドレミなどの音符を組み合わせて音楽にしますが、Soundコマンドは単に音を出すだけですから、音程や長さを設定しなければなりません。
音程が変わらない場合、連続させた場合良くわからないのでスペースを入れると良い。これでよりオルガンのような感じが出ます。プログラムで音の長さも設定します(上記のとおり)、これとは別にスペースを入れる場合は[delay_ms()]を入れます。
音程の上げ下げは1オクターブになっています。ドから次のドまでは周波数が2倍です。表にはありませんがその上の音も2倍にすれば作れるし、下の音は半分にすれば出来ます。このようにどんどん音域を広げられますがデジタルで単純に音を作っているので、音は歪んで良くありません(念のため!)。
表の周波数は簡略の数字です、本当の音程はもっと細かく設定してあったかと思います。限界がある!
Sound処理にメモリーを800Byteほど使うので音符を幾つも扱えません、PIC12F629(1KB)では15個程度です。上のクラスのPIC12F683は2KBメモリーなので100個ぐらいの音符を扱え、簡単な童謡なら演奏できるかも知れません。サブルーチン化して呼び出す方が少しはましな感じがします。色々工夫をして下さい。
[s_do();]等と呼び出します。使う音符ごと作って利用します。void s_do() { Sound_Play(262,300); Delay_ms(50); }[ ハードの製作 ]
作りかたの説明は不要でしょう。単に圧電ブザーを付けて音出しをしているだけです。
PICは2V程度で動作するので、乾電池2本の2.4Vで音は出ます(5Vでもかまわない)。省エネで良いのですが音量が少ないのが残念です。超簡単に実験出来るので面白いと思います。音楽センスが欲しい私でした・・・。
外部から信号を受け取り、Soundだけを担当させるのも面白い!
2009年6月20日
/* PIC12F629 4MHz 2009/6/10 Last: 6/19 CONFIG : $2007 0x3184 _CPD_OFF _CP_OFF _BODEN_OFF _MCLRE_OFF _PWRTE_ON _WDT_OFF _INTRC_OSC_NOCLOCKOUT ------------------------------------------------- */ void main () { CMCON =0b00000111; //un use Compalater TRISIO=0b00001111; //0=output 1=input Sound_Init(&GPIO,5); //Sound set Sound_Play(262,300); //do Delay_ms(50); Sound_Play(262,300); //do Delay_ms(50); Sound_Play(294,600); //re Delay_ms(50); Sound_Play(262,300); //do Delay_ms(50); Sound_Play(262,300); //do Delay_ms(50); Sound_Play(294,600); //re Delay_ms(2000); //Wait while(1) { } }