今日はMMLコンパイラに細々とした修正を大量に加えて、仕様もいろいろ書き直した。必ずしも現状を表しきれていない部分はあるけど、概ねMML仕様ドキュメント通りのことは出来るようになったのではないかと思う。
今日はシステムエクスクルーシブまわりもいろいろ修正を加えて動作するようにした。と言っても特別な命令を追加することなく実装できた。GSチェックサム計算などは特別な命令が必要になるかと思っていたけど、'%' を剰余演算子として使うことにしたので、単純に計算式で解決できた。'%' はステップ値で音長を指定する時に使うので、競合すると思っていたのだけど、実際にはループ脱出命令の '/' と同じで、数値の後に続く場合は演算子として解釈が可能だった。
そして、剰余演算子を定義したことで、これを実現するために無理矢理関数の代わりを定義していた部分を全てとっぱらって式に置き換えることができた。これで問題になっていた部分を多くクリアできたと思う(テンポ指定やピッチベンドは複数バイトにまたがる命令だったので剰余が使われている)。そもそもこの辺は未実装のままだった。
SysExの実装にともなって、GSエクスクルーシブ命令を大量に定義したマクロを追加したので、GS音源を叩くための基盤は出来たと思う。ここから先はユーザマクロで書いてもらってもいいレベルだろう。
もうひとつ文法に加えた小さくない変更は、グローバル変数の削除だ。これはもともとゲートタイムの分母や、テンポなどトラック独立の変数を定義・参照するために存在していたのだけど、テンポ自体は相対値以外では変数参照なく指定できるし、複数トラックの間で特に相対値が期待通りに解決される可能性は高くない(グローバル変数といえど、トラックごとにMML展開中に解決されるものなので、結局ローカルで定義しているのと変わらない)。それならば、最初からローカル変数として全てを解決するのが妥当だろう。
ちなみに全音符のステップ数を定義している部分だけ、今まだ解決できていない問題が多少ある(音長型を数値型に変換する場合など)。グローバル変数のサポートは、実装してから無かったことにしたので、もしやっぱり必要だということになれば、戻すのは簡単だ(グローバル変数への代入命令だけ、文法的に存在していなかったので、それを追加する必要はあるが)。
曲タイトル等のディレクティブも実装したので、これで基本的な利用には耐えると思われる。今日はこんな時間になってしまったので、サンプルを書くのは次回ということになりそうだけど。
Leave a comment