マクロを定義してみる


  1. マクロ概要
  2. 大文字マクロと小文字マクロ
  3. なぜ小文字マクロを作ったのか?(ドラムトラックの例)
  4. マクロに引数を指定する
  5. 動的に選択する

ここからは、さらに"kfm"の突っ込んだ機能について、説明していこうと思います。

・マクロ概要

"kfm"の主な機能の1つに、マクロ機能があります。マクロとは、良く使うフレーズや宣言などを、登録しておいて、後からそれを簡単に使えるようにする機能です。

例えば、"cdefgfed cdefgfed cdefgfed cegec1"と、いうフレーズが、1曲の中に何度も登場するとき、なんども、"cdef..."と書くのは、面倒ですし、あとから、そのフレーズ自体をちょっと変えたいといった時に、1つずつ変えるのも、かったるいものです。

そこで、このフレーズをマクロとして登録しておいて、そのフレーズの出現場所に、そのマクロ名を書けば、良いのです。

基本的な書式:_m( name,"data..." )
マクロが複数行にわたる場合:
_m(name,"data...
         data...
         data...
         data...")

さっきの例で言えば、

_m(PHRASE,"cdefgfed cdefgfed cdefgfed cegec1")

_tr(0)CH=1 @0  l8o4q16 PHRASE
_tr(1)CH=2 @16 l8o5q16 PHRASE
 

こんなところです。もう、分かっていると思いますが、PHRASEというのが、マクロ名でありまして、"..."で、囲われた部分が、マクロのデータです。


・大文字マクロと小文字マクロ

ところで、マクロと1口に申しましても"kfm"では主に、小文字マクロ大文字マクロの2種類に分けられます。

・小文字マクロは、全て1文字であり、アルファベットの小文字(a~z)を使用します。

・大文字マクロは、複数文字からなり、アルファベットの大文字(A~Z)+数字(0~9)+記号( _ )( ` )で指定します。


ちなみにマクロは全トラック共通ですが、1文字マクロを使用するには、あらかじめ宣言(トラック中で "_smon"を書く)が必要です。

1文字マクロを使わない場合は、トラック中で"_smoff" を宣言してください。初期設定では、すべてのトラックで、小文字マクロを使わない "_smoff" の状態になっています。

(ちなみに、この"sm"は、Small Macroの頭文字をとったもので、間違っても、打たれるのが好きとか嫌いとか・・・そういう話とは関係ありません。^^;)

(大文字マクロ例)" _m(A1,"l8cdefg") A1 A1     " = " l8cdefg l8cdefg "
(小文字マクロ例)" _m(s,"o7c") _smon  l8ssss " = " l8o7co7co7co7c " 

大文字マクロの後には、必ず、区切り" "、"|"を入れてください。小文字マクロには、区切りを入れなくても、連続して記述できます。

・なぜ小文字マクロを作ったのか?(ドラムトラックの例)

マクロになぜ2種類のタイプを作ったのかといいますと、それは、ドラムトラックを記述するのに便利だからです。

そうすると、まず、MIDI音源のドラムトラックについての知識が必要になります。

GMGS規格の音源では、10チャンネル目が、ドラム専用チャンネルであると定義されています。それに対して、XG規格の音源では、どのチャンネルをもドラムチャンネルに指定できるようです。

(普通、Windowsに入っている音源は、GM規格の音源です。GSというのは、ローランドが提唱している規格、XGはヤマハが提唱しているMIDIの規格です。インターネットでMIDIファイルを配布する場合、これらの規格に注意する必要があります。GS,XG共にGM互換モードがついていますので、ここでは、GM規格について話を進めます。)

そのため、ドラムセットを使おうと思ったら、そのトラックで、10番チャンネルを使う事を宣言( CH=10 )しなくてはなりません。

また、ドラムチャンネルは、他のチャンネルと少し構造が変わっていて、"o1a"(="n33")にバスドラムの音色、"o2d"(="n38")にスネアの音色というように、各ノート(音程)ごとに、違うドラムの音が割り当てられています。

(試しに、キーボード付きの音源を持っている人は、キーボードの音色を、ドラムセットにして、適当にキーを押してみてください。各キーボードのキーごとに、違うドラムの音が割り当てられているはずです。)

ドラムセットをMMLで表記する時、いちいち、"l8 o1a a o2d o1a a a o2a o1a"などとやっていては、面倒ですので、普通、ドラムセットの各音をマクロに定義して使います。

そこで、小文字マクロの出番なのです。

大文字マクロは、複数文字であるがため、例えば、Aというマクロがあったとしても、AAと区切りなしには、つなげて書けないのです。"kfm"は、このAAを、Aというマクロが2回とは、認識せずに、AAというマクロ1つとして認識してしまうからです。

その点、小文字マクロは、必ず1文字であるので、"ddd"と書けば、"d"というマクロが3つ、"dddddddddddddddddddd"と書けば、"d"というマクロが、20個と認識するわけです。

なぜつなげて書きたいかと言えば、ドラムセットは、セットというくらいなので、一度に2つ以上の音が鳴っている事が多いからです。

その時に、1トラックで複数音発音させるのは、表記が複雑で見づらくなりやすいので、複数トラックに分けて書きます。

RESET_GM;<=XG音源の人はこれがないとピアノの音になってしまう。

;---------------------------------------
;ドラム用小文字マクロ宣言
;---------------------------------------

_m(b,"n36,") {kick = bass drum}
_m(s,"n38,") {snare}
_m(h,"n42,") {hi-hat close}
_m(o,"n46,") {hi-hat open }

;---------------------------------------
;チャンネルを10番ドラムチャンネルに設定
_tr(0-2) r4 CH=10 @0 l16 v100 _smon
;---------------------------------------
;実際の演奏
;---------------------------------------

t100
_tr(0)[4 brrr srrb rbrr srrr ]
_tr(1)[4 hhhh hohh rhoh hhoh ]

;---------------------------------------

マクロ定義の中で、"n"というコマンドが出てきますが、"n"というのは、ノート番号の直接指定という機能を持っています。

MIDI音源の説明書などに、ドラムセットのノート番号と、その音の名前が記されていると思います。その番号を、nの後ろに記せば、そのドラムセットの音を発音するというわけです。


・マクロに引数を指定する

マクロ機能で忘れてならないものの一つに、引数の取り込みがあります。

 マクロ定義の時に、引数を与えたい部分に、" ? " を書きます。また、複数の引数を与える場合、" ?2 "、" ?3 "と、?のすぐ後ろに引数の番号を書いてください。例えば、

_m("TEST","[? cdef]")

と、宣言し、トラック中で、

TEST(4)

と書くと、実際には、"[4 cdef]"と書かれたのと同じ事になり、"cdef"を4回演奏します。

次に、複数の引数を与える例です。

_m("TEST","l8 n?1 n?2 n?3 n?4")
TEST(50,52,54,55)

これは、一番目の引数50が、?1に入り、2番目の引数52が、?2に入り、3番目の引数54が?3に入り、・・・実際、以下のように書いたのと同じ意味になります。

l8 n50 n52 n54 n55

 ところで、マクロに引数を与えるとき=を使って、引数を指定する事が可能です。
上の例で言えば、

_m("TEST","l8 n?1 n?2 n?3 n?4")
TEST=50,52,54,55

です。しかし、=を使って引数を指定できるのは、数値型の引数の場合です。以下の例では、エラーが表示されます。

_m(TEST,"l8 ?1 ?2 ?3 ?4")

TEST(c,d,e,f);<= OK
TEST=c,d,e,f ;<= Error!

ところで、"kfm"のコマンドでも大文字のものは、あらかじめ、初期マクロとして定義されているものなので、チャンネル設定コマンド"CH"は、"="でも、"("...")"でも、どちらでも引数を与える事が出来たのです。


・動的に選択する

ver0.903から、動的にマクロを選択するコマンド"SEL"が装備されました。
これは、条件によって、いくつかの候補のマクロの中から一つを選ぶ事が出来るというものです。

書式:SEL([選択肢番号],マクロ1[ ,マクロ2][ ,マクロ3] ...)
選択肢番号で指定されたマクロを書き込みます。選択肢を省略すると、ランダムにマクロを選択します。

例)
    _m(A1,"cdef")
    _m(A2,"efga")
    _m(A3,"gab>c<")

    SEL(1,A1,A2,A3)    ;A1を選択(1)
    SEL(,A1,A2,A3)     ;ランダムに選択(2)

上の例で分っていただけたでしょうか?

A1,A2,A3のマクロを定義したあと、(1)では、A1がマクロ候補の中から選ばれます。(2)では、選択肢を省略しているので、この場合、候補中のA1、A2、A3のどれが選ばれるのか、コンパイラがランダムに決定するので、作者にも答えは分りません。さっそく、コピーして、どれが選ばれるのか聞いてみましょう。

また、(2)の時は、コンパイルをするたびに違うマクロが選ばれます。

"SEL"は、C言語の"SWITCH"みたいなものでして、ver1.000からは、SWITCHでも同じ働きをするようになっています。また、"IF"での条件分岐もできますので、ヘルプ見てください。


次のページへ / 目次へ