前回から再始動しました、宇野のブログです。よろしくお願いします。
Pi:Co Classic3のサンプルプログラムを使ってのお話になります。
BEEP音で和音を鳴らす
BEEP音を鳴らす(復習)
まず音階の周波数は調べたら簡単にわかるので、それを使い易い様に登録します。
#define DO_FREQ (523.25) //ド
#define DOE_FREQ (554.37) //ド#
#define RE_FREQ (587.33) //レ
#define REE_FREQ (622.25) //レ#
#define MI_FREQ (659.26) //ミ
#define FA_FREQ (698.46) //ファ
#define FAE_FREQ (739.99) //ファ#
#define SO_FREQ (783.99) //ソ
#define SOE_FREQ (830.61) //ソ#
#define RA_FREQ (880.00) //ラ
#define RAE_FREQ (932.33) //ラ#
#define SI_FREQ (987.77) //シ
#define DOE_FREQ (554.37) //ド#
#define RE_FREQ (587.33) //レ
#define REE_FREQ (622.25) //レ#
#define MI_FREQ (659.26) //ミ
#define FA_FREQ (698.46) //ファ
#define FAE_FREQ (739.99) //ファ#
#define SO_FREQ (783.99) //ソ
#define SOE_FREQ (830.61) //ソ#
#define RA_FREQ (880.00) //ラ
#define RAE_FREQ (932.33) //ラ#
#define SI_FREQ (987.77) //シ
一部書き出しましたが、これは以前キラキラ星を演奏した時と変わってません。
そして、音を鳴らすのも
SET_BUZZER_FREQ(DO_FREQ); //音(周波数)を変更する
SET_BUZZER_FREQを使うのは変わりません。
後は、音を鳴らす長さを何らかの方法で調整して効果音や音楽を鳴らします。
単音で鳴らす場合は音階と長さの調整だけで終わります。
BEEP音で和音?
そもそも単音しか鳴らせないBEEP音でどうやって複数の音を重ねるか
という事ですが、例えば絵の世界で言えば色数が少なかった時に
グラデーションをするのに2つの色を交互に置いたり配置、間隔を変える事で
さも徐々に色が変わってるかの様に見せていました。
つまり、それと考え方としては同じ事を音ですれば良いのです。
一定の時間内に、複数の音階を繰り返し鳴らす事で
さもいくつもの音が重なっているかの様に聴かせます。
疑似和音
どの様に鳴らすかの考え方が分かった所で
早速鳴らしてみましょう。
和音(コード)と曲のメイン音階の4つを鳴らす事を想定して
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 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; //ブザーの発振を停止させる
}
というのを作り、外から音の長さの調整とメイン音階を入れれる様にしました。
これで、とりあえずは疑似的に和音が鳴らせます。
まとめ
今回は音階の復習と疑似的に和音を鳴らす考え方について書きました。
次回はこれを使って曲を作ってみましょう。