MMLの欠点の一つに、後から見直して、どこに何が書いてあるか分かり難い、いったいどういう曲構成になっているのか、という俯瞰性の悪さがあげられます。
そこで、"kfm"では、できるだけMMLを見やすく管理するための工夫をしました。
・1つは、ベロシティー(v),ゲートレイト(q),発音タイミングの先行指定コマンド。
・もう1つは、演奏を時系列に見る事が出来るようにするTR,TRLコマンドです。
これら、TRとTRLは、各トラックを横一列に並べて書けるというコマンドです。
TR|TRL("track0","track1","track2","track3","track4","track5","track6", ... ) |
一番左端から、0番トラック、1番トラック、2番トラック・・・に書き込むということになっています。 "TR"と"TRL"の違いは、MML最後にトラックを同期するかどうかです。 "TR"は、トラックを同期しません。 |
この例だと、見づらいのであまり意味がありませんが、例です。
TR("","cdefgagfe","efgab>c<bag","gab>cdedc<b","","ccccccccc") TRL("o4c1","o5e1","o6g1") |
トラックの書き込みに、マクロを使うと、曲の全体が奇麗に見渡せるようになります。マクロは、メモリの許す限りいくらでも定義できるので、有効に利用してください。
_m(A1,"@0l8o4cdefgfed") _m(B1,"@0l8o4efgabagf") _m(A2,"eeeeffff") _m(B2,"ggggaaaa") TRL("",A1,"",B1,A1) TRL("",A2,"",B1,A2) |
"kfm"は、MMLソースを、はじめの方から順々に読んでいくのですが、その時、各トラックについて、タイムポインターに沿って、イベントを書き込んでいるのです。
基本的に、タイムポインターを進めるのは、ノートオン(c,d,e,f,g,a,b,n)と、休符の時だけです。その他の、REV、M、B・・・というものについては、当然ですがタイムポインターを進めません。
そのタイムポインターを強制的に移動させるのが、"PTR"コマンドです。前回変数の項で触れませんでしたが、変数に" ~n=ptr "という形で、トラックのタイムポインターを、変数に代入します。
@27 ~1=ptr l1o5q16 cd PTR=~1 ef PTR=~1 ga PTR=~1 b>c< |
解説をしますと、変数1に現在のタイムポインターを代入します。全音符で"cd"を発音します。再びタイムポインタを変数1の位置(一番始めの時)に戻します。全音符で"ef"と発音します。再びポインタを戻し、"ga"と、発音後、再度ポインタを戻して、"b>c<"と発音するのです。
LAST_PTRは、すべてのトラックのタイムポインタを、その一番大きな数字に同期してしまうコマンドです。MMLでは、トラック毎の同期が面倒だと常々実感していまして、この機能をつけました。
TR("l4ccc","l4eee","l4ggg
gag") TR("e4","g4",">c4<"){タイムポインタがずれている} r1 LAST_PTR |
そして、この"TR"と"LAST_PTR"の機能を足したのが"TRL"なのです。
TRL("l4ccc","l4eee","l4ggg
gag") TRL("e4","g4",">c4") |
・最後に
古くから、MMLをご存知の方は、もう気付かれていると思いますが、この"TRL"、昔のBASICで言うところの「PLAY」文です。マクロが、BASICの文字列変数(しかも$のついたやつ!)・・・そう考えたら、やはり、"kfm"もまだまだ、以前の環境を再現したに過ぎないのかも。
より良いMML表記方法の追求と、独自の音楽製作環境の再現のため、皆さんのご意見をどんどん取り入れて、"kfm"は、どんどん進化していきたいと思っています。ぜひ、ご意見、ご感想を、 mine@uninet.com.cn クジラ飛行机まで、お送りください!