前回は疑似和音を鳴らす準備をしました。
今回は曲を作っていきます。
和音を入れた曲を作る
メリーさんの羊を作る最終準備
前回の基礎部分を改変すれば、簡単な曲なら何でも演奏できますが
基礎練習という事で1度メリーさんの羊を作る事にします。
void bw0(int y, int yy, float w) { int x; SET_BUZZER_FREQ(w); //周波数を設定 ENABLE_BUZZER; //ブザーを発振させる for(x = 0; x < y; x++) //X回繰り返す { SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 } DISABLE_BUZZER; //ブザーの発振を停止させる }
前回bwcで和音を鳴らしましたが、和音を鳴らさないタイミングもある為
単音を鳴らすbw0というルーチンも用意します。
概念的に分かり易く上記しましたが、記述を短くしないと気持ち悪い人は改変して下さい。
さらに和音bwgを追加で用意します。
bwcはドミソの和音。bwgはシレソの和音になります。
void bwg(int y, int yy, float w) { int x; SET_BUZZER_FREQ(w); //周波数を設定 ENABLE_BUZZER; //ブザーを発振させる for(x = 0; x < y; x++) //X回繰り返す { SET_BUZZER_FREQ(SIZ_FREQ); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(RE_FREQ); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(SO_FREQ); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 } DISABLE_BUZZER; //ブザーの発振を停止させる }
bwc、bwg、bw0の3つを使い、メインの音階と鳴らす長さを入力して曲を作って行きます
音階と長さを入力していく
int s=5,e=10,q=15,h=20,b=5,cc=5,cc2=20; bw0(e,b,MIX_FREQ); wait_ms(cc); //待ち時間 bwc(s,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(s,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,DOX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(e,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(e,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(e,b,0); wait_ms(cc); //待ち時間 bw0(e,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bwg(e,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bwg(e,b,0); wait_ms(cc+cc2); //待ち時間 bw0(e,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(e,b,SOX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,SOX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(e,b,0); wait_ms(cc+cc2); //待ち時間 bw0(e,b,MIX_FREQ); wait_ms(cc); //待ち時間 bwc(s,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(s,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,DOX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(e,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(e,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bwc(e,b,0); wait_ms(cc); //待ち時間 bw0(e,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bwg(e,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,MIX_FREQ); wait_ms(cc); //待ち時間 bwg(s,b,MIX_FREQ); wait_ms(cc+cc2); //待ち時間 bwg(s,b,REX_FREQ); wait_ms(cc+cc2); //待ち時間 bw0(e,b,DOX_FREQ); wait_ms(cc); //待ち時間 bwg(e,b,DOX_FREQ); wait_ms(cc+cc2); //待ち時間 bwg(e,b,DOX_FREQ); wait_ms(cc); //待ち時間
音階の説明がかなり以前にしかしてなかったので軽く触れておくと
DOXの様にXがつくと無印より高い音になりDOZの様にZがつくと低い音になります。
周波数で言うと、
DOX_FREQ(1046.5)
DOZ_FREQ(261.63)
ですね。
今回は特に何も考えず、楽譜通りの音階で入力しました。
この状態で音を聴いてみましょう。
なかなかそれっぽくなりました。
せっかくなので次回はこの曲を迷路のゴール時に鳴る様にしてみようと思います。