前回、移植での再現度が低くて調整に難航している旨を伝えていましたが
その原因から説明していこうと思います。
疑似和音で曲を作る
これまでの和音関数と進行の問題
最初に作った疑似和音を鳴らす関数は他の全ての処理を止めて行うもので
ゴールアピール等にしか使えないものでした。
そこで、内部の処理を細分化し記録する事で細かい行き来ができ、
走行中でも鳴らせる様に改造してきました。
最初の和音関数は鳴らした後にwait_msで一瞬止まっていたのですが
wait_ms(cc2); //待ち時間
bwdqz0(s,b,RE_FREQ);
wait_ms(cc2); //待ち時間
真・新和音関数は音と音の間の「間」が無いのです。
bwsoukou(MIZ_FREQ,SO_FREQ,REXE_FREQ);
break;
case 2:
bwsoukou(SOZ_FREQ,SIZ_FREQ,RAE_FREQ);
break;
switchを使い、カウントで次の音にそのまま行く関係上
「間」を入れるなら「間」の分switchのカウントを追加する必要があり
カウント数が2倍になってしまい、既に作った曲に追加でそれを入れようとすると
手入力では途方もない作業になります。
という事で、「間」を入れずに解決しようと調整していました。
ですが、常に音が繋がっていると以前作った物の様な音が
どうしても出ないという事態に陥り
ついに別の手法でこれまで通り和音間の「間」を作り上げました。
真・新和音関数改2
もうこれバージョン表記の方がいいんじゃないかって鬱陶しさですが
気にしません。
今回の改良点でほぼ以前の和音関数で作った曲の丸移植が可能になります。
waons関数の一部に手を加え、音を鳴らし終わって次の関数に行く前に
事前に設定した時間音を止めます。
つまり
wait_ms(cc2); //待ち時間
wait_msの部分をwaons関数に内蔵しました。
void waons(int krk, float oto1) { SET_BUZZER_FREQ(oto1); ENABLE_BUZZER; if(sktm > yya*krk){ DISABLE_BUZZER; if(skds > yya0){ sktm = timer -sktm0; if(sktm > (yya*krk)+wtms) { sktm=1,sktm0=0; skds=1,skds2=1; skd++; } } else{ sktm=1,sktm0=0; skds++; skds2=1; } } else{ if(sktm0 == 0){ sktm0 = timer; } else{ sktm = timer - sktm0; } } }
wtmsというグローバル変数を作り、和音を鳴らし終わった後に
その変数分、音を鳴らさない時間を作ります。
これで元の曲を移植すれば、そのまま同じ音が出ると思っていましたが
そうはならなかったので、微調整が必要そうです。
まとめ
現在のそのままの移植での音はこの様になっています。
移植前も自分が思う音にはなっていなかったのですが、丸移植状態だと
さらに遠ざかって行っているので、しばらく音探しの旅に出たいと思います。
走りながら音楽を鳴らす前準備でえらく時間が掛かってますが
最低限自分が納得する音が出したいのでしばらくお待ち下さい。