wiki:外部仕様/MML仕様/MML書式仕様

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
    )
    
Last modified 10 years ago Last modified on Jul 2, 2009 7:07:02 AM