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