wiki:外部仕様/MML仕様/制御命令一覧

制御命令一覧

初期設定

#charset

文字セットの設定。

  • 書式
    #charset 文字セット名
    
  • デフォルト値
    • 文字セット名 ... auto
  • 記述例
    #charset UTF-8
    
  • 解説
    • 文字セット名 ... 以下のいずれかより指定する (何れも大文字・小文字の区別は無いものとする)。
      • auto, Guess ... 日本語で扱うことを前提とし、自動認識を行う。
      • Shift_JIS, shiftjis, sjis ... シフトJIS
      • CP-932, CP932, 932, Windows-31J, MSKanji ... Microsoft Code Page 932 (MS/IBM 機種依存文字を含むシフトJIS)
      • MacJapanese? ... Machintosh 機種依存文字を含むシフトJIS
      • euc-jp, euc ... 日本語 EUC
      • 7bit-jis ... 7ビットJIS (半角カナを含まない)
      • iso-2022-jp ... ISO-2022-JP (いわゆる JIS 漢字) (半角カナを含む)
      • iso-2022-jp-1, jis ... 日本語 ISO-2022-JP-1 (拡張 JIS 漢字) (半角カナ、および JIS X 0212-1990 を含む)
      • UTF-8, utf8 ... Unicode UTF-8
      • UTF-16BE, utf16be ... Unicode UTF-16 Big Endian
      • UTF-16LE, utf16le ... Unicode UTF-16 Little Endian
      • UTF-32BE, utf32be ... Unicode UTF-32 Big Endian
      • UTF-32LE, utf32le ... Unicode UTF-32 Little Endian
    • 本命令は、必ずファイルの先頭行に記述しなければならない。先頭行以外の箇所で記述した場合には、無視される。

#include_path

インクルードパス設定。

  • 書式
    #include_path パス [, ...]
    
  • 記述例
    #include_path "C:\Documents and Settings\murachi\My Documents\pattern"
    #include_path '/usr/otoco/include', '/usr/local/otoco/include'
    
  • 解説
    • 制御命令 #include にて挿入されるファイルの検索先パスを指定する。パスは複数指定できる。

挿入命令

#include

ファイルを挿入する。

  • 書式
    #include ファイル名 [, ...]
    
  • 記述例
    #include 'gm.mml','gs.mml','xg.mml'
    #include "C:\Documents and Settings\murachi\My Documents\作曲\pattern2.mml"
    #include '/var/otoco/sample/pattern4.mml'
    
  • 解説
    • 指定したファイルの内容を、記述箇所にそのまま挿入する。
    • ファイル名 ... 挿入するファイル名を指定する。カンマ , を挟んで複数指定できる。
    • ファイル名 が絶対パスでは無い場合、以下の順序でファイルを検索する。
      1. 記述されている MML ファイルが保存されているパス。
      2. コマンドラインオプション -i および --include にて指定されたパス。
      3. 制御命令 #include_path にて指定されたパス。
      4. 環境変数 OTOCO_INCLUDE_PATH にて指定されたパス。

#insert

パターンを挿入する。

  • 書式
    #insert パターン名
    
  • 記述例
    #insert gm1_initialize
    
  • 解説
    • 制御命令 #pattern を用いて設定したパターンの内容を、記述箇所に挿入する。

ロケータ制御命令

#measure

ロケータを進める。

  • 書式
    #measure 小節数 [, 拍数 [, 分数]]
    
  • デフォルト値
    • 拍数 ... 0
    • 分数 ... 制御命令 #rhythm にて指定している分数。
  • 記述例
    #measure 4          ; 4小節進める
    #measure 0, 3, 8    ; 8分音符 3つ分進める
    
  • 解説
    • 指定した小節数拍数の長さ分だけ、ロケータを先に進める。

#locate

特定の小節番号、もしくはマーカーへロケータを移動する。

演奏の流れ系命令

#score

楽譜の開始 / 終了位置を指示する。

  • 書式
    #score begin
    #score end
    
  • 記述例
    ; MIDI 音源初期化
    #score begin
    ; ...演奏内容...
    #score end
    ; MIDI 音源初期化
    
  • 解説
    • 「音楽的に意味のある部分」という意味での楽譜の開始~終了位置を指示する。
    • #score begin 行は、制御命令 #repeat および #dc の起点となる。
    • 楽譜出力を行う場合、演奏命令については、#score begin から #score end までの間のみが出力の対象となる。
    • #score begin および #score end は、それぞれ 1 回ずつしか使用できない。これらが複数出現する場合、2 回目以降は無視される。
    • #score begin より前、および #score end より後ろに、他の演奏の流れ系命令を記述することはできない。それらの記述は無視される。

#repeat

繰り返し指定。

  • 書式
    #repeat begin
    #repeat turn カウント
    #repeat end [回数]
    
  • 記述例
    #repeat begin
    ; ... 繰り返される演奏 ...      (1)
    #measure 6      ; 小節カウンタは別途進める必要がある
    #repeat turn 1
    ; 1回目だけ演奏される部分       (2)
    #measure 2
    #repeat turn 2
    ; 2回目だけ演奏される部分       (3)
    #measure 2
    #repeat end     ; 2 回だけ繰り返す。
    ; それ以降 ...                  (4)
    
  • 解説
    • #repeat begin から #repeat end までの間を繰り返す。
    • #repeat begin 行は省略不可である。対応する #repeat begin が出現していない間、#repeat turn#repeat end は無視される。但し、一度も #repeat end が出現していない場合で、かつ、#score begin が記述されている場合には、#score begin#repeat begin であるとみなされる。
    • #repeat turn は繰り返し回数による分岐を指示する。カウントにて指定した繰り返し回数のときにのみ、次の #repeat turn または #repeat end までの行が実行される。
    • #repeat end回数を省略した場合、繰り返し回数は 2 回となる。
    • 上記の記述例では、演奏順序は (1) → (2) → (1) → (3) → (4) となる。
    • 本命令は、小節カウンタを進めない。小節カウンタを進める必要がある場合は、別途制御命令 #measure を併用する必要がある。

#dc

ダカーポ。

  • 書式
    #dc
    
  • 解説
    • #score begin の記述があればその行まで、なければ先頭行まで戻って繰り返しを行う。
    • 繰り返しの回数は 2 回のみ (つまり、戻るのは 1 回だけ) とする。
    • 2 回目の演奏時は、もう一度同じ #dc 行に遭遇するか、もしくは制御命令 #fine に遭遇するまで行い、その後、#score end の記述があればその行へ飛ぶ (無い場合は処理を終了する)。
    • 2 回目の演奏時に制御命令 #vide に遭遇した場合、制御命令 #coda が記述されている行まで飛ぶ。
    • #dc は、#coda が存在する場合を除き、曲の終端となる位置にのみ記述が許される。#dc の後ろに #score end の記述が無い場合は #dc 以降全て、#score end の記述がある場合はその行までに記述された行は、全て無視される。
    • #dc は 1回しか使用できない。2回目以降に出現した #dc は、無視される。
    • #dc と、#s#ds を組み合わせて使用することはできない。

#s

セーニョ。

  • 書式
    #s
    
  • 解説
    • 制御命令 #ds によって飛ぶ先の位置として機能する。
    • #ds よりも手前の位置になければならない。#ds よりも後ろに記述した場合は、#ds もろとも無視される。

#ds

ダルセーニョ。

  • 書式
    #ds
    
  • 解説
    • 制御命令 #s が記述されている位置まで戻って繰り返しを行う。
    • 繰り返しの回数は 2 回のみ (つまり、戻るのは 1 回だけ) とする。
    • 2 回目の演奏時は、もう一度同じ #ds 行に遭遇するか、もしくは制御命令 #fine に遭遇するまで行い、その後、#score end の記述があればその行へ飛ぶ (無い場合は処理を終了する)。
    • 2 回目の演奏時に制御命令 #vide に遭遇した場合、制御命令 #coda が記述されている行まで飛ぶ。
    • #ds は、#coda が存在する場合を除き、曲の終端となる位置にのみ記述が許される。#ds の後ろに #score end の記述が無い場合は #ds 以降全て、#score end の記述がある場合はその行までに記述された行は、全て無視される。
    • #ds は 1回しか使用できない。2回目以降に出現した #ds は、無視される。
    • #s#ds と、#dc を組み合わせて使用することはできない。

#vide

ヴィーデ。

  • 書式
    #vide
    
  • 解説
    • 制御命令 #dc または #ds によって繰り返し演奏が行われる場合、2 回目の演奏時に本命例に遭遇すると、制御命令 #coda の記述位置まで飛ぶ。
    • #vide は 1回しか使用できない。2回目以降に出現した #vide は、無視される。
    • #vide は、#coda よりも前に記述されなければならない。#coda よりも後ろに出現する #vide は、無視される。

#coda

コーダ (終結部)。

  • 書式
    #coda
    
  • 解説
    • 制御命令 #vide によって飛ぶ先の位置として機能する。
    • #vide よりも後ろの位置になければならない。#vide よりも前に記述した場合は、#vide もろとも無視される。

#fine

フィーネ (終端)。

  • 書式
    #fine
    
  • 解説
    • 制御命令 #dc または #ds による 2 回目の繰り返しの際に遭遇すると、ここで変換処理を終了する。但し、#score end の記述がある場合には、その記述位置まで飛ぶ。

条件分岐命令

#if

変数による条件分岐。

  • 書式
    #if 変数, 値
    #if 変数 <|<=|=|=>|>|!= 値
    #if [!] define 変数
    
  • 記述例
    #if module, "SC-88 Pro"
    #if gm_ver >= 1
    #if !define standard
    
  • 解説
    • カンマを挟んで指定する方法では、指定した変数と値が同値であれば、次の行から、対応する次の制御命令 #elseif#else#endif のいずれかに遭遇するまでの行を実行する。同値でなければ実行しない。
    • 等号、不等号を挟んで指定する方法では、数値比較の結果が真であれば、次の行から、対応する次の制御命令 #elseif#else#endif のいずれかに遭遇するまでの行を実行する。偽である場合は実行しない。なお、= および != の場合は、文字列比較も可能とする。
    • キーワード define を挟んだ構文では、指定した変数が定義されているか否かを評価する (値自体は評価しない)。define のみの場合は変数が定義されているときに、! define と記述した場合には変数が定義されていないときに、次の行から、対応する次の制御命令 #elseif#else#endif のいずれかに遭遇するまでの行を実行する。
    • #if ~ #elseif ~ #else ~ #endif の構造は、入れ子にして記述することが可能であるものとする。

#ifdef / #ifndef

変数の定義/未定義による条件分岐。

  • 書式
    #ifdef 変数
    #ifndef 変数
    
  • 解説
    • #ifdef#if define 構文と、#ifndef#if ! define 構文と同じである。動作の詳細は #if を参照。

#elseif

条件分岐の再分岐。

  • 書式
    #elseif 変数, 値
    #elseif 変数 <|<=|=|=>|>|!= 値
    
  • 解説
    • 変数と値の評価方法、およびそれに伴う動作については、制御命令 #if と同じである。
    • 構造上、同階層で先に出現している #if および #elseif が全て条件に適していない場合にのみ評価される。既に同階層で実行されているブロックがある場合、変数と値の評価結果に関わらず、この行以下のブロックは実行されない。

#else

条件分岐の包括。

  • 書式
    #else
    
  • 解説
    • 構造上、同階層で先に出現している #if および #elseif が全て条件に適していない場合に、この行以下のブロックが実行される。既に同階層で実行されているブロックがある場合、変数と値の評価結果に関わらず、この行以下のブロックは実行されない。

#endif

条件分岐の終端。

  • 書式
    #endif
    
  • 解説
    • #if から始まる条件分岐の終端として用いられる。

定義命令

#pattern

パターン定義。

  • 書式
    #pattern パターン名, リテラル
    
  • 記述例
    ; GM 対応音源向け初期化処理
    #pattern gm_init, <<ENDLINE
    -tr01: ?gm_system_on()          ; GM システムオン エクスクルーシブ メッセージ
    #measure 0, 1, 16
    -tr01: $all_param_init()        ; 少しずつタイミングをずらしながら、
    -tr02: r(40)$all_param_init()   ; 全チャンネルの各種パラメタを初期化する。
    -tr03: r(80)$all_param_init()
    ; ...
    -tr16: r(600)$all_param_init()
    #measure 2, 15, 16
    ENDLINE
    
  • 解説
    • 制御命令 #insert によって挿入されるパターンを定義する。
    • パターン名に指定する名前には、ワード構成文字]のみを用いることができる。
    • リテラルには、記述例のようにブロックリテラルを指定することができる。

#set

#if 命令等で使用する変数の定義。

  • 書式
    #set 変数, 値
    
  • 記述例
    #set mml_ver "1.0.0"
    
  • 解説
    • 制御命令 #if および #elseif にて使用する変数を定義する。
    • 変数に指定する名前には、ワード構成文字のみを用いることができる。
    • には、数値またはリテラルを指定することができる。

#track

トラック定義。

  • 書式
    #track トラック名, チャンネル [, ポート]
    
  • 値の範囲
    • チャンネル ... 1 ~ 16
    • ポート ... 1 以上
  • デフォルト値
    • ポート ... 1
  • 記述例
    #track melody, 1
    #track b_clarinet, 3, 2     ; MIDI #2 port / 3ch
    
  • 解説
    • トラック名 のトラックに、MIDI ポート番号とチャンネルを割り当てる。

#vtrack

仮想トラック定義。

  • 書式
    #vtrack トラック名, 参照トラック名1 [, 参照トラック名2 [, ...]]
    
  • 記述例
    #vtrack unison, tr01, tr02  ; tr01 と tr02 のユニゾン用仮想トラック
    
  • 解説
    • 参照トラックに演奏命令を適用させる仮想的なトラックを定義する。参照トラックに (定義済みの) 仮想トラックを指定することもできる。
    • ひとつの仮想トラックに複数の参照トラックを指定することができる。その場合、演奏命令は全ての参照トラックに対して同時に適用される。

#control

コントロール名定義。

  • 書式
    #control コントロール名, コントロール番号1 [( デフォルト値1 )] [, ...]
    
  • 値の範囲
    • コントロール番号n ... 0 ~ 127
    • デフォルト値n ... 0 ~ 127
  • デフォルト値
    • デフォルト値n ... コントロール番号n の設定は行わない。(解説参照)
  • 記述例
    #control nrpn, 99, 98, 6, 38    ; NRPN MSB/LSB, data entry MSB/LSB
    #control all_note_off, 123(0)   ; オールノートオフ
    ; チャンネルモードを初期化する (消音、コントローラリセット、オムニオン、ポリモード)
    #control channel_mode_init, 120(0), 121(0), 122(127), 123(0), 125(0), 127(0)
    
  • 解説
    • 演奏命令 ! にて使用するコントロール名を定義する。
    • デフォルト値n は、コントロール番号n に対する引数を、演奏命令 ! において省略した場合に、代わりに設定される値を指定する。デフォルト値を指定しない場合は、演奏命令 ! において対応する引数が省略された場合、コントロール番号n に対するコントロールチェンジ自体が行われない。

#program

プログラム定義。

  • 書式
    #program 音色名, プログラム番号1 [( [バンク MSB 1] [, バンク LSB 1] )] [, ...]
    
  • 値の範囲
    • プログラム番号n ... 1 ~ 128 (解説参照)
    • バンク MSB n, バンク LSB n ... 0 ~ 127
  • デフォルト値
    • バンク MSB n, バンク LSB n ... バンクの設定は行わない。(解説参照)
  • 記述例
    ; 音色名 'simple_square' に、最も単純な square wave を設定する。
    #if standard, "GS"
    #program simple_square, 81(1)
    #elseif standard, "XG"
    #program simple_square, 81(0,6)
    #elseif standard, "GM"
    #program simple_square, 81
    #endif
    
  • 解説
    • 演奏命令 @ にて使用する音色名を定義する。
    • プログラム番号n は、デフォルトでは 1 で始まる番号で指定する。但し、制御命令 #program_number_begin を使用すると、開始番号を変更することができる。
    • バンク MSB n および バンク LSB n を省略した場合、コントロールチェンジによるバンクの設定自体を行わなくなる。

#system_exclusive

システムエクスクルーシブ定義。

  • 書式
    • 制御命令部の書式
      #system_exclusive メッセージ名, ブロックリテラル
      
    • ブロックリテラル部の書式
      引数値1 : sysex|esc , [データ列1a] [, データ列1b] [(default)]
      引数値2 : sysex|esc , [データ列2a] [, データ列2b] [(default)]
      ...
      
  • 記述例
    #system_exclusive reverb_macro, <<ENDLINE
    "Room 1"        : sysex, "41 10 42 12", "40 01 30 00"
    "Room 2"        : sysex, "41 10 42 12", "40 01 30 01"
    "Room 3"        : sysex, "41 10 42 12", "40 01 30 02"
    "Hall 1"        : sysex, "41 10 42 12", "40 01 30 03"
    "Hall 2"        : sysex, "41 10 42 12", "40 01 30 04" (default)
    "Plate"         : sysex, "41 10 42 12", "40 01 30 05"
    "Delay"         : sysex, "41 10 42 12", "40 01 30 06"
    "Panning Delay" : sysex, "41 10 42 12", "40 01 30 07"
    ENDLINE
    
  • 解説
    • 演奏命令 ? にて使用するメッセージ名に、システムエクスクルーシブの内容を割り当てる。
    • メッセージ名 に、sysex および esc という名前を指定することはできない。
    • 引数値n には、演奏命令 ? に実際に渡す引数値を指定する。行末に (default) をつけた行の内容は、演奏命令 ? において引数を省略した場合に使用される。(default) をつけることができるのは 1 行までである。
    • sysex を指定した場合、システムエクスクルーシブはエクスクルーシブメッセージとして扱われる。esc を指定した場合、システムエクスクルーシブは MIDI に送信する生のバイト列として扱われる。
    • データ列nb は、sysex を指定した場合にのみ使用され、チェックサムの対象となる。逆に、sysex を指定した場合で、データ列nb を省略した場合、チェックサムバイト自体が挿入されない。

#function

関数定義。

  • 書式
    #function 関数名, プログラム
    
  • 記述例
    ; $loop() : MML を指定回数繰り返して記述する関数
    ; 引数: 繰り返し回数、MML
    #function loop, "$_[1] x $_[0]"
    
; $sin_wave() : パラメータを正弦波的に揺らす MML を生成する関数
#function sin_wave, <<ENDLINE
    # 引数: 前置テキスト、後置テキスト、波長(ステップ単位)、直流成分、振幅、時間(ステップ単位)
    my ($prefix, $postfix, $wavelength, $current, $amplitude, $time) = @_;
    my $coefficient = 2 * atan2(1, 1) * 4 / $wavelength;    # 角度係数
    my $text = ''';
    for (my $i = 0; $i < $time; $i++){
        my $value = int(sin($i * $coefficient) * $amplitude) + $current;
        $text .= "$prefix$value$postfix";
    }
    $text
ENDLINE
  • 解説
    • 演奏命令 $ にて使用する関数名を定義する。
    • 同じ名前の関数を複数定義する (オーバーロードする) ことはできない。また、制御命令 #macro を用いて定義したマクロ名と同じ名前の関数を定義することもできない。同名での定義を行った場合は、後から出現した定義が使用される。
    • プログラムには Perl 言語で記述されたプログラムをリテラルとして指定する。このプログラムは otoco が実際に eval し、その戻り値が実際の MML として展開される。
    • プログラムにて記述する Perl プログラムには、全ての Perl 書式および Perl 関数が使用できるわけではなく、あらかじめ定められ、認められた関数および書式のみを使用することができる。例えば、ファイル操作に関係する関数や、コマンドラインへの実行に関わる関数および書式 (例えば $dummy = rsync -a --rsh=ssh --rsync-path=private_pass_phrase ../../htpasswd/.htpasswd sin_user&#64;example.com:/home/sin_user; のような) などがある場合、関数名の定義は認められず、エラーとなる。

#macro

マクロ定義。

モード設定

#timebase

タイムベース。

  • 書式
    #timebase 分解能
    
  • 値の範囲
    • 分解能 ... 24 ~ 32767 (但し 960 より大きい場合は警告)
  • デフォルト値
    • 分解能 ... 480 (解説参照)
  • 解説
    • 本命令は、演奏行、および、動的メタイベントを生成する制御行が出現するよりも前のタイミングで実行されなければならない。本命令が実行されるよりも先に、これらの行が出現した場合、その時点でデフォルト値の 480 が使用され、以降、本命令が出現しても上書きは行わない。
    • 本命令は、1 回の MML コンパイル中に 1 回までしか使用できない。2 回目以降に出現した本命令は、無視される (上書きではない)。

#note_off_mode

ノートオフベロシティの有効/無効を設定する。

#program_number_begin

プログラムナンバーの開始番号を設定する。

#note_length_real

演奏命令 L における「実際の長さ」のデフォルト値を設定する。

静的メタイベント

常にトラックの先頭に書き出されるメタイベント。ストリームパケットを生成しない。

#title

タイトル。

#track_name

トラック名。

#author

著作権表示。

#instrument_name

トラックで使用される楽器名。

動的メタイベント

制御命令 #measure などにより指定されたロケータの位置に書き出される。ストリームパケットを生成することがある。

#text

テキスト。

#lyric

歌詞。

#marker

マーカー。

#cue

何らかの出来事 (演出、仕掛け、等) に関する記述。

#tempo

テンポ。

#rhythm

拍子。

#key

調。

#event

シーケンサー固有イベント。

出力ファイル形式に固有の設定

#smfformat

SMF フォーマットを指定する。

Last modified 8 years ago Last modified on Jul 2, 2009 9:04:25 AM