MML文法

MMLの全体的な構文は、`#'で始まる定義、疑似命令及び、 データ(音色データ、エンベロープパターン、シーケンスデータ等)を記述する記述ブロックで構成されます。
MMLコンパイラは、ASCIIコード0x00〜0x20(改行、TAB、スペース等)を無視します。

MMLは、ASCIIと互換性のある文字コード(Shift-JIS、UTF-8等)で記述してください。

共通のコマンド

曲や効果音の設定・記述をするためのコマンド群です。

コマンド一覧
CommandDefaultContens
#include "filename" -外部ファイルを呼び込みます。
#bgm n 1BGM(曲)の数を設定します。
#se n 0SE(効果音)の数を設定します。
#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にします。儕CMの場合はKeyOffします。
 1 … 直前のノートを、R@, Rvコマンドの値で鳴らします。
 2 … 直前のノートのエンベロープ(音色・音量)を継続し、リリースパターンが定義されている場合それに従います。
 3 … Rmコマンドに従います。
#wait n 0シーケンス記述ブロック内におけるw コマンドによる休符のコンパイル方法を設定します。
 0 … 強制的に、音量を0にします。儕CMの場合は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
(儕CM無し)
儕CMを配置するアドレスを指定します。
シーケンスデータはこのコマンドで指定したアドレス-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
}
- 儕CM定義の記述ブロックです。
儕CM定義の記述は、儕CM定義(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 music format用の設定コマンドです。
多くのコマンドは、NSFへビルドする際に、NSFヘッダーに設定されます。

コマンド一覧
CommandDefaultContens
#title "strings" タイトル名を設定します。NSFビルド時にヘッダーに埋め込まれます。
#composer "strings" 作曲者を設定します。NSFビルド時にヘッダーに埋め込まれます。
#copyright "strings" 著作権者を設定します。NSFビルド時にヘッダーに埋め込まれます。
#code "name" nsd.binリンクするNSF用のROMコードを指定します。
コンパイルオプション`-l'でROMコードの指定がある場合は、コンパイルオプションを優先します。
各ROMコードの詳細は、各.lib/.binの仕様を参照ねがいます。
#External n 各.binによるNSFのヘッダーに設定する拡張音源フラグを、この値に書き換えます(初期値は各.binで異なります)。
#Bank -儕CMのバンク切り替えに対応した.bin(nsd_all.bin, nsd_all2.bin)をリンクする場合に、各コマンドを記述する前に必ず指定してください。

アセンブリ言語ソースを出力する際に有効なコマンド

アセンブリ言語ソースにて出力する際の設定コマンドです。
主に、6502開発環境"cc65"に付属の、アセンブラ"ca65.exe"用の疑似命令の出力を制御します。
ユーザー・アプリケーションに組み込む場合に、設定して下さい。

コマンド一覧
CommandDefaultContens
#segment "name"
#segmentSEQ "name"
RODATA 曲、効果音、エンベロープ、音色データ等(儕CM以外)を配置するセグメント名を指定します。
これらのデータは、アセンブリ言語ソースにて、『.segment "name"』とセグメント名が指定されます。
複数のMMLファイルから生成したアセンブリ言語ソースを、同一のファイルにリンクする場合、 異なるセグメント名("ld65.exe"のコンフィグファイルにて異なるバンクマッピングされた)に設定することで、 バンク(32kByteを超える容量)に対応したNESファイルはもちろん、NSFを生成する事も可能です。
#segmentPCM "name" PCMDATA 儕CMの実体を配置するセグメント名を指定します。
儕CMの実体を出力する際は、アセンブリ言語ソースにて、『.segment "name"』とセグメント名が指定されます。
このセグメントは、リンカー"ld65.exe"のコンフィグファイルにて、 #offsetPCMコマンドで設定したアドレスと、同じアドレスに設定して下さい。
名前を""(何も無し)に設定した場合は、儕CMの実体をアセンブリ言語ソースへ出力しません。
これは、同一の儕CMを使用する複数のMMLファイルから生成したアセンブリ言語ソースを、 同一のファイルにリンクする場合において、どれか1つのMMLのみ、儕CMの実体を出力すればよいためです。
#label "name" _nsd_ ラベル名(シンボル名)の先頭に付与する文字列を指定します。
Cコンパイラは、C言語で記述されたラベル(シンボル)名の先頭に`_'を付加します。
従い、C言語から曲データを参照する場合、MML側で設定するラベル名は先頭に`_'を追加してください。
複数のMMLファイルから生成したアセンブリ言語ソースを、同一のファイルにリンクする場合は、 必ず、各MMLファイル中で異なるラベル名を設定して下さい。

複数のMMLから変換したアセンブリ言語ソースを、同一のプロジェクト・ファイルにリンクしてビルドする場合でも、 エンベロープ定義、音色定義、凾oCMの定義は、各MMLファイル毎に設定して下さい(異なる設定も可能です)。

曲・効果音は、以下の手順で再生して下さい。

  1. 6502のメモリ空間に、これから再生するデータがあるバンクをマッピング。もしくはロード。
    (※既に6502のメモリ空間に存在している場合は不要)
  2. nsd_set_dpcm()関数にて儕CM制御構造体を設定
    (※凾oCMを使用しない場合、及び、現在再生中のデータと同じMMLファイルに記述された曲・効果音を再生する際は不要)
  3. nsd_play_bgm()関数、nsd_play_se()関数にて再生開始
    (※尚、関数呼び出し後は、バンクを切り替えても問題ありません。)

データの再生中は、シーケンスデータが常時6502のメモリ空間に存在している必要はありません。
nsd_main()関数を呼び出す際に、 6502のメモリ空間に再生するデータがあるバンクをマッピングし、 呼び出した後はバンクを切り替えても問題ありません。
但し、儕CMを使用する場合は、儕CMの実体が存在するバンクは常時6502のメモリ空間にマッピングして下さい。

数値の記法

0〜9で始まる数値は、10進数とみなします。
$で始まる数値は、16進数とみなします。
%で始まる数値は、2進数とみなします。