MMLテキストの記述で定義する内容は、およそ、次の3種類です。
再生要求を受けると、MMLテキストはコンパイルされてから演奏されます。
コンパイルされる内容のうち、時間ごとにシーケンスされるのは、MML定義の部分だけです。
MML定義以外の部分は、コンパイル前の処理(プリプロセッサ)により、波形データに変換されたり、文字置換されたりするため、直接のシーケンスデータにはなっていない点に注意してください。
cdefg;というように、発音させたい内容を書いてトラック定義します。
MML定義内では、前もって定義したマクロを $名前 で参照することも出来ます。MML定義内容をマクロ参照だけで満たしても構いません。
ひとつの発音トラックは、基本的に単音(和音にならない)フレーズを鳴らす内容になります。しかしながら、ひとつの発音トラックで和音を鳴らす、特別な定義方法もあります。
V3MMLでは、あらゆる記述で、大文字・小文字を区別します。
V1MML、V2MMLでは、MMLコマンドで大文字・小文字の区別をしませんでしたが、V3MMLでは区別しますのでご注意ください。
トラック先頭(MMLコマンドを1つも記述してない状態のトラック)で、次のような書き方をすると、マクロとして定義されます。
$名前=内容;
マクロの内容には改行を含んでも良いので、長いフレーズの定義も可能です。また、トラック先頭であれば、複数のマクロを定義できます。
定義されたマクロは、それ以降に記述されたトラック内にて $名前 で参照され、内容 に置き換えられます。この置き換えは、プリプロセッサにより行われます。
すでに定義されたマクロを、以降のマクロ定義で参照するような、入れ子的なマクロ定義も可能です。
マクロ定義はセミコロンで締め括りますが、トラック定義とは別物と考えてください。
トラック先頭において $ で始まる部分は、マクロ定義モードと解釈されます。
しかし、マクロ定義後に、1つでもMMLコマンドを記述すると、トラック定義モードとなり、$ は定義済みマクロの参照開始とみなされますので、MML記述中にマクロを定義することは出来ません。
メタデータとは、データのためのデータ、のことです。MMLのモード設定や、波形データのユーザー定義など、付随情報全般をサポートする記述がメタデータです。
メタデータの定義は、行頭から「#」を付けたコマンドで行いますが、およそ、次の2種類に分けられます。
メタラインでは、改行を定義終端として認識しています。
メタブロックでは、中かっこ { } によってデータを括っていて、中かっこ閉じ } を定義終端として認識するため、途中に改行が入ることが許されます。
メタライン、メタブロック共に、終端にセミコロンは不要です。
メタデータを記述する位置は、MML定義の前でも後でも大丈夫です。これは、メタデータもマクロ同様、MMLが解釈される前にテキスト全体検索で情報取得後、すぐに除去されるため、MMLが解釈される時には無かったことにされているからです。
メタデータ定義がグループ化されている理由は、検索回数を最小限に抑え、コンパイル時間を短くするためです。