Adus Compiler 更新履歴
Version 0.20 [2008/05/05版]
- r コマンドと p コマンドのゲートタイムも r4/8 のようにスラッシュで
指定するようになった。
- n コマンドの対象指定にノート番号で指定できるようになった。
例えば o4 nc,50 の代わりに n60,50 と書くことができる。
- コマンド・リファレンスを整備した。
Version 0.19 [2008/04/22版]
- cdefgab のゲートタイム指定方法を変更し c2/8 のようにスラッシュで
追加するようになった。c2/8 は c8 r4. と同じ意味である。
なお & と併用した場合はゲートタイム指定は無効となる。
またこの変更に伴いベロシティ指定等のコンマ位置が繰り上がり、
ベロシティは c2/8,120 のように指定する。
ゲートタイムの指定が不要な場合は単に c2,120 とすることができる。
続けて c2,120,*1 のように発音開始位置の指定が可能である。
- SUDA.LIB Version 0.11
- DMDScript Version 1.14
- DMD Version 1.028
Version 0.18 [2006/08/20版]
- bug fix: E 系コマンドで E^10 のような表記が可能なように修正。
- bug fix: EL などの L 系線形補間の動作が誤っていたので修正した。
- DMDScript Version 1.11
- DMD Version 0.163
Version 0.17 [2006/07/18版]
- コマンド ! はそのトラックの以降全ての命令を無視する。
例えば cd: ! とすると c と d トラックが演奏を停止する。
また !a: ! とすると a トラックのみを演奏するようにできる。
- \rpn で RPN を設定する。
\rpn{1,2,3,4} は C101,1 C100,2 C6,3 C38,4 と同等。
- \nrpn で NRPN を設定する。
\nrpn{1,2,3,4} は C99,1 C98,2 C6,3 C38,4 と同等。
- \bend でピッチ・ベンド・センシビリティを設定する。
B-60 から B60 までのベンド・レンジを半音単位で指定。
例えば \bend{2} としておいて B-60 とすると半音下がり、B60 とすると半音上がる
(詳細は音源依存)。なお \bend{2} は \rpn{0,0,2} と同じ意味になる。
- \sysex の引数に文字を指定可能(暫定機能)。
例えば \sysex{'a'} は \sysex{0x61} と同じ。
- 0b で始まる二進数表記を廃止。a0b で和音表記できなかったので……。
- トラック名のアルファベット順にコンパイルするようにした。
- コンパイル時のステップ数表示を、
物理的なデータ長から論理的な音符位置に変更した。
- bug fix: \sysex のチェック・サム計算が誤っていたのを修正。
Version 0.16 [2006/07/04版]
- スクリプト(マクロ)機能を実装。
- スクリプトは DMDScript を内蔵しており、
これは ECMAScript、即ち JavaScript と互換性がある。
- \[ から \] の間にスクリプトを直接記入する。例えば \[ var r = 3; \] のように。
\[ と \] の間に改行を含めることもできる。
- 関数 r() が MML へのインターフェース。
r() のパラメータを文字列として MML に書き出す。
\[ r(3) \] は MML 中に単に 3 と書くのと同じ結果。
\[ r("v10"); \] は v10 と同じ。
- スクリプトは in-track に有効であり、
トラックごとに変数などの値が保持される。
トラックをまたいでの値交換はできない。
- スクリプトの実行結果にスクリプトを含めることはできない。
\[ r("\[ r=3 \]"); \] はエラーになる。
- $...$ は \[ r(...); \] と同義。ただし $ と $ の間に改行は入れられない。
\[ var r=3; \] としておいて $r$ とすると 3 が挿入される。
いわゆるシンタックスシュガー。
- 現時点ではサブトラックを結果に含めることができない。
例えば \[ r("{c4 d4 e4}"); \] のような書法には未対応。
- 同様に [] 反復を結果に含めることができない。
- bug fix: コメント /* から */ の間に改行があると無限ループしていたのを修正。
複数行コメントが書けなかったって……間抜けな。
- コンパイルしやすいように SUDA.LIB と DMDScript を同梱するようにした。
- DMDScript Version 1.10
- DMD Version 0.160
Version 0.15 [2006/05/30版]
- V コマンドの正式版。V100 でボリュームを 100 にする。
- V100,<4>50,<4>100 のように先行指定が可能。
- 音長を省略して V100,50,100 とした場合は l コマンドの値になる。
ただし先頭のみ V<0>?? の意味になる。
- V100,,50 は V100,100,50 或いは V100,^0,50 と同じ意味。
- V<4>100,<4>50~ のように末尾に ~ を付けると、
指定終端に達した時点で最初の指定に巻き戻す。
ただし最初の指定に音長を指定しておくべき。
- VL100,50,100 のように L を付けると各パラメータが線形補間される。
~ にも対応している。
- Vc、VC 又は単に V で先行指定を解除する。
既に尽きている場合は無視される。V^0 でも同等。
- FV コマンドでノート・オンごとのエンベローブ変化を生む。
例えば FV100,<8>50 とすると八分音符経過するとボリュームを半分にする。
各数値は V コマンドの指定数値からの百分率(100 以上も可能)で表す。FVL で線形補間。
解除するには FVc 又は FVC と書くか、単に FV と書く。
ただし FV^0 は必ずしも同じではなく、
変化途中ならばその数値を保持したままで変化を停止させる。
- E コマンドでエクスプレッションを指定する。
使用方法は V コマンドに準じ、FE コマンドも使用可能。
- M コマンドでモジュレーションを指定する。
使用方法は V コマンドに準じ、FM コマンドも使用可能。
- P コマンドでパンポットを指定する。P64 が中央、P0 が左端、P127 が右端になる。
これも V コマンドに準じた先行指定、線形補間が可能。
- FP コマンドでノート・オンごとのエンベローブ変化を表すが、
各数値は百分率ではなく単純に加減算される。
- B コマンドでピッチ・ベンドを指定する。
B0 が原音どおり、
B60 が最大に音を上げ(MIDIデータでは8191)、
B60 が最大に音を下げる(MIDIデータでは-8192)。
標準の状態であれば B60 で半音上げることになる。
V コマンドに準じた先行指定、線形補間が可能。
- FB コマンドでノート・オンごとのエンベローブ変化を表すが、
各数値は百分率ではなく単純に加減算される。
- w コマンドを FV 系と同等の処理に仕様変更した。w100 が w<0>100 と
同じ意味になったので注意すること。wl コマンドでも ~ に対応した。
- 主にデバッグ目的でコンパイル時間をミリ秒単位で計測するようにした。
ただし 10 ミリ秒未満の場合は表示しない。
- bug fix: サブトラック内でエラー位置情報が消失していたのを修正。
- SUDA.LIB Version 0.10
Version 0.14 [2006/05/07版]
- w コマンドのポリフォニック・キー・プレシャーの設定において、
ベロシティ比の基準値を 127 から 100 に変更した。
つまり 100 を指定するとベロシティ比 100/100 で元と同じベロシティ、
50 とすると 50/100 で半分、
200 とすると 200/100 で倍のベロシティとなる。
- ソース・プログラムの文字コードを UTF-8 に変更した。
- DMD Version 0.155
Version 0.13 [2006/04/03版]
- \sysex コマンドでシステム・エクスクルーシブ・メッセージを送信する。
例えば \sysex{0x7e, 0x7f, 0x09, 0x01} で GM System On を送信する。
先頭の 0xf0 と終端の 0xf7 は必要ない。
- Roland 式チェック・サムの自動計算が可能で、計算の範囲を ( と ) で囲むと、
閉じ括弧 ) の後ろにチェック・サム値が挿入される。
- DMD Version 0.150
Version 0.12 [2006/02/01版]
- C コマンドでコントロール・チェンジを送信する。
例えば C7,100 とするとボリュームを 100 にする。
ただしボリュームの変更は V コマンドを使うべきで、
このように他のコマンドで利用可能なコントローラならばそちらを優先するべき
(C コマンドでの変更はコンパイラが把握できない)。
- \bank コマンドでバンク・チェンジ。
\bank{87,69} とすると MSB:87, LSB:69 でバンク・チェンジする。
これは C0,87 C32,69 と同等。\bank{13} は \bank{13,0} の略記。
- \program_shift コマンドで \program における番号指定を加減する。
例えば \program_shift{1} としてから \program{10} とすると、
実際には 11 が送信される。
\program_shift{-1} ならば \program の指定が 1 以上 128 以下となり、
伝統的な指定方法と同一になる。
\program_shift{0} で解除されるが単に \program_shift{} と書いても良い。
- \swap{<>} コマンドで < と > の機能を入れ替える。
つまり > でオクターブを上げるという伝統的な方法になる。
トグル・スイッチなので再度指定すると元に戻る。
- \swap{<>} の指定の有無が分からない場面で
可搬性の高いコードを記述したい時は、< の代わりに o^1 で代用する
(勿論 o^1 と < は全く同じ動作ではなく、o^1 は先行指定の解除を伴う)。
- \swap{()} コマンドで ( と ) の機能を入れ替える。
ただし標準値の指定は常に (=20 のふりあいにし、)=20 とはならない。
- 一般に \ 系コマンドはトラックに対する指定。
つまり大文字系のコマンドと同じ。
- \ 系コマンドはトラックごとの指定なので、
全トラックに適用するには *: \swap{<>} などとする。
- \ 系コマンドはサブトラック独立ではないので、
サブトラック内での指定が外に影響する。
Version 0.11 [2006/01/30版]
- チャンネル指定を C コマンドから \channel に変更。
C1 の代わりに \channel{1} と指定する。
この { と } の間はサブトラックでは無いので注意。
なおバックスラッシュは日本語環境の場合、
円記号(¥)と表示される場合もあるが、
用語としてはバックスラッシュで統一する。
- \program コマンドでプログラム・チェンジ。
例えばGM音源の場合、\program{0} でピアノになる。
プログラム・ナンバーは 0 以上 127 以下の数で指定する
(1 以上 128 以下ではないので注意。
この二つの流儀のどっちが正当か、誰か教えて下され)。
- DMD Version 0.145
Version 0.10 [2006/01/04版]
- w コマンドでポリフォニック・キー・プレシャーの設定を行う。
例えば w<4>80,<8>50 c1 とすると c を発音してから四分音符経過すると、
ベロシティ比 80/127 でキー・プレシャーを送信し、
更に八分音符経過するとベロシティ比 50/127 で送信する。
- ベロシティ比とは、v コマンドなどによって音符で指定されたベロシティを 127
とした相対値である。w64 c,,120 の場合は 120*(64/127) が実ベロシティになる。
0 が指定された時は常に実ベロシティ 1 になる。
- ^ や _ によるベロシティ比の相対指定も可。
直前の指定からの相対指定になる。w<8>_10 のように先頭の時は 127 からの相対値、
つまり w<8>117 と同じ意味になる。
- <>による音長指定がない場合は、l コマンドによる指定が適用される。
- w<0>64 のように最初の音長を 0 にすることも可能。
- 末尾に ~ を付加すると指定終端に達すると最初に巻き戻す。
- w コマンドは一旦指定すると、以後の全ての音符に有効。
一音符のみに効かせるには { l8 w40,30 c4. } のようにサブトラックに入れる。
- 解除するには wc と書くか、単に w のみを書く。
- wl コマンドは指定された離散数値を線形補間し、滑らかなベロシティ変化を生む。
ただし wl コマンドは ~ による巻き戻しに未対応。
- DMD Version 0.142
Version 0.9 [2005/11/13版]
- ノート・マトリックのコマンドを N から n に変更。
例えば nc,36 と定義する。即ちサブ・トラック内での変更が外側に影響を与えない。
Version 0.8 [2005/11/12版]
- 先行指定中の音長指定を () から <> に変更。
例えば v100,<2>50
- N コマンドでノート・マトリックを定義する。
ノート・マトリックを用いれば、指定したノート番号に応じて、
別のノート番号で発音するようにできる。
例えば Nc,36 とすると、(そのオクターブの)c に対する発音はノート番号36で行われる。
Nc で解除。
主としてドラム・キット向けの機能であるが応用範囲は広い。
- コンマに続けてベロシティ増減値を指定可能。Nc,36,10 とすると、k コマンド等での指定より
更に10加算されたベロシティで発音される。Nc,,-10 のように負数も可。
- 更にコンマに続けて発音開始位置の増減値を指定可能。Nc,36,,*2 とすると、s コマンドでの
指定より更に 2 ticks だけ発音が遅れる。
- いくつかの重大なバグをフィックス
- DMD Version 0.139
Version 0.7 [2005/11/04版]
- #track ディレクティブでトラック名を宣言。
全てのトラック名は使用に先立って宣言しなければならなくなった。
#track <a> で a を宣言、
#track <ab> で a と b の両方を宣言する。
- トラック名はアルファベット一文字に数字一文字が続く二文字で構成される。
例えば a3 や b0 など。大文字と小文字は区別されるので e0 と E0 は別々。
- アルファベット一文字のみのトラック名は 0 が省略されたとみなす。
例えば a は a0 の略記である。
- トラック指定は従来通りの a: や a1a3: に加えてワイルドカードが使用可能。
- * は宣言されている全てのトラックに対する指定。*:
- a? は a から始まる全てのトラックに対する指定。
例えば a0 と a1 が宣言されているならば a?: は a0a1: と同等。
- ! で始まるトラック指定は、それ以下を除く全てのトラックに対する指定を表す。
!a: は a 以外の全てのトラック対する指定を表す。例えば #track<abc> ならば、
!a: は bc:
と同等、!ab: は c: と同等である。!a?: のような指定も可能。
- C コマンドでチャンネル番号を指定。チャンネル番号は1以上16以下。
Version 0.6 [2005/10/27版]
- 任意の位置にコメントが書けるようになった。
// から行末、/* から */ の間がコメント。
- #timebase でタイムベースを指定。例えば #timebase 96
- #copyright は著作権情報を埋め込む。
©の文字、著作物発行年と、著作権所有者名が含まれなければならない。
例えば #copyright "(c)2005 Yoshinori SUDA"
- #title は曲名(シーケンス名)。例えば #title "Pastoral"
- このような # で始まる指定を総じて「ディレクティブ」と呼ぶことにする。
- DMD Version 0.137
Version 0.5 [2005/10/25版]
- サブトラック {} のネストを10回に制限。
- コンパイル時に各トラックの合計ステップ数を表示するようにした。
- エラー時の行位置表示が誤っていたのを訂正。
- SUDA.LIB Version 0.9
- DMD Version 0.136
Version 0.4 [2005/10/16版]
- サブトラック {} を追加。
サブトラック機能を用いて任意の位置に音符を挿入すれば、
複雑な複旋律の動きを容易に記述できる。
例えば {c1} e8g8<c8>g8 は c1 と e8g8<c8>g8 が同時に演奏される。
- サブトラックには親トラックの全てのパラメータが承継される。
ベロシティの先行指定などもそのまま引き継がれる。
- 小文字系の命令(v や l など)はサブトラックの内容が親トラックに
影響を及ぼさない。つまりサブトラックから抜けた時点で元の状態に戻される。
- サブトラックの後に音長を指定することができる。
{a1}4 は {a1} r4 と同じ効果がある。
音長の代わりに & を指定すると、サブトラックの長さを指定したのと同じになり、
{a4 b4}& は {a4 b4} r2 と同等である。
これは {} を外した a4 b4 と似ているが、
ベロシティの指定など小文字系の命令に関して差異がある。
- DMD Version 0.135
Version 0.3 [2005/09/06版]
- トラック指定を @ から : に変更。@a の代わりに a: と表記する。
- ループ [] 内のビーデ位置指定を : から ; に変更。
Version 0.2 [2005/08/31版]
- 小節線 | を追加。in-track において | は単純に読み飛ばされるので、
小節線として、或いは区切り記号として広く使用が可能。
他の命令よりも前段階で処理されるので、命令途中にも挿入が可能で、
例えば v50,30,|50,20 のように先行指定の途中に入れることもできる。
極端な例では v|s|5 は vs5 と同じ意味になる。
トラック名処理とは別スキームなので、@ab|c は @abc ではなく @ab c と同等。
つまりトラック名の指定で @a の後ろのスペースを入れるのが見苦しいならば、@a|
と表記すると良い。
- ループ記号 [] を追加。[ と ] の間を繰り返す。
反復回数は [ ]3 のように表記する。[ab]3 は ababab と展開される。
- 反復回数は正の整数で指定する。使用できるのは正の十進数のみ。
十六進数などは使用できないし、プラス符号でも使用できない。[]0 は不正。
- 反復回数が省略された場合は 2 を指定したのと同じ。[ab] は abab と展開。
- 小節線 | と同じスキームで処理されるので、命令途中でも使用可能。
v50[,30,40],20 は v50,30,40,30,40,20 となる。v50,[30,40,]20 とすると、
反復回数が20回になるので要注意。
小節線を用いて v50,[30,40,]|20 ならば v50,30,40,30,40,20 になる。
- [] 内に : があると、最後の繰り返しはその地点でループを抜ける。
[ab:c] は abcab となる。ただし反復回数が1回の時は : そのものが無視され、
[ab:c]1 は abc と展開される。
- トラック指定をまたいでいても使用できる。@a [ @b c @a de @b f @a ] は
@a に関して dede に展開される。
Version 0.1 [2005/08/22版]
- とりあえず見切り公開。当然あるべき機能さえないので、実用性ゼロ。
敢えて誇大すればテクノロジー・プレビュー版。
- @ コマンドはトラック指定。トラック名には a から p までの16種類。@a なら
以後 a トラックへの命令となり、@ab ならば a と b の両方に適用される。
チャンネル指定コマンドがまだないので、@a がMIDIチャンネルの 0、@b が 1、@c が 2
という具合の決め打ち、すげえ凶悪な仕様だ。
- cdefgab はそれぞれドレミファソラシドを表す。
- 音符記号の後に + を付ければシャープの意味となり半音上がる。
+ は複数付けることもでき、c++ は d と同じ。
同様に - はフラットで半音下げる。= はナチュラルだが
今のところ実用性は皆無である。
- c2 のようにして音長を指定できる。この場合は二分音符。
音符の後ろに付点を加えて c2. で付点二分音符、c2.. で複付点二分音符になる。
楽譜ならば三連符の所を c3 と三分音符で表せる。
音長は ^ で連結でき c2^3 は c2 と c3 の合計した長さを持つ、
反対に c2_3 は c2 から c3 を減じた長さ。
数字が * で始まるならばステップ数(tick数)による指定となり、
c*48 は通常ならば c4 と同じ意味になる。
c0 のように音調がゼロの時のみ和音表現となり、
ひとまずノートオフされずに、次の音符のノートオフ時まで延長される。
例えば c0e2 とすれば c と e の両方が二分音符で同時に鳴る。
- コンマの後に実際に発音する長さ、つまりゲートタイムが指定できる。
例えば c8,16 とすれば八分音符だけれど、
発音されるのは十六分音符と同じ長さとなる、スタッカートぎみの演奏になる。
- 更にコンマを続けてベロシティを指定できる。c4,8,120
- 更に更にコンマを続けて発音開始位置の増減位置を指定できる。
c4,,,*3 なら 3 ticks だけ遅れて発音が開始され、c4,,,-*3 或いは c4,,,*-3 なら
3 ticks 早く発音が始まる。
- 最後に & を付けるとノートオフが延長される。c4&e4&g4 のように
アルペジオを表現する。
- 各数値が + や - で始まる場合はあくまでも絶対指定。
基準値からの相対値で指定するには ^ や _ を用いる。
例えば c_*3 とすると c のような無指定の音長から 3 ticks だけ短い音長になる。
- r と p は休符。r8 なら八分休符となる。
r8,16 のようにゲートタイムも指定できる。
これは発音中の音符がある場合のみ有意。r と p の違いは、p の場合は
先行指定に関して音符のように動作する点である。
- < でオクターブ上がる。o^1 とほぼ同じ。
- > でオクターブ下がる。o_1 とほぼ同じ。
- o コマンドはオクターブ指定。標準は o4。o^2 や o_1 にような相対指定も可能。
また v コマンドに準じた先行指定が可能。
- l コマンドで標準の音長を指定する。l8 cde とすれば cde の各音符は八分音符。
先行指定が可能で、l8,16,32 cde は c8d16e32 と同じ。
- v コマンドでデフォルト・ベロシティを指定する。
先行指定を活用して v90,,30,^20,^20 cdefg はそれぞれ 90, 90, 30, 50, 70 の
ベロシティが適用される。先行指定の数値の前に () で音長を示すと、
ノートごとではなくステップ数による先行指定になる。
v100,(2)50 は最初 100 で二分音符経過したら 50 になるの意味。
先行指定の最後に ~ を付けると、指定終端に達すると最初に巻き戻す。
例えば v20,30,40~ は 20, 30, 40, 20, 30, 40,... の繰り返し。
- vs コマンドでノートオンごとの変動を指定。v50vs5 cdefg なら
50, 55, 60, 65, 70 という具合。vs-5 なら反対に 5 ずつ減る。
vs5 vs_3 は vs2 と同じ意味になるので要注意。
- vr コマンドでランダム・ベロシティ機能。vr10 で最大プラスマイナス10の範囲で
ベロシティに揺らぎが生ずる。
- ( でベロシティを増やす。(10 は v^10 とほぼ同じ。( のみの場合は (8 と同じ、
この標準値は (=20 などとして変更可能。
- ) でベロシティを減らす。v_ とほぼ同じ。
- q コマンドはゲートタイムのレート指定。q8 が標準で q4 とすると
c4 は c4,8 と同じ意味になる。これも先行指定が可能。
- k コマンドはゲートタイムの調整。
指定されたステップ数だけゲートタームが増減される。先行指定が可能。
- t コマンドは発音開始位置の指定。先行指定が可能。
- とりあえず E コマンドがエクスプレッション。
- とりあえず V コマンドがボリューム。
- とりあえず T コマンドがテンポ。
- suda.smf.MidiTrack.optimizingSerialization() を実装しないことには、
吐き出される SMF の質に問題あり、なのは分かっていつつ実装は先延ばし。
制作/創作田園地帯
2005/08/22初出
無断転載を禁じます。リンクはご自由にどうぞ。
Copyright © 2005-2008 Yoshinori SUDA. All rights reserved.