8.LCDの使用 TOPへ 10.マルチタスク

9.音を鳴らす


NXTはスピーカーを内蔵しているので、音を鳴らすことができます。ここでは音を鳴らすプログラムを学習します。


1.音を鳴らす

まずは、単純に音を鳴らすプログラムを作成します。 次のプログラムを作成してください。ここでは sound1.c とします。
sound1.c
#define TEMPO 100

task main(){
	nVolume = 2;

	PlayTone(440,TEMPO);
	wait10Msec(TEMPO);
}

今回新たに用いたAPIなどについて解説します。

nVolume = 2
NXTのボリュームを指定します。ボリュームは0〜4までの整数で指定します。

PlayTone(440,TEMPO)
指定した周波数の音を鳴らすAPIです。
第1の引数は音の周波数を指定します。今回は440Hzなので、ラの音が鳴るようになっています。
第2の引数は音を鳴らす時間を指定します。時間は10msec単位で指定します。

これで単純に音を再生することができました。PlayTone関数は鳴り終わるまで待つ動作をせず、 また10msec単位で指定するので、Wait10Msec関数と同様に使うとよいです。 また今回のように、音を鳴らす時間をマクロで指定しておけば、テンポを変えるのに便利です。
PlayTone関数の周波数指定で音を出すときに音階に従って指定したい場合は、次の表を参考にすると良いでしょう。

音と周波数の関係
音階 オクターブ
3 4 5 6
B 247 494 988
A# 233 466 932
A 220 440 880 1760
G# 415 831 1661
G 392 784 1568
F# 370 740 1480
F 349 698 1397
E 330 659 1319
D# 311 622 1245
D 294 584 1175
C# 277 554 1109
C 262 523 1047




2.メロディーを作成する

先ほどの機能を用いれば、メロディーを作成することができます。
それでは次のプログラムを作成してください。ここでは sound2.c とします。
sound2.c
#define TEMPO 25

void RingTone(int freq, int time){
	PlayTone(freq, time-5);
	wait10Msec(time);
}

void FlogSong(){
	RingTone(523, TEMPO*2);
	RingTone(587, TEMPO*2);
	RingTone(659, TEMPO*2);
	RingTone(698, TEMPO*2);
	RingTone(659, TEMPO*2);
	RingTone(587, TEMPO*2);
	RingTone(523, TEMPO*3);
	wait10Msec(TEMPO);

	RingTone(659, TEMPO*2);
	RingTone(698, TEMPO*2);
	RingTone(784, TEMPO*2);
	RingTone(880, TEMPO*2);
	RingTone(784, TEMPO*2);
	RingTone(698, TEMPO*2);
	RingTone(659, TEMPO*3);
	wait10Msec(TEMPO);

	RingTone(523, TEMPO*2);
	wait10Msec(TEMPO*2);
	RingTone(523, TEMPO*2);
	wait10Msec(TEMPO*2);
	RingTone(523, TEMPO*2);
	wait10Msec(TEMPO*2);
	RingTone(523, TEMPO*2);
	wait10Msec(TEMPO*2);

	RingTone(523, TEMPO);
	RingTone(523, TEMPO);
	RingTone(587, TEMPO);
	RingTone(587, TEMPO);
	RingTone(659, TEMPO);
	RingTone(659, TEMPO);
	RingTone(698, TEMPO);
	RingTone(698, TEMPO);
	RingTone(659, TEMPO);
	wait10Msec(TEMPO);
	RingTone(587, TEMPO);
	wait10Msec(TEMPO);
	RingTone(523, TEMPO*3);
	wait10Msec(TEMPO);
}

task main(){
	nVolume = 2;

	FlogSong();
}

プログラムを動かすとご存知「カエルの歌」が再生されると思います。このようにしてメロディーを再生することができます。
メロディーのプログラムは長くなってしまうことが多いため、上記のように別の関数にしておくと便利です。 また、メロディーをヘッダに記述しておき、プログラム内ではインクルードして使用するだけにしておけば、さらに分かりやすくなります。



8.LCDの使用 TOPへ 10.マルチタスク