表現力を高めよう


前章で見てきたことは、ストトン表記でも記述ができるMMLの基本でしたが、ここでは、さらに突っ込んで見てみましょう!


ノートオン・オプション

  1. ノート再び
    ドレミファソラシ を cdefgab と表現し、ノートの後ろに( c4 c2 のように)音長が指定できることは、全章で書きましたが、この音長の後ろにコンマで区切り、更に、ゲート、ベロシティ、タイミングを書くことが出来ます。
    ノート[音長][,ゲート][,ベロシティ][,タイミング]
    c4,100,127,2 // l4q100v127t2c と同じ意味
    c1,80,90,-2 // l1q80v80t-2c と同じ意味
    c%96,%70,120,0 // l%96q%70v120t0c と同じ意味
    (*[ ]内は省略可能を表す)

  2. ノートオンごとの先行指定
    細かく打ちこみ作業をしていくと、ベロシティやゲートは、頻繁に値を変えたくなります。そんなとき、いちいち、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 q_ v_ t_
    のこと。

  3. 時間ごとの先行指定
    ノートオンごとの先行指定は便利なものですが、長いフレーズに対して一気に指定すると、どのノートにどの値が対応しているのか、訳がわからなくなる可能性があります。
    時間ごとの先行指定は、指定が少し面倒ですが、値の推移を時間ごとに見られるので、便利です。
    指定方法は、コマンド.onTime( (低値, 高値, ステップ時間), (低値, 高値, ステップ時間), (低値, 高値, ステップ時間), ... )です。
    解除方法は、コマンドで、.onNoteの解除と同じです。
    (ここで、問題になるのは、ステップ時間ですが、n分音符時間指定がしたいときは、!nか、Step(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)と組み合わせることで複雑な波形が再現できます。

    ver0.999から、この相対指定コマンドが、別々の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 ]

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

  5. 値の範囲を制限する
    コマンド.Range(低値, 高値)
    これを設定することにより、値の範囲を制限できます。
    v.Range(40,80)
    v.onTime(0,127,!2);
    l8 cccc cccc cccc cccc
    v.Range(-1,-1);//範囲制限の解除。


  6. その他
    ノートオンオプションには、他にもオプションがありますが、最大値を設定したり、><の意味を逆にしたりと、たいしたことないので、ヘルプのMML・ノートオンオプションの項を参照してください。

戻る次へ