前回疑似和音の曲を作る。又は移植したという体で
話を進めていきましょう。一旦音の調整は置いときます。
という訳で準備に時間が掛かりましたが、ついに走る時がやってまいりました。
曲を鳴らしながら走らせる
下準備終了、その後はどうする
曲は出来ました。
では、これをどうすれば走りながら鳴らせるか
という事ですが
走りながら鳴らすのにとても適したルーチンがあります。
サンプルプログラムのrun.cにあるstraight関数です。
と言うか、移動系関数全般に和音関数を投入します。
ですが、実はこれだけだと鳴らし続けられません。
DataFlash.cにあるmap_write関数が実は曲者で
このデータの消去、書き込みの作業に時間が掛かり
一瞬音が止まってしまいます。
なので、この関数の中にも和音関数を忍ばせます。
と言っても、ゴール時とスタートに帰った時くらいしか使われないので
ゴール時に曲を止めて別の処理や曲を鳴らす場合、この場所は放置でも良いです。
和音関数を入れる
では実際に和音関数を入れましょう。
例としてstraight関数に入れますが
迷路走行に使っている移動系関数には例を参考に全部入れていきましょう。
while( (len – STEP2LEN(step_r + step_l) ) > ( ( (tar_speed*tar_speed) – (speed*speed) ) / (-2*1000*accel) ));
r_accel = -accel; //減速する
while((step_r + step_l) < obj_step) ; //目標地点まで走行
この部分に和音関数を入れます
while( (len – STEP2LEN(step_r + step_l) ) > ( ( (tar_speed*tar_speed) – (speed*speed) ) / (-2*1000*accel) ))
{
appealsktes();
}
r_accel = -accel; //減速する
while((step_r + step_l) < obj_step) //目標地点まで走行
{
appealsktes();
}
これで真っ直ぐ走っている間、音が鳴り続けます。
同じ様に移動系関数に和音関数を入れていきます。
後は、先ほど言ったマップの書き込み関数map_writeの中の
for(i=0;i<8;i++){
erase((unsigned short *)(MAP_ADD+i*32));
}
//マップデータをDataFlashに書き込む
for(i=0;i<128;i++){
write_eeflash((unsigned short *)(MAP_ADD+i*2),*map_add);
map_add++;
}
という部分に
for(i=0;i<8;i++){
erase((unsigned short *)(MAP_ADD+i*32));
appealsktes();
}
//マップデータをDataFlashに書き込む
for(i=0;i<128;i++){
write_eeflash((unsigned short *)(MAP_ADD+i*2),*map_add);
map_add++;
appealsktes();
}
和音関数を追加します。
実際の走行
これで、簡単にですが迷路探索中、ずっと曲が鳴り続ける様になった筈です。
では実際に走らせてみます。
問題なく鳴っています。
しかし疑似和音は1つの音源でいくつもの音階を鳴らしたり止めたりしている関係上
音量があまり出ないのでモーター音で潰されがちですね。
曲によっては音の出し方を考えた方が良いかもしれません。
まとめ
曲自体のチューニングや迷路走行の課題などがありますが
これで一区切りつきました。
今後は、時間をみて両方を少しずつ進めて行きたいと思います。