音符属性オプション


音符属性(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)書き込まれる値に、上限と下限を設定する
Maxq.Max(v)|v.Max(v)qやvの最大値を変更する

ノートオンごとの先行指定(.onNote)

 細かく打ちこみ作業をしていくと、ベロシティやゲートは、頻繁に値を変えたくなります。
そんなとき、いちいち、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)(.onCycle)

時間ごとの先行指定
ノートオンごとの先行指定は便利なものですが、長いフレーズに対して一気に指定すると、どのノートにどの値が対応しているのか、訳がわからなくなる可能性があります。
時間ごとの先行指定は、指定が少し面倒ですが、値の推移を時間ごとに見られるので、便利です。
指定方法は、コマンド.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)

人間の演奏は機械と違って、良い意味で曖昧で、その曖昧さが味になったりします。コマンド.Random(n)でnを0以上に設定すると、それ以降の値をランダムに上下させます。
コマンド.Random(n)
v80 v.Random(20) l8 cccc cccc cccc cccc
v.Random(0); //.Randomの解除

値の範囲を制限する(.Range)

上記のさまざまオプションを組み合わせると、値が予想しないものになってしまうことがありますので、コマンド.Range(min,max)で、値のとりうる範囲を制限することが出来ます。
コマンド.Range(低値, 高値)
これを設定することにより、値の範囲を制限できます。
v.Range(40,80)
v.onTime(0,127,!2);
l8 cccc cccc cccc cccc
v.Range(-1,-1);//範囲制限の解除。

昔のMMLを再現する(.Max)

サクラは、旧い時代に作られたMML(やノウハウ)をそのまま利用できるようにと、qや、vの最大値を変更するオプションがあります。ちなみに、昔のBASICでは、qの最大値は、8。vの最大値は、15でした。
コマンド.Max(n)
v.Max(15)
q.Max(8)
v15 cdef v10 cdef
q8 cdef q4 cdef

戻る