



NDP (PSG Driver for MSX) / #MSXNDP          Programmed by naruto2413
--------------------------------------------------------------------
version 1.05                                                 MML書式




行頭の文字でその行の意味を指定し、定義データやMMLを記述していく方式。

※より詳細な説明は、helpフォルダ内の help.html をご参照ください。




・定義

#<ヘッダ名> <値>     ヘッダ定義
1～3 <MML>           ノーマルトラック定義 (PSG Ch.A～C)
R <MML>              リズムトラック定義 (発音中のみPSG Ch.Cに割り込み)
@<番号>=<データ>     音色定義1 (フレーム方式ソフトエンベロープ)
@E<番号>=<データ>    音色定義2 (ADSR方式ソフトエンベロープ)
@M<番号>=<データ>    ビブラート定義
@P<番号>=<データ>    ピッチエンベロープ定義
@N<番号>=<データ>    ノートエンベロープ定義(数値)
@A<番号>=<データ>    ノートエンベロープ定義(音名)
@R:<音名>=<データ>   リズム音色定義
VS<番号>=<データ>    音量シーケンス定義
QS<番号>=<データ>    Qシーケンス定義
@QS<番号>=<データ>   @Qシーケンス定義
$<マクロ名>=<MML>    マクロ定義
?<マクロ名>=<文字列> ステップマクロ定義
;                    コメント行
//                   コメント行 (;と同じ)
{ ～ }               改行可能エリア

	[例]
	1 CDE 
	;PSG Ch.Aでドレミ

	[例]
	13 CDE
	;PSG Ch.AとCh.Cでドレミ

	[例]
	1  V15
	2  V12 R8.
	12 CDE
	;PSG Ch.Aで V15CDE
	;PSG Ch.Bで V12R8.CDE

	[例]
	@0=FEDCCBB
	;0番に「V15 V14 V13 V12 V12 V11 V11」と7フレームかけて遷移する音色を定義

	[例]
	@R:B=V15 :400, V12 :800
	;リズムトラックのBに「V15でピッチ400、V12でピッチ800」という2フレームの音色を定義

	[例]
	1 {
		cde
		fg
	}
	;改行可能エリアを使い、PSG Ch.Aでドレミファソを登録




・音長と臨時記号

<値>            音楽的音長             [例] A4    ラの4分音符
.               付点(複数指定可)
%<値>           フレーム数指定         [例] A%4   ラの4フレーム
^<値>           タイ (加算)            [例] A2^8  ラの2分音符+8分音符
+<値>           〃 (^と同じ)
-<値>           減算                   [例] A4-%3 ラの4分音符から3フレーム引いた長さ
<音名>+         シャープ(複数指定可)   [例] A+    ラ♯
<音名>-         フラット(複数指定可)   [例] A-    ラ♭
<音名>=         ナチュラル             [例] A=    ラ (調号指定時に使用)

	[例]
	E-1^2.-16   ミ♭の全音符+2分音符+付点8分音符 (付点2分音符から16分音符を引いているため)

音名の後に付ける「#」の扱いは「#SHARP-FRAME」の有無により異なり、
初期状態はシャープ、#SHARP-FRAME 指定時はフレーム数指定コマンドになる。

<音名>#         シャープ(複数指定可)   <音名>+ と等価 (デフォルト)
#<値>           フレーム数指定         %<値> と等価   (#SHARP-FRAME 指定時)




・MML (トラック1～3)

ノーマルトラック。

T<値>             単体トラックのテンポ (他のトラックには影響しない。値は #TEMPO と同じ)
@T<値>            単体トラックのタイムベース (4分音符のフレーム数。他のトラックには影響しない)
@T<値1>,<値2>     単体トラックのタイムベース (値1=○分音符, 値2=フレーム数。他のトラックには影響しない)
C～B<音長など>    音符
R<音長>           休符
L<音長>           音長省略時のデフォルト音長を設定 (音長シーケンスを解除)
L<値1>,<値2>,…   音長シーケンス。音長省略時にこの順番で設定される (最大16個でループ)。「L-」で先頭に戻せる
.                 付点
^<値>             タイ(音長加算) ※合計255フレームを超えても使用可
&                 スラー
(                 レガート開始(複数音符のスラー)
)                 レガート終了
+                 音名の後に付けるとシャープ(++でダブルシャープ等も可)、その後に付ければ音長加算(4+8で付点4分音符)
-                 音名の後に付けるとフラット(--でダブルフラット等も可)、その後に付ければ音長減算(2-8で付点4分音符)
=                 音名の後に付けるとナチュラル(調号指定している場合に使用)
O<値>             オクターブ指定 [1～8]
<                 相対オクターブ-1
>                 相対オクターブ+1
\<値>             デチューン [-4000～4000]
\<値>+            相対デチューン [-1000～1000] 「 [\-10+ c]3 」で「 \-10 c \-20 c \-30 c 」と等価
K<値>             半音単位の移調 (トランスポーズ) [-84～84] ※曲全体の移調には #TRANSPOSE が便利
@K<値>            相対トランスポーズ [-24～24] ※Kと併用可。@K0で解除
Q<値>             ゲートタイム [0～8] ※1でスタッカート、8でテヌート、0でレガート(複数音符のスラー)オン
@Q<値>            フレーム減算ゲートタイム [0～128] ※指定したフレーム数だけ発音を短くする。Qと併用可
@Q+<値>           フレーム加算ゲートタイム [0～126] ※指定したフレーム数だけ発音を長くする。Q1～7の時のみ有効
@Q%<値>           固定ゲートタイム [0～128] ※音長に関係なく常に指定フレーム数だけ発音。@Q%0、@Q%、@Q、Qで解除
Q<値1>,<値2>      値2で指定した回数分だけ発動し、次回からは省略しても指定回数分だけ掛かる (0でオフ)
@Q<値1>,<値2>     〃
@Q+<値1>,<値2>    〃
@<値>             音色指定 [0～15]
@E<値>            〃
@<値1>,<値2>      セルフディレイ用音色指定 [0～15] 値1=通常時の音色番号、値2=セルフディレイ中の音色番号
@-                セルフディレイ用音色指定を解除
V<値>             音量 [0～15] ※音量シーケンスは解除される
V+<値>            相対音量+ [1～15(省略時は1)] 「v13 cd v+ ef」で「v13 cd v14 ef」と等価
V-<値>            相対音量- [1～15(省略時は1)] 「v15 cd v-3 ef v-- ga」で「v15 cd v12 ef v10 ga」と等価
VO<値>            音量オフセット値 [-15～15] ※このコマンド以降、Vコマンドを記述した時点で反映される
VI<値1>,<値2>     音量加算インターバル [0～127,0～15(省略可)] ※キーオンのたびに値1のフレームずつ値2の音量まで加算
VI-<値>           音量減算インターバル [0～-127] ※キーオンのたびに指定フレームずつ音量が減算
VS<値>            音量シーケンス指定 [0～31で指定／「-」または255でオフ／パラメータなしの「VS」でカウンタを戻す]
VA<値1>,<値2>     アルペジオ用音量シーケンス指定 (値1=音量シーケンス [0～31], 値2=アルペジオ終了時の処理 [0=何もしない、1=アルペジオ開始前の音量に戻す、2～15=V2～15を設定]) ※VA-でオフ
QS<値>            Qシーケンス指定 [0～31で指定／「-」または255でオフ／パラメータなしの「QS」でカウンタを戻す]
QA<値1>,<値2>     アルペジオ用Qシーケンス指定 (値1=Qシーケンス [0～31], 値2=アルペジオ終了時の処理 [0/255=何もしない、1～8=Q1～8を設定]) ※QA-でオフ
@QS<値>           @Qシーケンス指定 [0～31で指定／「-」または255でオフ／パラメータなしの「@QS」でカウンタを戻す]
@QA<値1>,<値2>    アルペジオ用@Qシーケンス指定 (値1=@Qシーケンス [0～31], 値2=アルペジオ終了時の処理 [0～254=@Q0～254を設定、255=何もしない]) ※@QA-でオフ
KS+<音名>         調号(音名は複数指定可) [例] KS+cf  defgab>cd  ; def+gab>c+d になる
KS#<音名>         〃
KS-<音名>         調号(音名は複数指定可) [例] KS-eab cdefgaa=bb ; cde-fga-ab- になる
@P<値1>,<値2>     ピッチエンベロープ (値1=番号 [0～15／「-」または255でオフ], 値2=キーオフ時に効果を切るか [0～1,省略可])
@M<値1>,<値2>     ビブラート (値1=番号 [0～15／「-」または255でオフ], 値2=キーオフ時に効果を切るか [0～1,省略可)])
@MD<値>           使用中のビブラートのディレイ値のみ書き換え [2～255] ※定義パラメータ自体を書き換える
@N<値>            ノートエンベロープ [0～15で設定／「-」または255でオフ]
@A<値>            〃
@R<値1>,<値2>     リリース設定 (値1=音量 [0～15], 値2=時間 [0～15]) 「@R-」で音量・時間ともに0にリセット
@RV<値>           リリース音量指定 [0～15／±1～15] ※-1～-15で相対マイナス、+1～+15で相対プラス
@RL<値>           遷移中のリリース音量を即座に変更 [0～15／±1～15] ※発音中の音にのみ有効
@RA<値>           直後の1音のみリリース音量を変更 [0～15／±1～15] ※直後の音にのみ有効
@RR<値>           リリース時間指定 [0～15] ※@Rの値2と同じ
@RD<値>           リリースディレイ指定 [-/0=オフ、+/1=オン、-1=ピッチリセット] ※オンにするとリリース時の音程がひとつ手前になる
@RD<値1>,<値2>    〃 (値2=フレーム数 [1～255]) リリースディレイで音程を進めるフレーム数を指定 (無視定時は255=進ませない)
@RN<値1>,<値2>    音符を一定間隔で休符に置換 (値1=何音おきに置換するか [0～7／「-」または255でオフ], 値2=何音目から始めるか [0～7])
@D<値1>,<値2>     セルフディレイ指定 (値1=戻す音数 [0～2で設定／「-」または255でオフ], 値2=音量 [0～15]) ※休符を置換する
@D> <値>          セルフディレイのバッファを進める (値=進める音数 [1～3] 省略時は1) ※長い音符の後に前の音程が残るのを回避
@D+ <値>          〃
@D< <値>          セルフディレイのバッファを戻す (値=戻す音数 [1～3] 省略時は1) ※途中でキーオンを挟む場合などに使用
@DR<値>           セルフディレイの休符処理 [-/0=オフ、+/1=オン] ※休符になる場合に直前の音で埋めるかどうか (デフォルトはオン)
@C<値>            リズムを割り込ませるトラック [1～3(省略時は実行トラック)]
P<値>             ポルタメント1 [0～255／「-」または0でオフ] ※1フレームごとに加算する周波数レジスタの値
P_<音程>          ポルタメント1の開始音程を設定
P_Q<値>           ポルタメント・クオンタイズ [0/1/-/+] ※ポルタメント2の遷移量でQや@Qを考慮するかどうか
P_R<値>           ポルタメント2の遷移を反転させるかどうか [-/0=通常 +/1=反転]
P_W<値>           ポルタメント2・3の遷移が始まるまでのフレーム数
<音程1>_<音程2>   ポルタメント2 (音程1から音程2に遷移)
<音程1>_\<音程2>  ポルタメント3 (音程1から音程2に遷移。1フレームあたりピッチ±1未満の遅い遷移も表現可能だがデータは非常に膨らむ)
<音程1>'<音程2>   グリッサンド (音程1から音程2に半音単位でスライド。@Gによってレガートの有無を設定)
@G<値>            グリッサンドモード [0=通常 1=レガート]
"～"<音長>.<ﾓｰﾄﾞ> アルペジオ (複数の音符を "～" の中に記述すると、全体で指定音長になるようにアルペジオを展開。「/」でループ設定可)
LA<音長>          アルペジオの各音符のデフォルト音長を設定 (音長シーケンスを解除)
LA<値1>,<値2>…   アルペジオの各音符の音長シーケンス。音長省略時にこの順番で設定される (最大16個でループ)。「LA-」で先頭に戻せる
@AS<値>           アルペジオ・レガートモード [0=通常 1=レガート(スラ―)]
@AR<値>           アルペジオ音数 [-100～100] ※正数でアルペジオ音数、負数でアルペジオの最後から休符にする数
[<値>～/～]<値>   リピート。値はリピート回数 (最初か最後のいずれかに記述可)。/ を含めると最後のリピートを抜ける。ネストは最大4重
@RM               単体トラックのリピートモード指定 (他のトラックには影響しない。値は #REPEAT-MODE と同じ)
*<値>             ミックスモード指定 [0=オフ 1=トーン 2=ノイズ 3=トーン+ノイズ]
N<値>             ノイズ周波数 [0～31]
<値1>~<値2>       ランダムパラメータ (乱数の値) ※「v9~13」なら9～13の音量がランダムに設定される
<音程1>~<音程2>   ランダムノート (ランダムな音程の音符) ※「o3c~o5b」ならo3cから5bの範囲でランダムな音符になる
TS<値>            スロー再生 [0～7] ※0で本来のテンポ、7で最も遅くなる
S<値1>,<値2>      H.ENV タイプ (値1=タイプ [0～15], 値2=非矩形波モード有効かつ音量半減フレーム数の指定。値2を省略すると通常モード)
M<値>             H.ENV 周期・数値指定 [0～65535]
M+                H.ENV 周期を音符に自動で追従させる。オクターブ5以上は鳴らせる音程に制限あり
M-                H.ENV 周期の自動追従をオフ
MO<値>            H.ENV 周期・音階指定用オクターブ設定 [1～8] ※M<音名>実行時に反映。MO5以上は鳴らせる音程に制限あり
M<音名>           H.ENV 周期・音階指定 [CDEFGAB/+/-]
MK<値>            H.ENV 周期・音階指定用トランスポーズ [-84～84]
M\<値>            H.ENV 周期・デチューン [-1000～1000] ※PSGの仕様上、非矩形波のピッチは±1でも大きく変わる
Y<値1>,<値2>      PSGレジスタ書き込み (値1=レジスタ番号 [0～15], 値2=データ [0～255])
J<値>             ジャンプマーカー。0～5がF5～F10キーに相当。この位置までシークまたは早送り (#FAST-FORWARDの有無で動作が変わる)
J="<マーカー名>"  ジャンプマーカー。任意のマーカー名でシークバー上にマーカーを登録でき、クリックするとシークできる
@ON               キーオン有効 (トラックミュート解除)
@OFF              キーオン無効 (トラックミュート) ※OFFの間、すべての音符を休符に置換
@L                無限ループ。トラックを最後まで演奏した後、ここに戻る。
@FO<値1>,<値2>    フェードアウト (値1=音量-1あたりのフレーム数 [1～255], 値2=ループ回数 [1～255]) ※省略可
$<マクロ名>       マクロ展開
?<マクロ名>,…    ステップマクロ選択 (最大3個まで同時に指定可)
X<値>,…          ステップマクロ展開 (値=ステップ番号。3個まで指定可) ※値を省略するとXコマンドを実行するたびに自動で加算
@F<値>            @F0～@F1の範囲、または@F2で先頭からの合計フレーム(複数トラックで同時に使用可)、@F3でそこから10個分の音符のフレーム数を表示
@I                このコマンドを実行した位置での各パラメータの内容をサブウィンドウに出力
@NO<音程>=<値>.… RAM上の周波数テーブル上書き (音程=o1c～o8a+、値=周波数レジスタ値 [0～4095／+か-で相対]) ※「@no4c=+3」ならo4cを+3
{ <MML> }         改行可能エリア
|                 ピアノロール上に縦ラインを表示／区切り記号
:                 区切り記号 (マクロ名とコマンドが繋がってしまう場合などに使用)
;                 コメント
//                〃
/* 文字列 */      範囲指定コメント (複数行も可)


コマンドの値を省略すると、各コマンドの初期値が自動的に設定される。

・値を省略できるコマンドの初期値
T120、O4、V15、VI0、L4、Q8,0、@Q0,0、*1、N0、K0、P0、\0、@P-、@M-、@N-、VO0、S0、MO4、M\0、MK0、@D-、@Dn,12、@D+1、@RM0、@RV0、@FO20,1、@RS0、J0、@F2


【ハードエンベロープ (H.ENV) 関連の注意事項】

PSGのハードエンベロープはその周期を極端に短くすることで非矩形波を発音可能であり、
当ドライバおよびコンパイラにおけるハードエンベロープ関連のコマンドもそれを踏まえた実装となっている。
なお、ハードエンベロープ周期の精度上、非矩形波のピッチはオクターブ4でも音痴ぎみになり、
オクターブ5以上になると鳴らせる音程自体が限られるため独特のコツが必要となる。

ハードエンベロープをオフにする際は、@コマンドで音色番号を指定する。
BASICのPLAY文とは異なり、Vコマンドでは無効にならない点に要注意。

------------------------------------------------------------------------------
《通常モード》

Sコマンドの第1パラメータ(ハードエンベロープタイプ)のみ指定し、第2パラメータは省略する。
Mコマンドで周期(変化の長さ)を指定。
BASICのPLAY文のような通常の指定方法。

------------------------------------------------------------------------------
《非矩形波モード》 ※通常のトーンは発音せずに非矩形波のみ発音

Sコマンドの第1パラメータを8(逆ノコギリ波)、10(疑似逆三角波)、12(ノコギリ波)、14(疑似三角波)の
いずれかにして、音量を減衰させるフレーム数を第2パラメータで指定する。
ドライバとコンパイラ内で自動的にエンベロープ周期とトーンのオン・オフが設定されるようになるため、
Mコマンドや「*」コマンドによる指定は不要。

------------------------------------------------------------------------------
《ユニゾンモード》 ※通常のトーンと非矩形波を同じ音程で発音

コマンドの第1パラメータを8、10、12、14のいずれかにして、第2パラメータは省略する。
Mコマンドで「+」(自動設定)を指定する(数値は含めずに「M+」とだけ記述)。
「*」は無指定または1にして、トーン有効・ノイズ無効の状態にする(指定する際は「*1」と記述)。
ピッチによっては通常のトーンと非矩形波が干渉して潰れた音になるため、
\コマンド(デチューン)とM\コマンド(ハードエンベロープ周期デチューン)で調整する。
周期の自動追従を終了する際は「M-」を実行。

------------------------------------------------------------------------------
《疑似ポリフォニックモード》 ※通常のトーンと非矩形波を別々の音程で発音

Sコマンドの第1パラメータを8、10、12、14のいずれかにして、第2パラメータは省略する。
非矩形波の音程をMOコマンドとM<音階>コマンドで指定する(オクターブ3のドなら「MO3 MC」と記述)。
通常の音程コマンドでトーンを発音するたびに、MOとM<音階>で指定した非矩形波が同時に発音される。
濁った音になりがちだが、通常のトーンで中～高音部、疑似三角波で低音部を発音させれば
それなりに2音が分離して聞こえるようになる。
(非矩形波で基音、通常のトーンで倍音を鳴らして疑似フィルタ効果を表現するなどの応用も)
------------------------------------------------------------------------------




・MML (トラックR)

リズムトラック。発音中のみPSG Ch.C (トラック3) に割り込んで優先的に発音。

任意の1文字     リズム音を鳴らす
                (B=バスドラム、S=スネアドラム、K=ハイタム、M=ミドルタム、N=ロータム、
                H=クローズハイハット、I=ペダルハイハット、O=オープンハイハット、
                C=クラッシュシンバル、D=バスドラム+クラッシュシンバル、
                の10音色がプリセット定義済み)
'<コマンド名>   コマンドモード (#RHYTHM-ATOZヘッダ使用時、リズム音色名とコマンド名が被るときに付ける)
L<音長>         音長省略時のデフォルト音長
V<値>           全リズム音の音量 [0～15]
V+<値>          全リズム音の相対音量+1 [1～15(省略時は1)]
V-<値>          全リズム音の相対音量-1 [1～15(省略時は1)]
V<音名><値>     指定リズム音の音量 [0～15]
V<音名>+<値>    指定リズム音の相対音量+1 [1～15(省略時は1)] 「vs13 ss v+ ss v+ ss」で「v13 ss v14 ss v15 ss」と等価
V<音名>-<値>    指定リズム音の相対音量-1 [1～15(省略時は1)] 「vb15 b v-2 b v- b」で「v15 b v13 b v12 b」と等価
T<値>           テンポ
@T<値>          単体トラックのタイムベース (4分音符のフレーム数。他のトラックには影響しない)
@T<値1>,<値2>   単体トラックのタイムベース (値1=○分音符, 値2=フレーム数。他のトラックには影響しない)
@C<値>          リズムを割り込ませるトラック [1～3(省略時は3)]
R<音長>         休符
L<音長>         音長省略時のデフォルト音長
.               付点
^<音長>         タイ(音長加算) ※合計255フレームを超えても使用可
+<音長>         〃
-<音長>         音長減算
[<値>～/～]<値> リピート。値はリピート回数 (後に指定したほうが有効)。/ は最後のリピートを抜ける
@RM             単体トラックのリピートモード指定 (他のトラックには影響しない。値は #REPEAT-MODE と同じ)
TS<値>          スロー再生 [0～7] ※0で本来のテンポ、7で最も遅くなる
Y<値1>,<値2>    PSGレジスタ書き込み (値1=レジスタ番号0～15, 値2=データ0～255)
J<値>           ジャンプマーカー。0～5がF5～F10キーに相当。この位置までシークまたは早送り (#FAST-FORWARDの有無で動作が変わる)
@ON             キーオン有効 (トラックミュート解除)
@OFF            キーオン無効 (トラックミュート) ※OFFの間、すべての音符を休符に置換
@L              無限ループ。トラックを最後まで演奏した後、ここに戻る。
@FO<値1>,<値2>  フェードアウト (値1=音量-1あたりのフレーム数 [1～255], 値2=ループ回数 [1～255]) ※省略可
$<マクロ名>     マクロ展開
?<マクロ名>,…  ステップマクロ選択 (最大3個まで同時に指定可)
X<値>,…        ステップマクロ展開 (値=ステップ番号。3個まで指定可) ※値を省略するとXコマンドを実行するたびに自動で加算
!S<値>          効果音発音 (値=効果音番号 [1～99]) ※常にリズムが優先されるので効果音を3ch鳴らす際合はリズムを休符にする
@F              トラックの先頭から@Fまでのフレーム数を表示 (複数トラックで同時に使用可)
{ <MML> }       改行可能エリア
|               ピアノロール上に縦ラインを表示／区切り記号
:               区切り記号
;               コメント
//              〃
/* 文字列 */    複数行コメント


任意のアルファベットにリズム音色を割り当て可能だが、コマンドと被る場合はリズム音が優先される。
手前に「'」(アポストロフィ)を付けると、同じアルファベットに割り当てられているコマンドを実行可能。

	[例]
	v4 'v12
	;リズム音「v」を4分音符で鳴らした後、音量を12にする




・ヘッダ定義

「#<ヘッダ名> <データ>」の形式で定義する。書式は以下の通り。
(たとえば #TRACK-REV を #TRACK_REV、#TRACKREV と書く等、若干の表記揺れにも対応)

#TEMPO               <値>           全トラックのテンポを設定
#TIMEBASE            <値>           全トラックのタイムベース (4分音符のフレーム数)
#TIMEBASE            <値1>,<値2>    全トラックのタイムベース (値1=○分音符、値2=フレーム数)
#TRANSPOSE           <値>           移調
#KEYSHIFT            <値>            〃 (#TRANSPOSEと同じ)
#KEY-SIGN            <音名>         調号(音名は複数指定可) ※全トラックの頭で設定される
#OCTAVE-REV                         相対オクターブ反転 (「 > 」が -1、「 < 」が +1 になる)
#MUTE                <トラック名>   指定トラックをミュート (1,2 や 12 など複数指定可)
#SOLO                <トラック名>   指定トラックをソロ再生 (1,2 や 12 など複数指定可)
#TRACK-REV           <トラック名>   2つのトラックを入れ替える (1,2 など必ず2つのトラックを指定)
#RHYTHM-ATOZ                        既存のコマンドと重複する文字にもリズム音色を定義できるようにする
#REPEAT-MODE         <値>           リピートモード (後述)
#SHARP-FRAME                        MML中の「#」をフレーム数指定コマンドにする (「%」と等価になる)
#SEED                <値>           乱数の種(シード値)を設定する [0～9999] (0でコンパイルの度に変化)
#RANDOM-SEED         <値>           〃 (#SEEDと同じ)
#JUMP-OFFSET         <値>           Jコマンドのシーク先をミリ秒単位で補正する (デフォルトは -150）
#FAST-FORWARD                       Jコマンド実行時に音を出しながら早送りする (デフォルトはシーク)
#SEEKTIME            <値>           シーク (指定した秒数から演奏開始)
#V-OFFSET            <値>           Vコマンドの音量オフセット値
#RV-OFFSET           <値>           @Rコマンドの第2パラメータおよび@RVコマンドの音量オフセット値
#RESET-VIB                          @Mコマンドの第2パラメータの初期値を1にする
#RESET-PITCHENV                     @Pコマンドの第2パラメータの初期値を1にする
#DEFAULT-OFF                        各コマンドの値を省略した際にエラーを検出 (初期値の無効化)
#INCLUDE-VOICE       "<ファイル名>" 音色ファイル読み込み (パス省略時はMMLと同じフォルダ)
#INCLUDE-NDV                        〃
#INCLUDE-V                          〃
#INCLUDE-RHYTHMVOICE "<ファイル名>" リズム音色ファイル読み込み (パス省略時はMMLと同じフォルダ)
#INCLUDE-NDR                        〃
#INCLUDE-RV                         〃
#SKIP-DEFINE                        音色など各種定義の重複を許可 (後から定義したほうで上書きされる)
#SKIP-F                             @Fコマンドを実行せずにスキップ
#SKIP-SE                            MMLトラック内の!Sコマンドを実行せずにスキップ (定義自体は行われる)
#DEFINE-ADDRESS      <アドレス>     各種定義データを曲データから切り離して指定アドレスに配置
#ADDRESS-SE          <アドレス>     効果音データを曲データから切り離して指定アドレスに配置
#ADJUST-PIANOROLL    <値>           ピアノロールの表示位置を補正
#LOOP-PIANOROLL      <値>           無限ループをピアノロール上に展開する回数 (初期値は2)
#SCROLL-TRACK        <トラック名>   再生中にMMLエディタのスクロール位置を追従するトラックの指定
#EXPAND-MEMORY                      曲データの容量制限を緩和
#TITLE               "<文字列>"     曲名を格納
#COMPOSER            "<文字列>"     作曲者を格納
#ARRANGER            "<文字列>"     編曲者を格納
#PROGRAMMER          "<文字列>"     打ち込み担当者を格納
#MEMO                "<文字列>"     メモを格納


【リピートモードについて】

リピートモードの値は下記の0～3となる (@RMコマンドの値と同じ)。
基本的には #REPEAT-MODE 1 にしておき、矛盾が生じるトラックのみ @RM0 に切り替えるのがデータ容量的には有利。

0: コンパイラ側でデータを展開 (データ量は増えるが最も確実)
1: ドライバ側のリピート機能を使用。1フレーム未満の端数は退避し、リピート終了直後の音符に加算
2: ドライバ側のリピート機能を使用。1フレーム未満の端数は切り捨て (その際は演奏がずれる)
3: ドライバ側のリピート機能を使用。1フレーム未満の端数が生じた際はエラー


【#EXPAND-MEMORYヘッダについて】

このヘッダを使用すると、曲データに使用可能なメモリが最大28KBになります。

但し、自動的に「#ADDRESS-DEFINE 0B000H」と「#ADDRESS-SE 0BE00H」が設定されますので、
音色定義やエンベロープ定義は最大3584バイト、効果音定義は最大512バイトに制限されます。
（ユーザー自身による再設定も可能です）

上記の設定により、定義データは曲データから切り離されますので、外部プログラムで再生する際はご注意ください。




・音色定義1 (フレーム方式ソフトエンベロープ)

(基本的にはボイスエディタ上の音色パラメータが転送されるが、下記の書式によりMMLでの定義も可能)

「@<音色番号>=<データ>」の形式で定義。音色番号は0～15。
音色番号は音色定義2(ADSR方式ソフトエンベロープ)と共用。

データの書式は下記の通り。

0～9              V0～9にして1フレーム維持／ハードエンベロープOFF
A～F              V10～15にして1フレーム維持／ハードエンベロープOFF
<0～F>:<フレーム> 指定音量を指定フレームぶん維持
<0～F>=<フレーム> 指定音量まで指定フレームかけて遷移
I+<フレーム>      音量加算インターバル(データ展開型)を設定 (0～Fの遷移と並行で指定フレームずつ音量加算)
I-<フレーム>      音量減算インターバル(データ展開型)を設定 (0～Fの遷移と並行で指定フレームずつ音量減算)
VI+<フレーム>     音量加算インターバル(トラックのVIと共用)を設定 (0～Fの遷移と並行で指定フレームずつ音量加算)
VI-<フレーム>     音量減算インターバル(トラックのVIと共用)を設定 (0～Fの遷移と並行で指定フレームずつ音量減算)
*<モード>         ミックスモード指定 (0:オフ 1:トーン 2:ノイズ 3:トーン+ノイズ)
N<周波数>         ノイズ周波数 (0～31)
S<番号>           ハードエンベロープ形状を設定して1フレーム維持
H-                ハードエンベロープ・音量半減 (周波数レジスタ値を0にしてトーンON・ノイズOFF)
H+                ハードエンベロープ・ユニゾン復帰 (トーンON・ノイズOFFにして周波数レジスタ値を復帰)
R                 1フレームウェイト (Sコマンドは連続で実行すると音が濁るため、このコマンドを入れて対策する)
@P<番号>          ピッチエンベロープ指定  ※通常トラックと同様の書式
@M<番号>          ビブラート指定          ※通常トラックと同様の書式
@N<番号>          ノートエンベロープ指定  ※通常トラックと同様の書式
@A<番号>          〃
[<値>～]<値>      リピート (コンパイラ内で展開、ネスト不可。値は回数)
L                 無限ループ (最後まで鳴らしたら、この位置まで戻る。最大15バイト手前まで)
,                 区切り (フレーム数と音量が繋がるのを防ぐため)
.                 〃
/                 〃
|                 〃

	[例]
	@0=F 8=10
	;1フレーム目はV15、そこから10フレームかけてV8まで下げる

	[例]
	@0=A:8
	;V10で8フレーム維持 (AAAAAAAA と同じ)

	[例]
	@0=FED L C:4 D:4
	;V15 V14 V13と1フレームずつ下げてから、V12を4フレーム→V13を4フレームのループ

	[例]
	@0=*2 I0 N31 FF N15 D:5 N10 I-8
	;ノイズ周波数31/音量15で2フレーム → ノイズ周波数15/音量13で5フレーム → 以降ノイズ周波数10で8フレームずつ音量減衰

	[例]
	@n0 = 12 0
	@0 = @n0 fed
	@1 = @n- edc
	1 @0,1 @d1 l8 frerdr
	; このように音色定義内でノートエンベロープを指定することによって、
	; セルフディレイ時のみノートエンベロープをオフにするような表現も可能

	[例]
	@0 = *0 S8 RRR *1 FDC
	1 @0 m+ cder
	;疑似ノコギリ波を4フレーム鳴らした後、通常トーンのソフトエンベロープに移行

	[例]
	@0 = L S8 R
	1 *0 @0 m+ cder
	;2フレームごとにSコマンドを実行して意図的に音を濁らせる

	[例] @0=[FD] [CA]3 [4 B9],8
	;@0=FDFD CACACA B9B9B9B9 8 と等価
	;(8の手前のカンマを入れないと、リピート8回と解釈されてしまう)




・音色定義2 (ADSR方式ソフトエンベロープ)

「@E<番号>=<AR>,<DR>,<SR>,<SL>」の形式で定義。音色番号は0～15。
音色番号は音色定義1(フレーム方式ソフトエンベロープ)と共用。

便宜的にADSR方式と呼ぶが、リリースに関してはこの方法では定義できず、@Rコマンドなどで指定する。

各パラメータの意味は下記の通り。

<番号>  音色番号。0～15。フレーム方式と共用。
<AR>    アタックレート。0～31。この速度で音が立ち上がる。31が最速。
<DR>    ディケイレート。0～31。SLで指定した音量になるまでの減衰速度。31が最速。
<SR>    サスティンレート。0～31。ディケイ後から音量0になるまでの減衰速度。31が最速。0で持続音。
<SL>    サスティンレベル。0～15。DRの到達音量。15が最大。

[参考図]／＼
　　　／　　＼DR
　AR／　　　　＼
　／　　　　SL→―＿SR
／　　　　　　　　　―＿




・リズム音色定義

(基本的にはリズムボイスエディタ上の音色パラメータが転送されるが、下記の書式によりMMLでの定義も可能)

「@R:<音名>=<データ>」の形式で定義。最大26個。
音名は任意のアルファベット1文字。

B=バスドラム、S=スネアドラム、K=ハイタム、M=ミドルタム、N=ロータム、
H=クローズハイハット、I=ペダルハイハット、O=オープンハイハット、
C=クラッシュシンバル、D=バスドラム+クラッシュシンバル、
の10音色がプリセット定義済み。
プリセットと同じ音名を指定すると、その曲データの中でのみ自作音色で上書きされる。

ここで定義した音色はキーオン中のみPSG Ch.Cに割り込んで発音される。

データの書式は下記の通り。
区切り記号を入れながら、1フレームずつデータを指定。

V<値>        音量 (0～15)
:<値>        音程 (0～8191) ※周波数レジスタの値で、大きい値ほど低くなる
*<値>        ミックスモード指定 (0=オフ 1=トーン 2=ノイズ 3=トーン+ノイズ)
N<値>        ノイズ周波数 (0～31)
S<値>        ハードエンベロープ形状 (0～15)
M<値>        ハードエンベロープ周期 (0～65535)
[<値>～]<値> リピート (コンパイラ内で展開、ネスト不可。値は回数)
/            1フレーム進める
,            〃
.            〃
|            〃

[参考]
プリセットのリズム音色5種類の音色データ

@R:B = *1 :800 V15 / :2000 V14
@R:S = *1 :450 V15 / *2 N4 / N1
@R:M = *1 :500 V15 / :630 V14 / :760 V13
@R:C = *2 V15 N3 / V14 N2 / V13 N2 / N1
@R:H = *2 N1 V15




・ビブラート定義

「@M<番号>=<Delay>,<Frame>,<Depth>,<Type>(,<AddDepth>,<AddCount>,<LoopMode>)」の形式で定義。
ビブラート番号は0～15。但し、ビブラートとピッチエンベロープで同じ番号は指定できない。
(内部処理をピッチエンベロープと共用しているため)

各パラメータの意味は下記の通り。

<番号>     ビブラート番号。0～15。ピッチエンベロープと共用。
<Delay>    ビブラートが掛かるまでのフレーム数。0～255。
<Frame>    速さ。1振幅あたりのフレーム数。1～63。
<Depth>    深さ。1振幅あたりのピッチ変化量。1～127。
<Type>     タイプ(後述)
<AddDepth> [省略可] 2周期目以降、この値ずつ深さを加減算する。-30～30。省略時は加減算しない。
<AddCount> [省略可] 深さを加減算する周期の回数。1～10。省略時は4回。
<LoopMode> [省略可] 0なら最後の振幅の深さを維持、1なら最初の深さに戻す。省略時は0。

各タイプは次の通り。
0 = 三角波 (下方向から) 元の音程を中心に上下
1 = 矩形波 (下方向から) 〃
2 = 三角波 (上方向から) 〃
3 = 矩形波 (上方向から) 〃
4 = 三角波 (下方向のみ) 元の音程を上端とする
5 = 矩形波 (下方向のみ) 〃
6 = 三角波 (上方向のみ) 元の音程を下端とする
7 = 矩形波 (上方向のみ) 〃
8 = サイン波 (下方向から) 元の音程を中心に上下
9 = サイン波 (上方向から) 〃
10 = サイン波 (下方向のみ) 元の音程を上端とする
11 = サイン波 (上方向のみ) 元の音程を下端とする




・ピッチエンベロープ定義

「@P<番号>=<データ>」の形式で定義。
ピッチエンベロープ番号は0～15。但し、ピッチエンベロープとビブラートで同じ番号は指定できない。
(内部処理をビブラートと共用しているため)

データの書式は下記の通り。
区切り記号を入れながら、1フレームずつピッチを指定。
(値を含めずに区切り記号だけを複数並べても基本的には無意味だが、カンマを並べた場合は0が入る)

W<値>        ウェイト数 (1～255)。最初のみ使用可能 (ディレイビブラートなどの為)
<値>         ピッチ (-127～127)。1フレーム前からの相対値。
_<値>        直前のピッチを指定フレームぶん繰り返す (たとえば「-1_5」で「-1」を5フレームぶん並べた状態と等価)。
[<値>～]<値> リピート (コンパイラ内で展開、ネスト不可。値は回数)
L            ループ地点。全フレーム分のピッチを反映した後、この位置まで戻る。無視定時は最後の値を無限ループ。
(空白)       区切り
,            〃
.            〃
/            〃
|            〃




・ノートエンベロープ定義(数値)

「@N<番号>=<データ>」の形式で定義。
ノートエンベロープ番号は0～15。番号は@Aと共用。

データの書式は下記の通り。
区切り記号を入れながら、1フレームずつ音程を指定。
(値を含めずに区切り記号だけを複数並べても基本的には無意味だが、カンマを並べた場合はエラーとなる)

<値>         音程 (-127～127)。音符本来の音程からの相対値。(4を定義して「C」の音符を鳴らすと「E」の音程が鳴る)
[<値>～]<値> リピート (コンパイラ内で展開、ネスト不可。値は回数)
L            ループ地点。全フレーム分のピッチを反映した後、この位置まで戻る。無視定時はループしない。
(空白)       区切り
,            〃
.            〃
/            〃
|            〃

	[例]
	@N0=L,0,3,7
	1 @A0 E1 ;(EGBの高速アルペジオが鳴る)

	[例] @N0=[ 7, 0 ]
	;7,0,7,0 ではなく 0,0,0,0,0,0,0 と解釈されてしまう

	[例] @N0=[, 12, 0 ]
	;12,0,12,0 と等価




・ノートエンベロープ定義(音名)

「@A<番号>=<データ>」の形式で定義。
ノートエンベロープ番号は0～15。番号は@Nと共用。

データの書式は下記の通り。
Cを基準値とした相対的な音程でアルペジオ等を定義できる。

C～B         音程
[<値>～]<値> リピート (コンパイラ内で展開、ネスト不可。値は回数)
L            ループ地点。全フレーム分のピッチを反映した後、この位置まで戻る。無視定時はループしない。
(空白)       区切り
,            〃
.            〃
/            〃
|            〃

	[例]
	@A0=LCCEEGG
	1 @A0 D1 ;(2フレームずつDF+Aの高速アルペジオが鳴る)




・音量シーケンス定義

音符ひとつずつに対してVコマンドを自動的に追加する機能。

「VS<番号>=<データ>」の形式で定義。
シーケンス番号は0～31。

データの書式は下記の通り。
区切り記号を入れながら、1音ずつの音量を指定。
(値を含めずに区切り記号だけを複数並べても基本的には無意味だが、カンマを並べた場合は0が入る)

<値>         音量 (絶対指定。1～15。Vコマンドと等価)
+<値>        相対音量 (加算。+1～15。V+コマンドと等価)
-<値>        相対音量 (減算。-1～15。V-コマンドと等価)
0            1音スキップ (音量の設定自体を行わない)
[<値>～]<値> リピート (コンパイラ内で展開、ネスト不可。値は回数)
L            ループ地点。最後の値まで反映した後、この位置まで戻る。無視定時はループしない。
(空白)       区切り
,            〃
.            〃
/            〃
|            〃

	[例]
	VS0=15 12 +2
	1 VS0 cde
	;v15c v12d v+2e と等価

	[例]
	VS1=14 L -3 +3
	1 VS1 cdefga
	;v14c v-3d v+3e v-3f v+3g v-3a と等価

	[例] VS2=[ 7, 15 ]
	;7,15,7,15 ではなく 15,15,15,15,15,15,15 と解釈されてしまう

	[例] VS3=[3, 15, 12 ], 10
	;15,12,15,12,15,12,10 と等価 (10回ループにはならない)




・Q/@Qシーケンス定義

音符ひとつずつに対してQコマンドまたは@Qコマンドを自動的に追加する機能。

「QS<番号>=<データ>」または「@QS<番号>=<データ>」の形式で定義。
シーケンス番号は0～31。

データの書式は下記の通り。
区切り記号を入れながら、1音ずつのゲートタイムを指定。
(値を含めずに区切り記号だけを複数並べても基本的には無意味だが、カンマを並べた場合は0が入る)

<値>         ゲートタイム値 (QSならQの値[1～8]、@QSなら@Qの値[1～128,+1～126,%1～255])
0            QSの場合は1音スキップ (ゲートタイムの設定自体を行わない)、@QSの場合は@Q0を設定
[<値>～]<値> リピート (コンパイラ内で展開、ネスト不可。値は回数)
L            ループ地点。最後の値まで反映した後、この位置まで戻る。無視定時はループしない。
(空白)       区切り
,            〃
.            〃
/            〃
|            〃

	[例]
	QS0=8 4 3
	1 QS0 cdefg
	;q8c q4d q3efg と等価

	[例]
	QS1=8 L 2 5
	1 QS1 cdefga
	;q8c q2d q5e q2f q5g q2a と等価

	[例] QS2=[ 7, 5 ]
	;7,5,7,5 ではなく 5,5,5,5,5,5,5 と解釈されてしまう

	[例] QS3=[3, 8, 6 ] 5
	;8,6,8,6,8,6,5 と等価 (5回リピートにはならない)




・マクロ定義

「$<マクロ名>=<MML>」の形式で定義。マクロ名は任意の文字列。
文字数に制限はないが、1行で完結する必要がある。

	[例]
	$HOGEHOGE = CDE
	1 $HOGEHOGE EFG $HOGEHOGE AGF
	; CDE EFG CDE AGF という演奏になる

マクロはコンパイル時に展開されるため、音長などをマクロの直後に書ける。

	[例]
	$KICK = o3c
	1 $KICK:4 $KICK:8 $KICK:8
	; o3c4 o3c8 o3c8 という演奏になる

マクロの入れ子も可能。

	[例]
	$HOGE = cde
	$FUGA = $HOGE fg
	1 $FUGA
	; cdefg という演奏になる




・ステップマクロ定義

「?<マクロ名>=<文字列>」の形式で定義。マクロ名は任意の文字列。
文字数に制限はないが、1行で完結する必要がある。

文字列は 「 / 」 または 「 | 」 で区切って、各ステップのMMLを定義する。
「 / 」を連続で並べるとコメント扱いになってしまうため、その場合は空白などを入れる。

定義したMMLをトラックから呼び出す際は、まず「?<マクロ名>」でステップマクロを選択してから「X」で展開する。
展開するステップマクロは最大3個までカンマで並べて同時に指定可。

「X<ステップ番号>」で任意のステップ番号を指定することもできる。
カンマで並べて任意のステップマクロのステップ番号を指定可。
なお、ステップ番号はXコマンドを実行するたびに自動で加算されるため、番号を省略して「X」を並べるだけで連続したステップを展開できる。
(最後まで呼び出すと最初に戻る)

	[例]
	?TEST1=o4/o5/o3
	?TEST2=c /d /e
	?TEST3=  /& /

	1 ?TEST1,TEST2,TEST3
	1 x x x
	; o4c o5d& o3 e と等価

	1 x2,,1 g
	; o3c& g と等価




・効果音定義

「!S<効果音番号>」で定義。
これ以降のトラックデータはすべて効果音データとして認識されるようになる。
(そのため、必ず曲データの後に記述する)

値は効果音番号で、1～99。
曲データ内で「!S<番号>」を実行すると、その番号の効果音データを割り込ませて発音できる。

　【注意】

　・音色データは曲データと共用となります。

　・@Cコマンド、@RMコマンドは使用できません。

　・リズムトラックは使用できません。

　・効果音よりもリズムトラックが常に優先されますので、
　　リズムの割り込まれるトラック（デフォルトではトラック3）を効果音で使用する際は
　　リズムトラック側を休符にする必要があります。


	[例1] キックの音を効果音として定義し、曲に割り込ませる

	;---- 曲データ
	1 t150 l4
	1 !S1 cd !S1 ef !S1 ga !S1 b>c

	;---- 効果音
	!S1
	1 t120 o4b_<c24


	[例2] 和音を効果音として定義し、曲に割り込ませる

	;---- 曲データ
	1 t150 l4 o5
	1 !S1 cd !S2 ef !S3 ga !S1 b>c

	;---- 効果音
	!S1
	123 t120 l24 o4
	1 c
	2 e
	3 g

	!S2
	123 t120 l24 o4
	1 c
	2 f
	3 a

	!S3
	123 t120 l24 o4
	1 d
	2 g
	3 b




