PI:Co製作(宇野)

Pi:Co製作(宇野)マイクロマウス研修Part34 走行中に曲を流す準備

Pi:Co製作(宇野)マイクロマウス研修Part34 走行中に曲を流す準備 PI:Co製作(宇野)

かなり間が開きましたので、何をしていたかの復習をしてから本題に入りましょう。

 

同時に1つの音しか出せないBEEP音を使って和音を作る。

という事からスタートし、疑似和音の考え方を構築

実際にその考え方を形にして疑似和音を作成、

それを用いて曲を作り、走りながら曲が流せないか

という事を夢想したところまでが前回までのお話。

今回は曲を走りながら鳴らす為にはどうすればいいか。

という事について掘り下げていこうと思います。

和音関数の分割

これまで使ってきた和音関数は一定時間内に複数の音を連続で

何度も鳴らす事で和音を実現していました。

しかし、このままでは拘束時間が長いので、どこかにこの関数を投入すると

まともに走らなくなります。

そこで、連続で鳴らしていた音を1つ1つに分けて

最小単位で鳴る様にし、他の処理から戻ったら続きから鳴る

という仕組みを作ってみたいと思います。

和音関数分割の仕方

void bwsoukou(int y, int yy, float w1, float w2, float w3)

これまで使ってきた関数だとyが和音を何回鳴らすか、

yyが1つの音を鳴らす長さになるのですが

今までだと、これが全部鳴り終わるまでこの関数内で回っていました。

これを1音1回で関数を出て、どこまで鳴ったかを記録し

再びこの関数に入った時に途中から鳴る

というものを新たに考案

void bwsoukou1(int y, int yy, float w1, float w2, float w3)
{
	switch(skds2)
	{
		case 1:
			SET_BUZZER_FREQ(w1);
			ENABLE_BUZZER;
			wait_ms(yy*3);
			skds2++;
			break;
		case 2:
			SET_BUZZER_FREQ(w2);
			ENABLE_BUZZER;
			wait_ms(yy*3);
			skds2++;
			break;
		case 3:
			SET_BUZZER_FREQ(w3);
			ENABLE_BUZZER;
			wait_ms(yy*4);
			skds++;
			skds2=1;
			if(skds > y){
				skds=1;
				skd++;
			}
			break;
	}
	DISABLE_BUZZER;
}

どこからでもこの関数が使える様にskd,skds,skds2はグローバル変数です。

この関数に入る度にカウントが増えて1音鳴らして出ていきます。

skds,skds2はこの関数内部で回るものですが、skdは次の関数へ行く為の

曲の進行度となる変数です。その解説は次回したいと思います。

まとめ

次回は今回作った走行用新和音関数を使い曲を作っていきます。

作るというよりは、以前作った曲をバラバラにして構成し直す。

と言った感じになりますので、これまでの曲の作り方を追ってきた人には

分かり易い内容になるかと思います。

 

タイトルとURLをコピーしました