7.4.6. マクロ機能について


[表紙に戻る] [<<<<<] [>>>>>] [ひとつ上へ]


SMCには強力なマクロ機能があります。主にマクロ命令という形で、MIDIメッセージを生成するための種々の計算(チャンネル取得やアドレス算出、チェックサム計算など)をユーザが意識せずにコマンドを用いるために利用されます。このような利用方法は、SMCに付属するインクルードファイルの中身を見ていただければ大体わかると思います。このマクロ機能を、単純にテキスト置換機構としてとらえると、サブシーケンスデータの登録という利用方法が見えてきます(そんなに大袈裟なものではありませんが)。

まずは、最もシンプルな利用例を見てみましょう。

#define kick01:crrc rrcr rcrr rrcr

これはバスドラムのパターンを記述したものです。“${kick01:}”で呼び出すことができます。ただし、マクロ内では音長値やゲートが省略されているので、マクロを呼び出す際の省略時の値が重要になってきます。

次に少し工夫した例を見てみましょう。

#define hihat01:f+?1]]]f+[f+]f+[f+rf+[f+ [f+r]]f+f+[f+rf+r[

これはハイハットのパターンを記述したものです。“?1”はマクロ呼び出し時に与えられた第1引数で置換されます。このマクロをどのように利用するかといいますと、もし“o2 l16 u070”が設定されていれば以下のようになります。

${hihat01:16}”(最初の音は“f+16”になる)
${hihat01:0&<e($$-20)>}”(最初の音は“f+0&<e($$-20)>”になる)

つまり、前者はクローズハイハットしか鳴りませんが、後者はクローズハイハットとチャイニーズシンバル(しかもONベロシティを20落として)が同時に鳴ります。“l16”が指定してあるのにもかかわらず、前者で“16”をパラメータとしているのには理由があります。マクロ内部で引数を参照している場合には、マクロ呼び出しの際に引数を省略できないのです。ですから、前者の場合には引数として与えても何の副作用もない音長値を指定することにしたのです。

次は、音型が同じで構成音が変化する時の記述です。

#define bass01:?1 8r16?1 8r16?1 8.?1 8r16?1 16r16?1 16r16

これはベースのパターンを記述したものです。例えば次のように呼び出します。

${bass01:e} ${bass01:c} > ${bass01:a} ${bass01:f+} <

?1”などの引数番号の直後に数値を記述したい場合は、間に空白を挿入しておきます。

このマクロでは、音長値が全て明示的に指定されているので、“l”コマンドの値によらずマクロを呼び出すことができます。しかし、次のような呼び出しはエラーとなります。

${bass01:e0&<e>}

これは、元々のベースラインに1オクターブ上を重ねようというものです。しかしながら、これが展開されると、“e0&<e> 8”のようにノートと音長値の間に余分な記号“>”が入ってしまうことになり、エラーとなるのです。もし、そのような効果を得たい場合は、次のようにします。

${bass01:<e0&>e}
< ${bass01:>e0&<e}

前者は1オクターブ上のノートを先に記述し、後者は全体を1オクターブ上げて先にオクターブ下のノート(つまり元々のライン)を先に記述しています。両者で異なるのは、同タイミングにおける1オクターブ隔てた2つのノートのうちどちらが先に出力されるのか、というだけです。

このように、引数置換に関してはある程度の注意が必要です。


[表紙に戻る] [<<<<<] [>>>>>] [ひとつ上へ]