MML文法

全体の構文(MML Construction)

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

共通のコマンド

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

コマンド一覧
CommandContens
#include "filename" 外部ファイルを呼び込みます。
#bgm n BGMの曲数を設定します。(Default: n = 1)
#se n SE の曲数を設定します。(Default: n = 0)
#priority n 以降のSE の優先度を設定します。(Default: n = 0)
 (0 : 優先度高 〜 3:優先度低)
#timebase n 以降のBGM, SE, Subブロックの四分音符の分割数を設定します。(Default: n = 24)
何度でも指定可能であり、各BGM, SE, サブルーチン毎に設定することもできます。
MMLコンパイラの疑似命令です。
#octaveReverse 本コマンドを記述することで、シーケンス記述ブロック内における相対オクターブコマンド `<'と`>'を入れ替えます。
#rest n シーケンス記述ブロック内におけるr コマンドのモードを設定します(Default: n = 2)
 0 … 強制的に、音量を0にします。儕CMの場合はKeyOffします。
 1 … 直前のノートを、R@, Rvコマンドの値で鳴らします。
 2 … 直前のノートのエンベロープ(音色・音量)を継続します。(Default)
#wait n シーケンス記述ブロック内におけるw コマンドのモードを設定します(Default: n = 0)
数値の意味は、#rest コマンドと同じです。
#QMax n シーケンス記述ブロック内におけるQ コマンドの分母を設定します(Default: n = 8)
実際の発音音長は、音長 × Q コマンドの値 ÷ n となります。
#RepeatMode n シーケンス記述ブロック内におけるリピート(A)コマンドのコンパイル方法を設定します。(Default: n = 0)
nは0〜2の範囲で指定します。数値の詳細は、リピート(A)コマンドを参照。
#ReleaseVolume n シーケンス記述ブロック内におけるRvコマンドの初期値を設定します。(Default: n = 2)
nは0〜15の範囲で指定します。
#offsetE@ n シーケンス記述ブロック内にて、E@コマンドの引数を指定数値だけずらします。(Default: n = 0)
#offsetEv n シーケンス記述ブロック内にて、Evコマンドの引数を指定数値だけずらします。(Default: n = 0)
#offsetEm n シーケンス記述ブロック内にて、Emコマンドの引数を指定数値だけずらします。(Default: n = 0)
#offsetEn n シーケンス記述ブロック内にて、Enコマンドの引数を指定数値だけずらします。(Default: n = 0)
#offsetPCM address 儕CMを配置するアドレスを指定します。(Default: address = $10000(儕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ヘッダーに設定されます。

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

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

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

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