今週は無駄にchatpadで遊んだりなどしていたこともあって、あまりMMLコンパイラに時間をかけることができなかったのだけど、2つばかり重要な実装を追加した。
ひとつはトラック別マクロ定義で、これがあると特定のトラックに特化したマクロ命令を定義することが出来る。一番典型的な用途はリズムトラックでの使用だ。リズムトラックを記述する際に、ドレミ(cdefgab)で記述する人はまずいない。むしろ b をバスドラム、s をスネアドラム...といった風に記述したいだろう。また、ギターコードの記述の意味をトラック毎に変えたいという人もいるかもしれない。マクロ定義の適用が全トラック共通だと、こういうことができない。
これを解決するにあたっては、特に最後に定義されたマクロを適用するように、マクロの解決ロジックを多少変更する必要があった。といっても、この実装で難しかったことはほとんど何もない。
もうひとつはスペクトラムと呼んでいる、時系列に応じて動的に適用されるマクロの実装だ。これは特にピッチベンドやパンポットを緩やかに変化させたい(けどいちいち P32 r48 P36 r48 P40 r48 P44 ...などと書いていられない)という場面で利用するものだ。
しっかりした命令体系をサポートするには、コンパイラレベルでいろいろ対応してやらなければならないのだけど、とりあえずマクロレベルで対応できるように、コンパイラに「マクロを適用する」命令を追加した。これで「4ステップ待機して、値を+4させる命令を適用して...を変化値が64になるまで繰り返して、今度は減算して...」といった動的な変化が実装できるようになった。
ただ、これを実装していてひとつ気付いたのだけど、このスペクトラムを実現するためには、相対的な値の変化を実装できるようにしなければならない。実はこれが出来ていない。とりあえずマクロ定義で P, P+, P- を個別に定義することにして、proof of conceptとしては利用できるようになった。というわけでパンポット以外ではまだ利用できない。
相対的な価の変化が実現できていないというのは、ひとつには引数に相対値指定という概念が存在しないということだ。別の視点で言えば、マクロはあくまで命令リストであって変数ではないので、マクロで指定された引数がそのまま相対値として指定できることにはならない。パンポット命令は単純に引数値をパラメータとするコモンコントロール命令を発行するのみで、現在のパンポット値はどこにも保存されないというわけだ。上記のP+, P-といった命令を実装するにあたって、変数を追加することで、これは保存されることになったのだけど、P以外の命令についてはなお同じことが言える。
この辺りはもう少し柔軟にいろいろ実現できるように、ただし文法が破綻しなくなる程度に、整理しなければならないだろう。
現行方式でのスペクトラムは、割と単純な動的変化しか実現できないので、いずれ本格的なソフトウェアLFOに近いものを実装したいとも思っている。といっても、サイン波などを除けば、MUC MMLの特長だったアクティブ系引数に匹敵する柔軟性は実現できていると思うので、優先度はそれほど高くないかもしれない。ソフトウェアLFOが実装できると、テクノ系の作曲の幅が広がるので、いずれきちんと実装したいとは思っているけど。
Leave a comment