音符属性(l,q,v,t,oコマンド)には、さまざまなオプションを指定できます。
onNote | (命令).onNote(v1,v2,v3...) | ノートオン毎の値の先行指定 |
N | =.onNote | |
onTime | (命令).onTime(low,high,len...) | 指定時間毎の値の推移的先行指定。 |
T | =.onTime | |
onCycle | (命令).onCycle(len,v1,v2,v3...) | 指定時間毎の値の先行指定 |
C | =.onCycle | |
Delay | (命令).Delay=v | 先行指定の効果の遅延時間 |
Repeat | (命令).Repeat(on/off) | 予約指定で.onNoteなどで繰り返すかどうか |
Random | (命令).Random=v | 書き込まれる値に、vのランダムな値を足す |
Range | (命令).Range(low,high) | 書き込まれる値に、上限と下限を設定する |
Max | q.Max(v)|v.Max(v) | qやvの最大値を変更する |
細かく打ちこみ作業をしていくと、ベロシティやゲートは、頻繁に値を変えたくなります。
そんなとき、いちいち、v50 c v70 c v80 e v100 g、と書いていくのは、非常に面倒ですし、あとから修正するのも大変です。
そこで、登場したのが、先行指定という概念です。これは、あらかじめ一度にたくさんの値を指定してしまおうというもので、 l,v,q,t,oのノートオン関連のコマンドに使えます。
指定方法は、 コマンド.onNote( 値1,値2,値3... ) のように指定します。(先行指定は、指定を解除するまで繰返されます。解除は、コマンド値というように普通の指定をします。)
コマンド.onNote( 値1,値2,値3... ) l4
v.onNote(50,120,80,120);
cccc gggg
v100 //先行指定解除
q.onNote(100,30);
cccc gggg
q100 //先行指定解除
cccc c1ここで、コマンドとは、
o l q v t
のこと。
時間ごとの先行指定
ノートオンごとの先行指定は便利なものですが、長いフレーズに対して一気に指定すると、どのノートにどの値が対応しているのか、訳がわからなくなる可能性があります。
時間ごとの先行指定は、指定が少し面倒ですが、値の推移を時間ごとに見られるので、便利です。
指定方法は、コマンド.onTime( (低値, 高値, ステップ値), (低値, 高値, ステップ値), (低値, 高値, ステップ値), ... )です。
解除方法は、コマンド値で、.onNoteの解除と同じです。
(ここで、問題になるのは、ステップ時間ですが、n分音符時間指定がしたいときは、!nと書くことで、n分音符がステップ時間に変換されます。)
コマンド.onTime( (低値, 高値, ステップ値), (低値, 高値, ステップ値), ... ) v.onTime(60,127,!1);
l8 cccc cccc cccc cccc
v100 //.onTimeの解除
q.onTime(10,120,!1)
l8 cccccccc dddddddd
q80 //.onTimeの解除
q.onTime((100,100,!4),(10,10,!4));
l4 cccc gggg
l4 cc8c8cc8c8 gg8g8gg8g8
q100 //.onTimeの解除
この.Timeオプションは、記述が冗長になりやすいため、.Cycleオプションがあります。
コマンド.onCycle( ステップ値, 値1, 値2, 値3, 値4, 値5 ...) t.onCycle(!16, 0, 8);
l16 cccc cccc cccc cccc
//これは、t.onTime(0,0,!16, 8,8,!16)と同じ意味です。
また相対指定コマンド v_ t_ q_ などと組み合わせれば、どのフレーズに対しても一定のグルーブ(ノリ)を与えることが出来ます。
v_ はベロシティーの相対指定。 t_ はタイミングの相対指定。q_ はゲートの相対指定コマンドで、それぞれ v t q とは独立しています。
v.onNote( 40,100 ); //(1)
l8 cccccccc
v_.onTime(-40,40,!1);//(2)
cccccccc dddddddd eeeeeeee
(2)自体は、右上がり直線のグラフになるが、(1)と組み合わせることで複雑な波形が再現できます。
この相対指定コマンドは、別々の10個の値を指定できます。これを使うと、今まで以上に複雑なリズムを表現できます。
コマンド__(番号0~9)
v__番号
q__番号
t__番号
(0番は、コマンド_と同じ意味)t.onCycle(!16,0,8);//基本はハーフシャッフル
t__1.onCycle(!4,0,-2);//偶数拍目頭は少し前ノリに
t__2.onTime(0,8,!1^1);//2小節ごと少しずつもたっていくように
[16 l16 cccc cccc ]
人間の演奏は機械と違って、良い意味で曖昧で、その曖昧さが味になったりします。コマンド.Random(n)でnを0以上に設定すると、それ以降の値をランダムに上下させます。
コマンド.Random(n) v80 v.Random(20) l8 cccc cccc cccc cccc
v.Random(0); //.Randomの解除
上記のさまざまオプションを組み合わせると、値が予想しないものになってしまうことがありますので、コマンド.Range(min,max)で、値のとりうる範囲を制限することが出来ます。
コマンド.Range(低値, 高値) これを設定することにより、値の範囲を制限できます。 v.Range(40,80)
v.onTime(0,127,!2);
l8 cccc cccc cccc cccc
v.Range(-1,-1);//範囲制限の解除。
サクラは、旧い時代に作られたMML(やノウハウ)をそのまま利用できるようにと、qや、vの最大値を変更するオプションがあります。ちなみに、昔のBASICでは、qの最大値は、8。vの最大値は、15でした。
コマンド.Max(n) v.Max(15)
q.Max(8)
v15 cdef v10 cdef
q8 cdef q4 cdef