10.セマフォについて
TOP
12.赤外線通信について

11.音を鳴らす

RCXには内蔵のスピーカがあり、音を鳴らしたり、音楽なども作成できます。これを用いてLCDだけでなく音で状況などを知らせるのにも使用できます。この項では音の鳴らし方について説明します。

1.用意されているサウンド

 RCXには1つだけシステムサウンドが用意されています。それはビープ音をであり、ボタンを押したときや、スイッチが押されたときなどに使えます。
次のプログラムを作成してください。ここでは作成ファイル名をsound1.cとします。
作成したプログラムsound1.c
#include <dsound.h> // sound function is included

int main(int argc,char *argv[]) {
	dsound_system(DSOUND_BEEP); // System sound is sounded
	return 0;
}
 プログラムを見てもらってわかる通り、『dsound_system()』がシステムサウンドを鳴らす関数です。引数としては『DSOUND_BEEP』という『dsound.h』内ですでに定義されている変数を与えてあります。ヘッダファイルを見てもらうとわかると思いますが、この『dsound_system()』の引数はこれ一つだけしか定義されていません。ですので、この関数は常に『dsound_system(DSOUND_BEEP);』として使うと覚えておいてもらえばよいでしょう。

2.音楽の作成

 音楽の作成にはあらかじめ、音のピッチと音の長さを指定するための変数が用意されています。使用できるのは以下の通りです。

音のピッチ
Sound\Octave 0 1 2 3 4 5 6 7 8
A PITCH_A0 PITCH_A1 PITCH_A2 PITCH_A3 PITCH_A4 PITCH_A5 PITCH_A6 PITCH_A7 PITCH_A8
Am PITCH_Am0 PITCH_Am1 PITCH_Am2 PITCH_Am3 PITCH_Am4 PITCH_Am5 PITCH_Am6 PITCH_Am7 ×
H PITCH_H0 PITCH_H1 PITCH_H2 PITCH_H3 PITCH_H4 PITCH_H5 PITCH_H6 PITCH_H7 ×
C × PITCH_C1 PITCH_C2 PITCH_C3 PITCH_C4 PITCH_C5 PITCH_C6 PITCH_C7 PITCH_C8
Cm × PITCH_Cm1 PITCH_Cm2 PITCH_Cm3 PITCH_Cm4 PITCH_Cm5 PITCH_Cm6 PITCH_Cm7 PITCH_Cm8
D × PITCH_D1 PITCH_D2 PITCH_D3 PITCH_D4 PITCH_D5 PITCH_D6 PITCH_D7 PITCH_D8
Dm × PITCH_Dm1 PITCH_Dm2 PITCH_Dm3 PITCH_Dm4 PITCH_Dm5 PITCH_Dm6 PITCH_Dm7 PITCH_Dm8
E × PITCH_E1 PITCH_E2 PITCH_E3 PITCH_E4 PITCH_E5 PITCH_E6 PITCH_E7 PITCH_E8
F × PITCH_F1 PITCH_F2 PITCH_F3 PITCH_F4 PITCH_F5 PITCH_F6 PITCH_F7 PITCH_F8
Fm × PITCH_Fm1 PITCH_Fm2 PITCH_Fm3 PITCH_Fm4 PITCH_Fm5 PITCH_Fm6 PITCH_Fm7 PITCH_Fm8
G × PITCH_G1 PITCH_G2 PITCH_G3 PITCH_G4 PITCH_G5 PITCH_G6 PITCH_G7 PITCH_G8
Gm × PITCH_Gm1 PITCH_Gm2 PITCH_Gm3 PITCH_Gm4 PITCH_Gm5 PITCH_Gm6 PITCH_Gm7 PITCH_Gm8


その他
名称 変数
休符 PITCH_PAUSE
楽譜終了 PITCH_END


音の長さ
長さ 全音符 2分音符 4分音符 8分音符 16分音符
変数 WHOLE HALF QUARTER EIGHTH

それでは実際に楽譜を作成、演奏させてみましょう。
次のプログラムを作成してください。ここでは作成ファイル名をsound2.cとします。
作成したプログラムsound2.c
#include<config.h>
#include<dsound.h> // sound function is included

static const note_t devil[] = { // Score
  { PITCH_G4, QUARTER },
  { PITCH_G4, QUARTER },
  { PITCH_G4, QUARTER },
  { PITCH_G4, QUARTER },
  { PITCH_G4, HALF },
  { PITCH_G4, HALF },

  { PITCH_G4, HALF },
  { PITCH_G4, HALF },
  { PITCH_G4, HALF },
  { PITCH_G4, HALF },

  { PITCH_F4, QUARTER },
  { PITCH_F4, QUARTER },
  { PITCH_F4, QUARTER },
  { PITCH_F4, QUARTER },
  { PITCH_F4, HALF },
  { PITCH_F4, HALF },

  { PITCH_F4, HALF },
  { PITCH_PAUSE, HALF },
  { PITCH_PAUSE, HALF },
  { PITCH_PAUSE, HALF },

  { PITCH_E4, QUARTER },
  { PITCH_E4, QUARTER },
  { PITCH_E4, QUARTER },
  { PITCH_E4, QUARTER },
  { PITCH_F4, HALF },
  { PITCH_F4, HALF },

  { PITCH_E4, HALF },
  { PITCH_E4, HALF },
  { PITCH_F4, HALF },
  { PITCH_F4, HALF },

  { PITCH_E4, QUARTER },
  { PITCH_E4, QUARTER },
  { PITCH_E4, QUARTER },
  { PITCH_E4, QUARTER },
  { PITCH_F4, HALF },
  { PITCH_F4, HALF },

  { PITCH_E4, HALF },
  { PITCH_PAUSE, HALF }, 
  { PITCH_PAUSE, HALF }, 
  { PITCH_PAUSE, HALF }, 
  { PITCH_END, 0 }
};

int main(int argc,char *argv[]) {
	dsound_set_duration(40);  // speed up
	while(1){
		dsound_play(devil); // play sound
		wait_event(dsound_finished,0);
		sleep(1);
	}
	return 0;
}
 このプログラムは楽譜を演奏し続ける動作をします。楽譜はnote_t型の配列として定義します。定義の仕方は見ての通り{ピッチ,長さ}です。また、楽譜の最後には { PITCH_END, 0 }として楽譜の最後を示さなければなりません。そのほかに、『dsound_set_duration()』関数は引数の数が小さいほど演奏速度が上がります。名前からもわかる通り、『dsound_play()』関数で楽譜の再生、『dsound_finished』関数は楽譜の終了時にウェイクアップするウェイクアップ関数です。これらはbrickOSから提供されています。

3.まとめ

 この章では音の鳴らし方について学習しました。音を効果的に用いることで、プログラムの進行状態を知ったり、パフォーマンスとして用いたりするなどいろいろと応用ができるでしょう。
10.セマフォについて
TOP
12.赤外線通信について