Last modified 3 years ago
Last modified on 07/02/09 07:07:02
MML書式仕様
1. 構成
MML は以下の 3 つの行によって構成される。
- 制御行
- トラック指示行
- 演奏行
2. 一般規則
2-1 アルファベット
- 演奏命令、制御命令名、関数・マクロ名、トラック名において、大文字と小文字は、区別しない。
2-2 空白
- 半角空白、およびタブは、空白として扱う。
- 改行は、あくまで改行として扱う。
- リテラル以外の場所で書いた空白は、原則的に無視される。
2-3 識別子
- トラック名、マクロ名、関数名、音色名、(システムエクスクルーシブ) メッセージ名等のキーワードに使用できる名前のことを、識別子と呼ぶ。
- 識別子は、アルファベットまたは下線 _ で始まり、アルファベットまたは下線 _ または番号のみによって構成される。また、大文字・小文字の区別はない。
2-3 リテラル
- 引用符 ' または二重引用符 " によって括られた文字列は、インラインリテラルとして扱われる。
- <<終端文字列 という書き方を用いることによって、ブロックリテラルを使用することができる。例えば以下のように使用する。なお、「終端文字列」は識別子でなければならない。
#function repeat, <<ENDLINE my ($number, $mml1, $mml2) = @_; ("$mml1$mml2" x $number - 1) . $mml1 ENDLINE - インラインリテラルは、文字列を引数としてとる演奏命令や制御命令、関数、マクロなどにおいて使用することができる。ブロックリテラルは制御命令においてのみ使用することができる。
- インラインリテラルでは、以下のエスケープ記法規則がある。
- デリミタが引用符 ' の場合のみ、文字列 \' は、文字 ' として扱われる。
- デリミタが二重引用符 " の場合のみ、文字列 \" は、文字 " として扱われる。
- どちらの場合も、文字列
は、文字 \ として扱われる。
- ブロックリテラルでは、エスケープ記法規則は一切存在しない。
- リテラルに含まれる空白は、空白としてではなく、そのままの文字として扱われる。
2-4 コメント
コメントの書式は以下の通り。
;[コメント...]
- セミコロン ; で開始する。
- コメントのみの行を記述しても良いが、制御行、トラック指示行、演奏行の行末にコメントを追加することもできる。すなわち、行の中にセミコロン ; が出現すると、そこから後ろは全てコメントとなる。
- リテラルの中に含まれるセミコロン ; はコメントの開始にはならない。
3. 制御行
制御行の書式は以下の通り。
#制御命令名 [引数...]
- 行頭は必ず番号記号 # で開始する。番号記号の前後に空白を含んでも良い。
- 引数は制御命令ごとに取る個数が異なる (引数を採らない制御命令も存在する)。基本的には複数の引数をカンマ , を挟んで指定する。引数として指定できるのは、数値、識別子、リテラルのいずれかである。実際に指定できる値については、各制御命令にて個別に定義される。
4. トラック指示行
トラック指示行の書式は以下の通り。
-トラック名[(パート番号)][: [演奏命令...]]
- 行頭は必ずマイナス記号 - で開始する。マイナス記号の前後に空白を含んでも良い。
- パート番号を省略した場合、パート 0 として扱う。パート番号は宣言せずにいつでも使い始めることができる。全てのパートは独立した時系列を持っている。
- トラック名の後ろに演奏命令を続けて書かない場合は、コロン : は省略しても構わない。
- 演奏命令の記述規則については、5. 演奏行>#play-paragraph?を参照。
- トラック指示行が 1 つも出現しない場合、MML コンパイラはデフォルトのトラックを tr01 であるものとして扱う。
5. 演奏行
演奏行の書式は以下の通り。
[演奏命令...]
- 演奏命令の書式は演奏命令ごとにそれぞれ定義されている。詳細は演奏命令一覧を参照のこと。
- 演奏命令は空白を含んでも構わないし含まなくても良い (いずれにせよ無視される)。演奏命令がリテラルを引数にとる場合、リテラルに含まれる空白は文字として扱われる。
例えば、以下はいずれも同じである。
@piano()o6l4q90$repeat(2,cdefgab>cc<bagfedc)
@ pi a no () o 6 l 4 q 90 $rep eat (2, cdef gab>c c<bag fedc)
- 演奏命令は改行を含むことはできない。例えば以下のような書き方は可能だが、
@piano() o6l4q90 ; 命令と命令の間に改行を入れるのは可能 $repeat(2, cdefgab>c c<bagfedc)
以下のような書き方はできない。@ ; 1 つの演奏命令の途中で改行を含むことはできない piano() o6l ; 同上 4q90 $repeat( ; 関数・マクロは一行にすべて書ききる必要がある 2, cdefgab>c c<bagfedc )
