| 戻る | |
| 非公開APIによる曲出力 |
Sound(35)APIは、非同期の単音出力APIであり、 呼びだしはすぐにリターンし、バックグラウンドで音が鳴り続けますが、 音が出ている最中に呼び出すと、古い音が鳴り止むまでAPI内部で待ちます。 そのため、ゲームなどの非同期音出力には向きませんし、 いかんせん単音しか出力できません。
DS110OS.S24のバージョン2.1以降には、非公開APIとして曲の演奏があります。 曲が格納されているアドレスをxixに入れてAPI番号100番を呼び出すと、 呼び出しはすぐにリターンしますが、バックグラウンドでは曲が演奏され続けます。
すでにAPI100番で演奏中のものがある場合は、新たな呼びだしは完全に無視され、 以前の演奏が続けられます。 公開APIであるBeep、Click、Soundを呼び出すと、その時点で演奏は中止されます。 そのため、演奏を途中で止めたい場合は、Sound(0,1) を呼び出すようにします。
playmusic(const unsigned char *score)
{
Sound(0,1); //現在の演奏中止
__XIX= (unsigned long)score;
__asm("push xiz");
__asm("ld xiz,(0x600cfc)");
__asm("ld xiz,(xiz+100*4)"); //API100番
__asm("call xiz");
__asm("pop xiz");
}
BeepやSoundで演奏中にAPI100番を呼び出した場合は、
それまでの音出力が中止され曲演奏が開始されるので、
アプリケーション中で上記 playmusic関数だけを利用して音出力をする限りは、
playmusic関数は即座にリターンします。
なお、キークリック音でも演奏が中止されますので、
クリック音が出ないようにユーザが設定する必要があります。
UserExit時にも Sound(0,1) で演奏を止めるのを忘れずに。
※クリック音あり状態でフリッパ開直後の演奏は、 うまくいかないようです。
曲はunsigned charの配列として、次のような構造になります。
unsigned char my_score[]= {
0x00, 0x00, //開始コード
24, 20, //「ド」400msec
22, 10, //「レ」200msec
0, 10, // 休み 200msec
20, 20, //「ミ」400msec
0xe0, 3, //最初から4回くりかえし
19, 10, //「ファ」200msec
24, 10, //「ド」200msec
0xc0, 10,//ファのところから無条件くりかえし
0x80, 0, //終了コード
};
音程と音長の値は公開API Sound(35)のそれと同じです。
0xe0で最初から指定回数だけ繰り返せます。2バイト目には (回数-1) を指定します。 高々1重ループまでです。
0xc0で指定の場所へ無条件へ飛びます。 score + 2 + 2バイト目の値 、が飛び先です。
開始コードの最初のバイト score[0] は、次のような意味を持たせられます。
また、開始コードの2バイト目 score[1] が0x01の場合には、演奏はループします。0x00 ブザー演奏 0x01 スピーカからの演奏 (音は小さい) +0x10 着信LED赤点滅