戻る
非公開APIによる曲出力
開発キットで提供される音出力には、Beep(33)、Click(34)、Sound(35)の3つがあり、 いずれも着信用ブザーから音が出力されます。

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] は、次のような意味を持たせられます。

 0x00 ブザー演奏
 0x01 スピーカからの演奏 (音は小さい)
+0x10 着信LED赤点滅
また、開始コードの2バイト目 score[1] が0x01の場合には、演奏はループします。