V3MMLmanual

5.13 $名前=内容;:マクロ定義

← 目次

【解説】

マクロ機能は、頻繁に使うMMLコマンド群に「名前」をつける機能です。一度「名前」つければ(マクロ定義)、後はその名前を書くだけ(マクロ参照)でMMLコマンド群を呼び出せるので、記述が楽になります。

マクロの定義方法:

マクロを定義するには、トラック先頭(MMLコマンドを1つも記述してない状態のトラック)で、次のように書きます。

$名前=内容;

このように、「$」で始めてマクロ名を書き、次に「=」を書いてからMMLコマンド群を書いて、最後に「;」で締めくくることでマクロを定義します。

マクロの内容には改行を含んでも良いので、長いフレーズの定義も可能です。

また、それぞれのトラック先頭であれば、複数のマクロを定義できます。

すでに定義されたマクロを、以降のマクロ定義で参照するような、入れ子的なマクロ定義も可能です。

マクロ定義はセミコロン「;」で締め括りますが、トラック定義とは別物と考えてください。それぞれのトラック先頭において「$」で始まる部分は、マクロ定義モードと解釈されます。しかし、マクロ定義後に、1つでもMMLコマンドを記述すると、トラック定義モードとなり、「$」は定義済みマクロの参照開始とみなされ ますので、MML記述中にマクロを定義することは出来ません。

マクロの名前の付け方には次の制限があります。

マクロの参照方法:

マクロ定義されたトラック以降で、次のように記述します。

$名前

こうすると、「$名前」が「内容」に置き換えられます。 この置き換えは、プリプロセッサにより行われます。

【マクロの定義と参照の例】

トラック先頭の状態で、次のように書いた場合、

$C=ecgc;
$C $C $C;

上記のトラック定義は、次と同じことになります。

ecgc ecgc ecgc;

このように、MMLコンパイル時、プリプロセッサにより、マクロ参照部分がマクロ定義内容に置き換えられています。マクロ定義部分は、プリプロセッサによる置き換え処理の際に、除去される格好です。

入れ子的にマクロを利用する場合は、次のような感じになります。

$C=ecgc;
$D=fdad;
$M= $C $D;
t150 l16 o5 $M;

マクロ機能は単純な文字列の置き換えなので、ちょっと変わった使い方もできます。例えば、次のように書いた場合、

$C=cd;
l16 $C2$C4$C8;

上記のトラック定義は、

l16 cd2cd4cd8;

と同じこととなり、dの音長だけを変えて記述したことになります。

マクロの定義は、トラック定義の先頭部分に集まっていなければならない制限があります。

使用できる記述例:

$T1=@5 v10;
$T2=@8 v12;
$T1 cgeg $T2 cgeg $T1 egcgc;
$T3=@10 v7;
$T4=@11 v12;
$T1 cccc $T3 cccc $T4 ccccc;

上記では、マクロの定義が1トラック目と2トラック目の先頭部分に集められていて、2トラック目では、それまでに定義した全てのマクロが参照できることが確認できます。

エラーになる例:

@0 cgeg
$T1=@5 v10;
$T1 egcgc;

上記では、MML定義が始まってからマクロ定義をしようとしており、エラーになります。

これは、MML記述が始まった時点で、そのトラックでは「$」文字がマクロ定義開始ではなく、マクロ参照開始と認識されるからです。

MML記述が始まると、セミコロンもマクロ内容終端ではなく、MMLトラック終端として認識されます。

引数つきマクロ定義

引数つきマクロの定義方法:

$名前{ %引数1,%引数2,... }=内容;

以上のように、マクロ名につづけて中カッコを書き、その中に「%」で始まる引数名を書いて、「=」後に内容を書くと、引数つきマクロが定義できます。

引数名の書式は、マクロ名と同じです。そして、内容の定義内で、引数を使いたいところ(引数参照)では、「%引数名」と書くことで引数が参照できます。

引数つきマクロの参照方法:

$名前{ %引数1,%引数2,... }

以上のように、マクロ名につづけて中カッコを書き、その中に引数を書くことで、引数つきマクロが参照できます。

【引数つきマクロの定義と参照の例】

トラック先頭の状態で、次のように書いた場合、

$m{ %note }=v13 %note16 v8 %note16 r8;
$m{c} $m{d} $m{e} $m{f} $m{g};

上記のトラック定義は、次の内容と同じこととなります。

v13 c16 v8 c16 r8 v13 d16 v8 d16 r8 v13 e16 v8 e16 r8 v13 f16 v8 f16 r8

このように、同じマクロを %note の部分を変更しながら使い回すことができます。

引数は、複数指定することもできます。

$m{ %vol,%note }=v%vol %note;
$m{13,cde} $m{10,efg};

上記のトラック定義は、次の内容と同じこととなります。

v13 cde v10 efg;