前回はBEEP音で疑似和音を作る考え方について書きました。
今回は曲を作る為に実際に疑似和音を鳴らせる様にします。
BEEP音を使った疑似和音で曲を作る(準備)
音を鳴らす為の準備段階 その1
void bwc(int y, int yy, float w) { int x; SET_BUZZER_FREQ(w); //周波数を設定 ENABLE_BUZZER; //ブザーを発振させる for(x = 0; x < y; x++) //y回繰り返す { SET_BUZZER_FREQ(MI_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); //待ち時間 SET_BUZZER_FREQ(DO_FREQ); //音(周波数)を変更する wait_ms(yy); //待ち時間 SET_BUZZER_FREQ(w); //音(周波数)を変更する wait_ms(yy); //待ち時間 } DISABLE_BUZZER; //ブザーの発振を停止させる }
前回特に説明を入れてなかったので、変数について詳しく見ていきましょう。
int y
この数値で音を鳴らす時間を調節します。
ここを大きくする事で長く音を鳴らします。
int yy
これは和音として重ねる音と音の間隔の長さです。
これが短過ぎるとそもそも音が鳴らなかったり、長過ぎると重なって聴こえません。
ここは何かしらハード面などで個体差があるかもしれないので、
外部から入力していつでも簡単に数値調整できるようにします。
float w
ここに音階の周波数を入れます。
直接523.25(ド)等の数値を入れても良いですが、前もって音階を定義したので
DO_FREQ(ド)という記述で入れる事にします。
変数まとめ
この3つが基本的な部分です。
実際曲を作る時に変えるのはyとwだけで、yyは最初の調整段階で決めれば
特に変える事はありません。
音を鳴らす為の準備段階 その2
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);//C和音 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); //待ち時間
メリーさんの羊の出だし部分を書き出しました。
これを使って先ほどの変数に何を入れるか見てみましょう。
試作段階で調整し易くする為に上に変数を並べてますが、この辺は数値が決まれば
どこかに纏めても良さそうですね。
では説明に入ります。
int s,e,q,h
この4つの変数は音の長さを表しています。
eが1拍、4分音符とするならsが1/2拍、8分音符といった感じです。
複雑に音を出す場合、この数値も細かく分ける必要がありますが、
メリーさんの羊ではそこまで必要ないので2つの長さで表現します。
int b
これが、和音を作る為の重ねる音の間隔となります。
最初はこの数値の調整から入る事になると思います。
int cc
鳴らした和音と次の和音との間隔の時間です。
int cc2
音にメリハリをつける為に少し多めに間をとる為の追加時間です。
まとめ
では今の状態でどんな音が出るか聴いてみましょう。
単音で鳴らすより、音楽っぽい雰囲気が出ていると思います。
このやり方で次回はメリーさんの羊を最後まで作っていきます。