MMLは汎用的に考えすぎて案の定破綻している。マクロに引数がついたり(引数の展開ができるが、どこまでが引数なのか把握しなければならない)、ただのテキストエイリアスだったりして、明らかに自分で整理がついていない。
一方で、何で破綻しているのか気づくと、一歩先に進めたような気がしてくる。とりあえず、しっかりした言語を作るわけではないんだ、ということを意識しておけば大丈夫、かもしれない。
既存のMML言語について、ちょっと整理した方がいいような気がしてきたので、ちょっと書いてみようと思う。
(1) 命令セットの中で書かせ、マクロがテキスト置換を主目的とする手法 これは、マクロ=プリプロセッサと思ってよい。命令セットは決めうちで、どうしても必要な場合はレジスタ直接操作コマンドやバイナリ出力コマンドを使う。
(2) マクロがしっかりした構造をもつアプローチ これは、トラックやマクロを_track(1) { ... }みたいにカッチリ定義するアプローチで、プログラマブルなマクロ展開も可能だが、作成が面倒になる。
lightweight syntaxとstrict syntaxの違いにも見えるな。
mml2midなどは典型的な(1)である。僕が使っていたのはアクティブ系引数が便利だったmucだが、これも(1)の分類になるだろう。mml2midもバージョン5でLFO的な動的パラメータを取り入れたようだが、ちょっと遅かった。
一方、実は(2)の分類に当てはまるのがテキスト音楽サクラだ。これは拡張モジュールのような形でユーザがマクロ命令を作成することができるようになっているようだ。一方でストトン表記のようなイージーな表記も出来てしまうのだから、ある意味最強。サクラはGoogle Code上でOSSとして公開されているし、実にすばらしい。使ったことは無いけど、ゲーム業界の著名な(?)作編曲者が掲示板に顔を出していたりして、へえと思った。
MIDIコンパイラにおいては、LFOのような動的パラメータが文法上サポートされているかどうかが重要だ。大抵はシンプルな波形でモジュレーションやピッチベンドだけ操作できればいいかもしれないが、もっといろいろいじれる方が楽しいに決まっているし、音源によってはNRPNやエクスクルーシブを動的にいじりたいかもしれない。mucではアクティブ系引数があったものの、そのターゲットは限られていた。mml2midもそうだ。サクラがどの程度LFO的なものをサポートしているかは不明だが、カスタムマクロである程度カバーできるのかもしれない。いずれにしろ、任意のレジスタを操作できるような動的パラメータをサポートしたいという思いはある。
これを実現する論理的な方法は簡単だ。波形を定義して、定点ごとに指定したアクションを実行する命令を用意すれば良い。ただし、そのためには、アクションを引数として渡せる必要がある。関数オブジェクトのようなものだ。実際には「マクロそのもの」を渡すということになるだろう。
また、カスタム アクションでピッチベンドやNRPNやエクスクルーシブを操作できるようにするためには、特定点での値を取得できる必要もあるし(波形とデルタタイム、ステップカウントから、現在のデルタ値を計算する)、相対値指定を可能にするのであれば、仮想的なレジスタに入っている値をマクロ定義する時点で取得できなければならない。つまり、これらの値はプログラマブルに操作できる必要がある。カスタム エクスクルーシブの値を保存するのはおよそどんなMML実装でもユーザの責務になるだろうけど、ピッチベンドなどもユーザに開放する仕組みにするというのは、どこまで実現可能か分からない。mml2midやmucでは、これらの命令はコンパイラが内部的に処理するa prioriなものだった。
自分で作ろうとしているものが、どこまでこの辺の壁を打ち破れるものかは分からない。でも、せっかく作るんなら、面白いものを作りたいなと思うのだった。
Leave a comment