相変わらずなかなかMMLコンパイラの作業に時間が割けなかったのだけど、今日なんとか時間をとって、かなりいい感じに先に進むことが出来た。マクロの展開で悩んでいた箇所があったのだけど(発音コマンドの引数をc,c-,c=,c+からb,b,b=,b+まで全部書いていられないが、省略したら引数参照がマクロ展開時に解決出来ないという問題)、文字列レベルでのエイリアスを別途プリプロセスすることによって解決させることにした。やっつけではあるけど、これとマクロの都合のいい方を使う文法にすれば、無理なくいろいろ書けるのではないかと思う。
ともあれ、これで発音コマンドやプリミティブなMIDIメッセージの作成は実現できたと思う。あとは正常系の機能追加としては、メタイベントやSysExイベントのサポート、ループの展開、和音の処理方法の検討、そして動的パラメータのサポートが課題になるだろう。
異常系の対応は少々難しい。数値の範囲チェックなどを行うには「正しい値の範囲」が必要だけど、かなりメタな文法になっているので、変数値に制限をもうけるなどしない限り無理だ。そしてそのために新しく文法要素を追加するのが面倒だ。とはいえ、MMLの難しいところは異常値を簡単に導入出来てしまって、そのデバッグが難しいというところにあるので、これはなるべく対応したい。
ちなみに今回のMML文法には、現在のステップ数をassertするというデバッグ用命令が含まれている。トラックごとにステップ数が合わないというのは、MMLを書いていると非常によくあることなので、これで改善しようというわけだ。assertionは、実際にはステップに限定することはなく、ループ中のオクターブなど、いろいろなハマりどころで使えるのではないかと思っている。
動的パラメータは、mucで言えばアクティブ系引数だけど、もう少しソフトウェアLFO的な実装にした方が、実装も利用も簡単になるのではないかと思っている。アクティブ系引数は反復的なものではないし。ちなみに、サイン波のようなものを導入する支障にならないよう、数値計算はdoubleで行うようにしている。多少面倒だったけど。
mldspに比べるとかなり難産だったけど、とりあえずひとつのブレイクスルーを迎えることが出来たので、今日は枕を高くして寝られそうだ。
Leave a comment