サウンドインダイレクトライブラリ(soundIL)はHBLANK割り込みを利用して、演奏データに基づいた音楽演奏を行うドライバです。SoundILの使用法についてはワンダーウィッチのマニュアルに詳しい説明がありますが、ここでは実際のプログラミング例を紹介します。 インダイレクトライブラリ使用の準備
サウンドインダイレクトライブラリを使うためには次の準備が必要です。
|
サウンドインダイレクトライブラリでは携帯電話の着メロデータとしても使われている、MML(Music Macro Language)で記述したシーケンスデータをBGM(4トラック)、効果音(2トラック)
として 出力することができます。
ドレミファソラシ(CDEFGAB)をBGMとして繰り返し(PLAY_LOOP)演奏させる例を示します。
|
次の例ではキーを押すことにより、簡単な効果音(MML)を鳴らします。 効果音はチャンネル3に設定し、se_play関数で出力します。2つめの値は 登録してある効果音の番号 (0〜効果音の数-1)です。
|
次のプログラムははBGMを演奏しながら、効果音を鳴らす例です。
|
リソースファイルを読みこんで鳴らすプログラムです。 Waveファイルはサウンドレコーダーなどでワンダースワンで使える形式『8bit,サンプリング12KHz』 にし、付属ツールのSndcnvを使ってリソースファイル(.fr)に変換します。 作成したリソースファイルはあらかじめワンダースワンへ転送しておきます。 |
#include "il_sound.h" #include "sys/bios.h" #include "stdio.h" static BYTE buf[20000]; SoundIL soundIL; void main(void) { int iFd; if ( open_sound_il( &soundIL ) != E_FS_SUCCESS ) return; sounddrv_init(); sound_open(); if((iFd = open("abu.fr", FMODE_R, 0)) >= 0) { read(iFd ,buf , 20000 ); /* リソースファイルを開く */ close(iFd); } while(key_wait() != KEY_START) { voice_play (buf, 0); /* PCMボイス再生 */ } /* パラメータ0は未使用 */ sound_close(); sounddrv_release(); } |
『スクリーンの機能』で紹介した「宇宙飛行」のサンプルにサウンドを付けてみました。 ただ繰り返し演奏させているだけですが、けっこう雰囲気がでています。 |
#include "sys/bios.h" #include "stdlib.h" #include "il_sound.h" static BYTE bgmbuf[500]; SoundIL soundIL; #include "star0.h" #include "star1.h" unsigned star0[]={2}; unsigned star1[]={3}; #include "rocket.h" unsigned char bmp_black[]={ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; void main() { int x,y,i,j,k; display_control( DCM_SCR2 | DCM_SPR ); font_set_monodata( 1, 1, bmp_black); /* 背景の黒 */ font_set_colordata( 2, 1, bmp_star0); /* 小さな星 */ font_set_colordata( 3, 1, bmp_star1); /* 大きな星 */ font_set_colordata(4, 4*4, bmp_rocket); /* ロケット */ for(i=0;i<16;i++) sprite_set_char(i,(i+4) | 4<<9 | CFM_SPR_UPPER); sprite_set_range( 0, 16 ); screen_fill_char(SCREEN2, 0, 0, 32, 32, 1); /* 全てを黒に */ for(i=0;i<200;i++){ x = rand() % 31; y = rand() % 31; star0[0]= 2 | (rand()%3)<<14; if(i<180) screen_set_char(SCREEN2, x, y, 1 , 1 , star0); /* 小さな星を表示 */ else screen_set_char(SCREEN2, x, y, 1 , 1 , star1); /* 大きな星を表示 */ } x=30; y=56; /* ロケットを表示 */ for ( i=0; i<4; i++ ) { for ( j=0; j<4; j++ ) { sprite_set_location( i*4+j, x+j*8, y+i*8 ); } } if ( open_sound_il( &soundIL ) != E_FS_SUCCESS ) return; sounddrv_init(); sound_open(); /* バッファへ演奏データを格納 */ parse_mml( bgmbuf, "#1f12f12f12a+2>f4d+12d12c12a+2f4 d+12d12c12a+2f4d+12d12d+12c2r6", 0 ); bgm_play( bgmbuf, PLAY_LOOP ); /* BGM演奏開始(ループ) */ x=0; y=0; while( (k=key_press_check() ) != KEY_START ){ /* STARTボタンで終了 */ switch (k) { case KEY_RIGHT2:x+=1; break; /* キー入力でスクロール */ case KEY_DOWN2: y+=1; break; case KEY_UP2: y-=1; break; } x+=1; /* 常に前進するようスクロール */ screen_set_scroll(SCREEN2, x, y); sys_wait(2); /* タイムディレイ */ } sound_close(); sounddrv_release(); } |