前回曲を作っていくと言っていましたが
その前に少し追加で関数の改造を行います。
疑似和音関数を使って曲を作る
和音の長さが変えられる関数
曲を作っていて、どうしても和音の繰り返し回数を変えたい部分が出てきてしまったので
曲のテンポを一定にする為にグローバル化して固定値を入れた部分を
上から変えられるタイプの関数を用意しました。
全部に適用する訳ではなく、一部なので
変えたい部分だけ新たに作りました。
曲によっては旧関数の様に常に変えられる関数の方が良いかもしれませんが
今回の曲はそこまで出番がないと思い、変えたい関数のみ作りました。
void bwsoukou1bc2(int yyac2, float w1, float w2, float w3)
{
switch(skds2)
{
case 1:
waon2(yyac2,7,w1);
break;
case 2:
waon2(yyac2,4,w2);
break;
case 3:
waons2(yyac2,4,w3);
break;
}
}
yyac2に繰り返したい回数を入れます。
そうなると、waon関数もそれに対応する為
waon2、waons2関数を新たに作ます。
void waon2(int yyas2,int krk, float oto1)
{
SET_BUZZER_FREQ(oto1);
ENABLE_BUZZER;
if(sktm0 == 0){
sktm0 = timer;
}
else{
sktm = timer - sktm0;
}
if(sktm > yyas2*krk){
skds2++;
sktm=1,sktm0=0;
DISABLE_BUZZER;
}
}
void waons2(int yyas2,int krk, float oto1)
{
SET_BUZZER_FREQ(oto1);
ENABLE_BUZZER;
if(sktm > yyas2*krk){
DISABLE_BUZZER;
sktm=1,sktm0=0;
skds++;
if(skds > yya0){
skds=1;
skds2=1;
skd++;
}
else{
skds2=1;
}
}
else{
if(sktm0 == 0){
sktm0 = timer;
}
else{
sktm = timer - sktm0;
}
}
}
これで長さを変えられます。
実際の使い方としては
とすれば、元々の固定回数yyaの2倍の長さで和音を鳴らすという事になります。
そのまま好きな数字を入れても良いので、細かい調整が可能になります。
曲を作る
これで準備が整ったので、曲を作っていきます。
旧和音関数をどの様に改変したか、が理解出来ていれば
構造的にはそのままさらに輪が広がっただけ、というだけの話で済みます。
void appealsktes(void)
{
yya=2;
yya0=3;
switch(skd)
{
case 1:
bwsoukou(MIZ_FREQ,SO_FREQ,REXE_FREQ);
break;
case 2:
bwsoukou(SOZ_FREQ,SIZ_FREQ,RAE_FREQ);
break;
}
}
グローバル変数のyyaとyya0だけ最初に数値を入れます。
これは旧和音関数で毎回入れていた和音の繰り返しに関する変数です。
本来ならこの関数より外側で定義してもいいのですが、
曲を作っている時に自分が参照し易い様に今はここに置いています。
そしてskdという変数がここでようやく出番になりました。
skdは一番大きな曲の進行度になります。
和音関数の中で最後の最後にプラス処理されていたのは、こういう事です。
これでswitchを使い、参考資料を見ながら音階は以前通りの方法で曲が作れます。
今回は以前作った某ゲーム曲を真・新和音関数に移植しようと思います。
1から作る人には再び参考資料として
こちらを紹介しておきます。
楽譜よりもこちらの方が自分は打ち込み易いので非常に助かります。
旧和音関数で作った時の音源も参考にどうぞ↓
現在、こちらの移植作業をしているのですが、wait_msで時間制御していた時と
かなり勝手が変わってしまい、同じ聴こえ方には出来なくなっているので
音階自体はそのままベタ移植ですが、テンポや音の強さは調整し直しています。
まとめ
移植している間にどんどん問題が出て修正をしたりしているので
曲の完成まで多少時間が掛かるかもしれませんが
次回は出来た曲を紹介出来たらと思います。
