12/10/1999 by Shigeyuki Seko
7) 絵本に音を付ける
- さて、いよいよ絵本に音を付けてみましょう。
以下に book.c の Cソースプログラムを示します。これを元に修正します。
/******************************
Picture Book program
TAB = 4
Shigeyuki Seko
12/6/1999
******************************/#include <Pilot.h>
#define MaxPage 10Int Page;
static void drawBitmap(Int x, Int y, Int id)
{
VoidHand h;
VoidPtr p;
h = DmGet1Resource('Tbmp', id);
if(h != NULL){
p = MemHandleLock(h);
WinDrawBitmap((BitmapPtr)p, x, y);
MemHandleUnlock(h);
DmReleaseResource(h);
}
}/********************************
Start
********************************/static void StartApplication(void)
{
FormPtr frm;
FieldPtr opPtr;
frm = FrmInitForm(1000);
FrmSetActiveForm(frm);
FrmDrawForm(frm);
drawBitmap(5, 20, 7000);
Page=0;
}
- まず音を出す関数 SndOutput を作ります。
void SndOutput (long freq,int time,int Laud)
{SndCommandType s;
s.cmd = sndCmdFreqDurationAmp;
s.param1 = freq; /* freq (Hz) */
s.param2 = time; /* time (ms) */
s.param3 = Laud; /* Laud */
SndDoCmd(0,&s,true);}
これだけです!
これで freq に周波数、time に音の長さ、Laud に音の大きさを入れれば音がなります。
例えば、Aの音(ハ長調のラ)の音を100msec 音の大きさ 50 で出す場合、Aの音は440Hz ですからSndOutput (440,100,50);
簡単でしょう。;)
では早速、作った SndOutput の関数を book.c の drawBitmap 関数の後ろに書き込みます。
実際に書き込んだ様子を以下に示します。
/******************************
Picture Book program
TAB = 4
Shigeyuki Seko
12/6/1999
******************************/#include <Pilot.h>
#define MaxPage 10Int Page;
static void drawBitmap(Int x, Int y, Int id)
{
VoidHand h;
VoidPtr p;
h = DmGet1Resource('Tbmp', id);
if(h != NULL){
p = MemHandleLock(h);
WinDrawBitmap((BitmapPtr)p, x, y);
MemHandleUnlock(h);
DmReleaseResource(h);
}
}void SndOutput (long freq,int time,int Laud)
{SndCommandType s;
s.cmd = sndCmdFreqDurationAmp;
s.param1 = freq; /* freq (Hz) */
s.param2 = time; /* time (ms) */
s.param3 = Laud; /* Laud */
SndDoCmd(0,&s,true);}
/********************************
Start
********************************/static void StartApplication(void)
{
FormPtr frm;
FieldPtr opPtr;
frm = FrmInitForm(1000);
FrmSetActiveForm(frm);
FrmDrawForm(frm);
drawBitmap(5, 20, 7000);
Page=0;
}
- 次に、この音をどんな場合に鳴らすかを決めます。スタート時に鳴らしてもいいですし、ページ切り替え時に鳴らしても OK です。ここでは例としてハードウェアーキーでページをアップダウンした時に音が出るようにしてみます。
book.c では Boolean MainFormHandleEvent の中でハードウェアーキーをチェックしていますのでそこに記述します。
以下に book.c の Boolean MainFormHandleEvent を示します。
/********************************
Event Loop
********************************/static Boolean MainFormHandleEvent(EventPtr event)
{
Boolean handled = false;
Err error;
FormPtr frm;if(event->eType == ctlSelectEvent){
if(event->data.ctlEnter.controlID == 5000){ /* Go Start Page */
Page=1;
drawBitmap(14, 25, 7000+Page);
}
else if(event->data.ctlEnter.controlID == 5001){ /* Back */
PageDown();
}
else if(event->data.ctlEnter.controlID == 5002){ /* Next */
PageUp();
}
}
else if(event->eType == keyDownEvent){
if (event->data.keyDown.chr == pageUpChr){ /* Scroll up key presed */
PageUp();
handled = true;
}
else if (event->data.keyDown.chr == pageDownChr){ /* Scroll down key presed */
PageDown();
handled = true;
}
}
else if (event->eType == menuEvent){ /* Menu event */
switch (event->data.menu.itemID){
case 3601: /* about */
frm = FrmInitForm(3000);
FrmDoDialog(frm);
FrmDeleteForm(frm);
break;
case 3602: /* Go Start Page */
Page=1;
drawBitmap(14, 25, 7000+Page);
break;
case 3603: /* Back */
PageDown();
break;
case 3604: /* Next */
PageUp();
break;
}
handled = true;
}
else if(event->eType == nilEvent){
handled = true;
}
return handled;
}
上記リストの太字で強調された部分がハードウェアーキーの状態をチェックしている部分です。
if (event->data.keyDown.chr == pageUpChr){ /* Scroll up key presed */
PageUp();
handled = true;
}この pageUpChr の部分が UP キーが押された時に実行されます。
else if (event->data.keyDown.chr == pageDownChr){ /* Scroll down key presed */
PageDown();
handled = true;
}この pageDownChr の部分が Down キーが押された時に実行されます。
従ってここで音を出す関数を呼び出せば、音を出す事ができます。- 実際の例を以下に示します。
else if(event->eType == keyDownEvent){
if (event->data.keyDown.chr == pageUpChr){ /* Scroll up key presed */
SndOutput (400,100,50);
SndOutput (1000,100,50);
PageUp();
handled = true;
}
else if (event->data.keyDown.chr == pageDownChr){ /* Scroll down key presed */
SndOutput (1000,100,50);
SndOutput (400,100,50);
PageDown();
handled = true;
}
}コンパイルして動作させてみてください。ハードウェアーキーの UP と DOWN で違う音が出ると思います。