MMLの全体的な構文は、`#'で始まる定義、疑似命令及び、
データ(音色データ、エンベロープパターン、シーケンスデータ等)を記述する記述ブロックで構成されます。
MMLコンパイラは、ASCIIコード0x00~0x20(改行、TAB、スペース等)を無視します。
MMLは、ASCIIと互換性のある文字コード(Shift-JIS、UTF-8等)で記述してください。
曲や効果音の設定・記述をするためのコマンド群です。
Command | Default | Contens |
---|---|---|
#include "filename" | - | 外部ファイルを呼び込みます。 |
#bgm n | 1 | BGM(曲)の数を設定します。 |
#se n | 0 | SE(効果音)の数を設定します。 |
#priority n | 0 | 以降のSE(効果音)の優先度を設定します。 SE(効果音)を再生開始した時、既に優先度が高いSE(効果音)が再生中であった場合は、再生しません。 (0 : 優先度高 ~ 3:優先度低) |
#timebase n | 24 | 以降のシーケンス記述ブロック(BGM, SE, Sub)の4分音符の分解能を設定します。 何度でも指定可能であり、各シーケンス記述ブロック毎に設定することもできます。 音符、休符において、この数値nの4倍の値を割り切ることが可能なm分音符を使用することができます。 それ以外のm分音符を使用した場合、割り切れない旨のWarning(警告)となり、小数点を切り捨ててコンパイルします。 |
#QMax n | 8 | シーケンス記述ブロック内におけるQ コマンドの分母を設定します。 Qコマンド使用時、実際の発音音長は、音長 × Q コマンドの値 ÷ n となります。 |
#QReverse | - | 本コマンドを記述することで、シーケンス記述ブロック内におけるゲートクオンタイズコマンド `Q'と`q'を入れ替えます。 |
#octaveReverse | - | 本コマンドを記述することで、シーケンス記述ブロック内における相対オクターブコマンド `<'と`>'を入れ替えます。 |
#RepeatMode n | 0 | シーケンス記述ブロック内におけるリピート(A)コマンドのコンパイル方法を設定します。 0 … MMLコンパイラが自動的に、リピートコマンドのコンパイル方法を選択します。 1 … ユーザーにて明示的に、リピートコマンドのコンパイル方法を選択します。 2 … ユーザーにて明示的に、リピートコマンドのコンパイル方法を選択します。 数値の詳細は、リピート(A)コマンドを参照。 |
#TieMode n | 0 | シーケンス記述ブロック内における ^ コマンドのコンパイル方法を設定します。 0 … ^ コマンドは、すべての場合において「タイ」としてコンパイルします。 1 … 音符の直後に^コマンドが記述された場合は、直前の音符に対する音長を加算する演算子として処理します。 (※加算結果が255[tick]を超えるとエラーになります。) |
#rest n | 2 | シーケンス記述ブロック内におけるr コマンドによる休符のコンパイル方法を設定します。 0 … 強制的に、音量を0にします。⊿PCMの場合はKeyOffします。 1 … 直前のノートを、R@, Rvコマンドの値で鳴らします。 2 … 直前のノートのエンベロープ(音色・音量)を継続し、リリースパターンが定義されている場合それに従います。 3 … Rmコマンドに従います。 |
#wait n | 0 | シーケンス記述ブロック内におけるw コマンドによる休符のコンパイル方法を設定します。 0 … 強制的に、音量を0にします。⊿PCMの場合はKeyOffします。 1 … 直前のノートを、R@, Rvコマンドの値で鳴らします。 2 … 直前のノートのエンベロープ(音色・音量)を継続し、リリースパターンが定義されている場合それに従います。 3 … Rmコマンドに従います。 |
#ReleaseVolume n | 2 | シーケンス記述ブロック内におけるRvコマンドの初期値を設定します。 nは0~15の範囲で指定します。 ※音源ドライバ側のデフォルトは2であるため、2以外を指定した場合は各トラックの先頭に自動でRvコマンドを出力します。 |
#offsetE@ n | 0 | シーケンス記述ブロック内にて、E@コマンドの引数を指定数値だけずらします。 |
#offsetEv n | 0 | シーケンス記述ブロック内にて、Evコマンドの引数を指定数値だけずらします。 |
#offsetEm n | 0 | シーケンス記述ブロック内にて、Emコマンドの引数を指定数値だけずらします。 |
#offsetEn n | 0 | シーケンス記述ブロック内にて、Enコマンドの引数を指定数値だけずらします。 |
#offsetPCM address | $10000 (⊿PCM無し) | ⊿PCMを配置するアドレスを指定します。 シーケンスデータはこのコマンドで指定したアドレス-1の領域まで使えます。 NSF music formatを出力する場合は、このアドレスよりΔPCMの実体が配置されます。 アセンブリ言語ソースを出力する場合は、リンカー"ld65.exe"のコンフィグファイルにて、 "#segmentPCM"コマンドで指定したセグメントの配置アドレスと、同じアドレスに設定して下さい。 |
BGM(n){ Sequence data } |
- | n番目のBGMのシーケンスの記述ブロックです。 シーケンスパターンの記述は、シーケンスデータ(Sequence data)の項を参照ください。 番号は0からカウントします。 |
SE(n){ Sequence data } |
- | n番目のSE のシーケンスの記述ブロックです。 シーケンスパターンの記述は、シーケンスデータ(Sequence data)の項を参照ください。 番号は0からカウントします。 |
Sub(n){ Sequence data } |
- | n番のサブルーチンの記述ブロックです。 シーケンスパターンの記述は、シーケンスデータ(Sequence data)の項を参照ください。 |
$name{ Sequence data } |
- | シーケンス用のマクロ定義です。どのシーケンス記述ブロックでも使用可能な、グローバルマクロです。 nameは、`$'から、キャラクターコード0x00~0x20の文字か`{'が来るまでをマクロ名として認識します。 |
Envelope(n){ Envelope data } |
- | n番のエンベロープパターン定義の記述ブロックです。 エンベロープパターンの記述は、エンベロープパターン(Envelop pattern)の項を参照ください。 |
Patch(n){ Patch data } |
- | n番のパッチ定義の記述ブロックです。 パッチ定義の記述は、パッチ定義(Patch define)の項を参照ください。 |
DPCM{ Delta PCM define } |
- | ⊿PCM定義の記述ブロックです。 ⊿PCM定義の記述は、⊿PCM定義(Delta PCM define)の項を参照ください。 |
FDSC(n){ wave table } |
- | FDSのキャリア側(音色)の波形データ定義の記述ブロックです。 FDSのキャリア側の波形定義の記述は、FDSキャリア波形定義(FDS career wave table)の項を参照ください。 |
FDSM(n){ wave table } |
- | FDSのモジュレータ側(LFO)の波形データ定義の記述ブロックです。 FDSのモジュレータ側の波形定義の記述は、FDSモジュレータ波形定義(FDS modulator wave table)の項を参照ください。 |
VRC7(n){ VRC7 define } |
- | VRC7ユーザー音色定義の記述ブロックです。 VRC7ユーザー音色定義の記述は、VRC7 ユーザー音色定義(VRC7 User Instrument define)の項を参照ください。 |
N163(n){ wave table } |
- | n16x(n160,n161,n162,n163)の音色波形定義の記述ブロックです。 n16x音色波形定義の記述は、n16x音色波形定義(N16x sample wave block)の項を参照ください。 |
;comments | - | 1行コメントです。改行までの記述を無視します。 (各記述ブロック内でも有効です) |
//comments | - | 1行コメントです。改行までの記述を無視します。 (各記述ブロック内でも有効です) |
/*comments*/ | - | 範囲コメントです。 /* と */ の間の記述を無視します。 (各記述ブロック内でも有効です) |
NSF music format用の設定コマンドです。
NSFヘッダー、またはメタデータに設定されます。
Command | Default | NSF | NSFe | Contens |
---|---|---|---|---|
#title "strings" | 1 | v | タイトル名を設定します(エスケープシーケンス利用可)。 NSFではヘッダーに埋め込まれ、NSFeではメタデータを生成します。 また、NSF2で、且つ、32文字を超える場合、メタデータを生成します。 |
|
#composer "strings" | 1 | v | 作曲者を設定します(エスケープシーケンス利用可)。 NSFではヘッダーに埋め込まれ、NSFeではメタデータを生成します。 また、NSF2で、且つ、32文字を超える場合、メタデータを生成します。 |
|
#copyright "strings" | 1 | v | 著作権者を設定します(エスケープシーケンス利用可)。 NSFではヘッダーに埋め込まれ、NSFeではメタデータを生成します。 また、NSF2で、且つ、32文字を超える場合、メタデータを生成します。 |
|
#maker "strings" | 2 | v | 製作者を設定します(エスケープシーケンス利用可)。 NSF2, NSFe共にメタデータを生成します。NSF1では未対応です。 |
|
#text "strings" | 2 | v | テキストを設定します(エスケープシーケンス利用可)。 NSF2, NSFe共にメタデータを生成します。NSF1では未対応です。 |
|
#plst {list} | 2 | v | BGMの演奏順番を指定します。 演奏する順番にBGM番号を0~255で指定し、番号と番号の間はスペース、TAB、もしくはカンマで区切ってください。 NSF2, NSFe共にメタデータを生成します。NSF1では未対応です。 |
|
#psfx {list} | 2 | v | SEの演奏順番を指定します。 演奏する順番にBGM番号を0~255で指定し、番号と番号の間はスペース、TAB、もしくはカンマで区切ってください。 NSF2, NSFe共にメタデータを生成します。NSF1では未対応です。 |
|
#mixe { id = volume, id = volume } |
2 | v | 各拡張音源の音量バランスを指定します。 NSF2, NSFe共にメタデータを生成します。NSF1では未対応です。 idは、音源タイプを指定します(DefaultはNSFeの仕様で標準化された規格です)。 APU1 : Squares - Default: 0 APU2 : Triangle / Noise / DPCM - Comparison: Triangle - Default: -20 VRC6 : Default: 0 VRC7 : Comparison: Pseudo-square - Default: 1100 FDS : Default: 700 MMC5 : Default: 0 N163 : Comparison: 1-Channel mode - Default: 1100 or 1900 SN5B : Comparison: Volume 12 ($C) - Default: -130 volumeは音量を、-32768~32767で指定します(単位;1/100dB)。 |
|
#code "name" | nsd.bin | 1 | v | リンクするNSF用のROMコードを指定します。 コンパイルオプション`-l'でROMコードの指定がある場合は、コンパイルオプションを優先します。 各ROMコードの詳細は、各.lib/.binの仕様を参照ねがいます。 NSFe作成時は、各.binの設定を元に、NSFeのメタデータを生成します。 |
#External n | 各.binによる | 1 | v | NSFのヘッダーに設定する拡張音源フラグを、この値に書き換えます(初期値は各.binで異なります)。 |
#VRC7 n | 0 | 2 | v | VRC7の換装を設定します(NSFプレイヤーが対応している場合、VRC7がOPLLの音色に切り替わります。)。 0 - VRC7 1 - YM2413 (`nsd_opll.bin'を使用する場合、こちらを指定してください) |
#Bank | 非指定 | 1 | v | ⊿PCMのバンク切り替えに対応した.bin(nsd_all.bin, nsd_all2.bin)をリンクする場合に、各コマンドを記述する前に必ず指定してください。 |
エスケープシーケンス利用可と記載されたコマンドについては、以下のエスケープシーケンスを使用できます。
記述 | 意味 |
---|---|
\a | ベル文字(アラート) |
\b | 1文字分戻る |
\f | ページ送り(クリア) |
\n | 改行、復帰 |
\r | 同じ行の先頭に戻る |
\t | 水平タブ |
\v | 垂直タブ |
\\ | \を表示 |
\? | ?を表示 |
\' | シングルクォーテーション(')を表示 |
\" | ダブルクォーテーション(")を表示 |
\N | 8進定数(Nは8進数の定数) |
\xN | 16進定数(Nは16進数の定数) |
アセンブリ言語ソースにて出力する際の設定コマンドです。
主に、6502開発環境"cc65"に付属の、アセンブラ"ca65.exe"用の疑似命令の出力を制御します。
ユーザー・アプリケーションに組み込む場合に、設定して下さい。
Command | Default | Contens |
---|---|---|
#segment "name" #segmentSEQ "name" |
RODATA | 曲、効果音、エンベロープ、音色データ等(⊿PCM以外)を配置するセグメント名を指定します。 これらのデータは、アセンブリ言語ソースにて、『.segment "name"』とセグメント名が指定されます。 複数のMMLファイルから生成したアセンブリ言語ソースを、同一のファイルにリンクする場合、 異なるセグメント名("ld65.exe"のコンフィグファイルにて異なるバンクマッピングされた)に設定することで、 バンク(32kByteを超える容量)に対応したNESファイルはもちろん、NSFを生成する事も可能です。 |
#segmentPCM "name" | PCMDATA | ⊿PCMの実体を配置するセグメント名を指定します。 ⊿PCMの実体を出力する際は、アセンブリ言語ソースにて、『.segment "name"』とセグメント名が指定されます。 このセグメントは、リンカー"ld65.exe"のコンフィグファイルにて、 #offsetPCMコマンドで設定したアドレスと、同じアドレスに設定して下さい。 名前を""(何も無し)に設定した場合は、⊿PCMの実体をアセンブリ言語ソースへ出力しません。 これは、同一の⊿PCMを使用する複数のMMLファイルから生成したアセンブリ言語ソースを、 同一のファイルにリンクする場合において、どれか1つのMMLのみ、⊿PCMの実体を出力すればよいためです。 |
#label "name" | _nsd_ | ラベル名(シンボル名)の先頭に付与する文字列を指定します。 Cコンパイラは、C言語で記述されたラベル(シンボル)名の先頭に`_'を付加します。 従い、C言語から曲データを参照する場合、MML側で設定するラベル名は先頭に`_'を追加してください。 複数のMMLファイルから生成したアセンブリ言語ソースを、同一のファイルにリンクする場合は、 必ず、各MMLファイル中で異なるラベル名を設定して下さい。 |
複数のMMLから変換したアセンブリ言語ソースを、同一のプロジェクト・ファイルにリンクしてビルドする場合でも、
エンベロープ定義、音色定義、⊿PCMの定義は、各MMLファイル毎に設定して下さい(異なる設定も可能です)。
曲・効果音は、以下の手順で再生して下さい。
データの再生中は、シーケンスデータが常時6502のメモリ空間に存在している必要はありません。
nsd_main()関数を呼び出す際に、
6502のメモリ空間に再生するデータがあるバンクをマッピングし、
呼び出した後はバンクを切り替えても問題ありません。
但し、⊿PCMを使用する場合は、⊿PCMの実体が存在するバンクは常時6502のメモリ空間にマッピングして下さい。
0~9で始まる数値は、10進数とみなします。
$で始まる数値は、16進数とみなします。
%で始まる数値は、2進数とみなします。