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にします。⊿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 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"用の疑似命令の出力を制御します。
ユーザー・アプリケーションに組み込む場合に、設定して下さい。

コマンド一覧
CommandDefaultContens
#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ファイル毎に設定して下さい(異なる設定も可能です)。

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

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

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

数値の記法

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