;======================================================================= ; サウンド演奏に関する仕様 v2.0.12 ; 2024/04/05 内藤時浩 ;======================================================================= ------------------------------------------------------------------------ ■ ドライバの動作 ------------------------------------------------------------------------ ・MML解析 MMLデータポインタから、逐次BEEPで音階を鳴らすためのデータを 設定する動作を行います。音階データと音長カウンタを設定すると、 解析は一旦終了となり、次に呼び出されるまで待ち状態となります。 ・BGM演奏 音長は 2msのタイマーにテンポカウンタで待ち時間を 消費した後で -1 されます。zf=1 なら解析を呼び出してから、 再度BEEPを鳴らす動作となります。 BGM演奏は処理を軽くするために、音階の切り替わりで 一度音を出したら、次の音階指定まで音を出さない動作となります。 また、BEEP振動ループテーブルは専用となります。 オクターブの有効範囲も o4-o6 と狭くなります。 <注意> ConvBeepV2 でのコンバートの際は -L=48 を指定するようにしてください。 ※ デフォルトで48になっていますので無指定で構いません。 ConvPlayV2 の Int.(Tempo)は基本 26 です。変更可能です。 Int. の値は、2ms割り込みを使用するため奇数は設定できません。 ・Music 音楽演奏 音楽演奏は、2msタイマーから呼び出しません。 CPU を音楽演奏に専念させます。効果音を同時に再生は出来ません。 また、音楽再生中は割り込みも禁止となります。 <注意> 本ゲームではこの音楽演奏モードは使用しません。 そのため ConvBeepV2 -M:Music は使用禁止とします。 ・Effect 効果音再生 効果音再生は 30ms 毎に単純な音階の羅列を鳴らしていきます。 オクターブも含めた36段階の音階テーブル直接参照のみとなります。 音長指定も使用できません。再生速度は常に固定となります。 使用可能なコマンドは以下の通り 音階 C,D,E,F,G,A,B 休符 R 半音 #,+,- オクターブ O, >, < ------------------------------------------------------------------------ ■ MMLコマンド ------------------------------------------------------------------------ オクターブは O2〜O6 が有効範囲。 テーブルは使用頻度ではなく固定テーブル。 BGMとして使用する際は O4〜O6 とオクターブ範囲が狭くなります。 MML文字列内のスペースはデータコンバート時に無視します。 デフォルトでMMLはオクターブ4音長4がデフォルトです。 ----------------------------------------------------------  CDEFGAB±(n) 音階 発音します。後ろに半音、音長、付点の指定ができます。 ハードウェアの特性上、O2C から O6B の範囲しか使用できません。 半音は単純に音階テーブルの位置を一つ前後にずらす動きをします。 音長を省略すると直前のLの値が使用されます。 ※音長仕様はオクターブ参照 音長はL1の値が割り切れるのであればどんな値で指定しても構いません。 音長指定に()を用いるとダイレクトでカウント値を指定できます。 但し、このダイレクト値を用いると、L1変更に影響を受けないため、 音ズレが発生する可能性があります。 ----------------------------------------------------------  R(n) 休符 音を止めます。止めている長さは音長指定仕様と等価となります。 ----------------------------------------------------------  On オクターブ 2から6が使用できます。 ----------------------------------------------------------  > オクターブ上げる  < オクターブ下げる 現在のオクターブから相対的に変更します。 ----------------------------------------------------------  L(n) デフォルト音長(1〜64) 音長は 1,2,4,8,16,32,64 が指定できます。 付点が指定できます。音長カウンタ値半分が追加されます。 L4.とするとカウンタ値としては 16 + 8 : 24が使用されます。 3... 3回使うとL2になる 6... 3回使うとL4になる 12... 3回使うとL8になる 24... 3回使うとL16になる (n)と記述することで即値が使用されます。 これはカウンタ値そのものとなります。 三連符などが実現できますがテンポ変更に対応できませんので注意が必要です。 ----------------------------------------------------------  [n..] n回繰り返し 最大7回までループできます。ネストは3つまでです。 ネスト数が足りない場合はご相談ください。 ただ、1ネストに付き2バイト(音長省略音階記号4個分)を消費します。 そのため、[2aaaa] と記述するくらいなら aaaaaaaa と記述してください。 理由はループ処理は軽くないためです。 ----------------------------------------------------------  * 最終ループ時にループから抜ける [n..]の中で使用します。nが1の時に]までスキップする動作となります。 ループ外では使用出来ません。 ----------------------------------------------------------  & 前後の音階を繋ぐ 前後の音を繋ぎます。 データ的には前後が同じ音階記号であれば一つの音階としてまとめます。 違う音階の場合は無視されます(エラーになってしまうかも 前後で音階が異なっていた場合は設定は無視されます。 ----------------------------------------------------------  K MMLデータ先頭位置指定 このコマンドが発行されると、 データ先頭位置がこのコマンド以降に設定されます。 以後、再度演奏を行った場合はこのコマンド以降から処理されます。 ※ 初期化に注意 ------------------------------------------------------------------------ ■ 音楽再生データ構造 ------------------------------------------------------------------------ 4bitストリームでデータ解析を行います。 --------------------------------------------------------- ● MMLデータ (発音処理 ・$0-$B 音階指定(音長省略 ・$C 休符(音長省略 ┌─┬─┬─┬─┐ │ 音階 │ └─┴─┴─┴─┘ デフォルト音長を使用している音階指定です。 ・$D,$0-$C,音長 音長付き音階指定 ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│00│01││ 音階 │ └─┴─┴─┴─┘└─┴─┴─┴─┘ 音長指定付きの音階指定です。 音階4bitはデフォルト音長の音階指定と同様です。 音長4bitの先頭が1ならデータが続きます。 ┌─┬─┬─┬─┐ │00│ 音長(0) │ └─┴─┴─┴─┘ ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│ 音長(0) ││00│ 音長(1) │ └─┴─┴─┴─┘└─┴─┴─┴─┘ ┌─┬─┬─┬─┐┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│ 音長(0) ││01│ 音長(1) ││00│ 音長(2) │ └─┴─┴─┴─┘└─┴─┴─┴─┘└─┴─┴─┴─┘ ┌─┬─┬─┬─┐┌─┬─┬─┬─┐┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│ 音長(0) ││01│ 音長(1) ││01│ 音長(2) ││00│ 音長(3) │ └─┴─┴─┴─┘└─┴─┴─┴─┘└─┴─┴─┴─┘└─┴─┴─┴─┘ 例えば音長カウンタが376の場合は、$8, $F, $5 と続きます。 376 % 8 = $0 → $8 376 /= 8 → (47) 47 % 8 = $7 → $F 47 /=8 → $5 --------------------------------------------------------- ● $E コマンドグループ ・$E,$0-$7 オクターブ ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│00││00│ Octave │ └─┴─┴─┴─┘└─┴─┴─┴─┘ オクターブ指定です。3-7 が o2-o6 に対応しています。 ・$E,$8 オクターブUP ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│00││01│00│00│00│ └─┴─┴─┴─┘└─┴─┴─┴─┘ オクターブを+1します。 ・$E,$9 オクターブDOWN ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│00││01│00│00│01│ └─┴─┴─┴─┘└─┴─┴─┴─┘ オクターブを-1します。 ・$E,$A MMLデータ先頭位置 ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│00││01│00│01│00│ └─┴─┴─┴─┘└─┴─┴─┴─┘ MML初期化の状態が変わりますので使用には注意が必要です。 ・$E,$B-$F 空き --------------------------------------------------------- ● $F コマンドグループ ・$F,$0-$7 ループ開始 ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│01││00│ 回数 │ └─┴─┴─┴─┘└─┴─┴─┴─┘ ループの始まりです。回数は 1-8 までとなります。 回数の値は +1 されて使用されます。 ・$F,$8 ループ終了 ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│01││01│00│00│00│ └─┴─┴─┴─┘└─┴─┴─┴─┘ ループの終端です。 ・$F,$9, offset ループ脱出 ┌─┬─┬─┬─┐┌─┬─┬─┬─┐┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│01││01│00│00│01││01│ Ofst(0) ││00│ Ofst(1) │ └─┴─┴─┴─┘└─┴─┴─┴─┘└─┴─┴─┴─┘└─┴─┴─┴─┘ ループ最後でループから脱出します。※ネストには対応していません 現在の位置からのオフセットカウント数で次のコマンド位置となります。 カウント数は4bitデータがいくつ続くかを示します ・$F,$A,音長 デフォルト音長 ┌─┬─┬─┬─┐┌─┬─┬─┬─┐┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│01││01│00│01│00││01│ 音長(0) ││00│ 音長(1) │ └─┴─┴─┴─┘└─┴─┴─┴─┘└─┴─┴─┴─┘└─┴─┴─┴─┘ デフォルト音長指定です。 音長値はカウント値そのものとなります。 音長データ形式は音長付き音階指定と同じ仕様です。 ループ内でデフォルト音長を指定されてもそれ以前の音階には反映されません。 これはコンバート時点で音長CT値が確定するためです。 ・$F,$B-$E 空き ・$F,$F データ終了 ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│01││01│01│01│01│ └─┴─┴─┴─┘└─┴─┴─┴─┘ データ終了となります。 ------------------------------------------------------------------------ ■ 効果音再生データ構造 ------------------------------------------------------------------------ 4bitストリームでデータ解析を行います。 音長変更は出来ません。音長指定もできません。 出来るのは音階、休符、オクターブ関連だけです。 そのためデータ構造もとてもシンプルになっています。 --------------------------------------------------------- ● MMLデータ (発音処理 ・$0-$B 音階指定(音長省略 ・$C 休符(音長省略 ┌─┬─┬─┬─┐ │ 音階 │ └─┴─┴─┴─┘ ・$D オクターブUP ┌─┬─┬─┬─┐ │01│01│00│01│ └─┴─┴─┴─┘ オクターブを+1します。 ・$E,$9 オクターブDOWN ┌─┬─┬─┬─┐ │01│01│01│00│ └─┴─┴─┴─┘ オクターブを-1します。 ・$F, $0-$7 オクターブ ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│01││00│ Octave │ └─┴─┴─┴─┘└─┴─┴─┴─┘ オクターブ指定です。3-7 が o2-o6 に対応しています。 ・$F,$F データ終了 ┌─┬─┬─┬─┐┌─┬─┬─┬─┐ │01│01│01│01││01│01│01│01│ └─┴─┴─┴─┘└─┴─┴─┴─┘ データ終了となります。