自由にエンベロープを書く
SuperColliderでは、かなり自由なエンベロープ設定が可能です。
これまでの記事ではEnv.adsrやEnv.asrなど、比較的オーソドックスなものを使ってきましたが、Env.newを使うとかなり自由で変態的なエンベロープを書くことができます。
エンベロープのループも組めるので、実質LFOのような機能をさせることもできます。
早速、実例です。
//ex1
(
Env.new(
[0, 1, 0, 0.6, 0.2, 1],
[0.1, 0.4, 0.1, 0.4, 0.1],
0,
3,
).plot;
)
例えば、こんなエンベロープを作ってみました。(ex1を実行すると上記グラフを見ることができます。)
例なので、あまり実用的ではないかもしれませんが、アタックの山を2個作ったり、そういうことができるのだということがわかります。
このあとの説明をしやすいように、エンベロープの折れ曲がっているポイントにピンク色をつけます。
SuperColliderでは、図のピンクのポイントをノード(node)と呼ぶようです。
そして、0からナンバーをつけて呼びます。
さて、ex1のコードの説明です。
Env.newのひとつ目のパラメータは、各ノードのレベルです。
作りたいノードの数だけ書き込むことができます。
そして、ふたつ目のパラメータで、各ノード間の時間を設定します。
これでエンベロープの出来上がりです。
カーブ
さて、次のパラメータの0ですが、これはエンベロープの線のカーブです。
0で直線。
正の数を入力すると、後ろ側にふくらんでいくカーブ曲線になり、
負の数を入力すると、前側に膨らんでいくカーブ曲線になります。
下の図は、上から
1
0
-1
-10
を入力したものです。
ノードごとにカーブを変えることもできます。
その場合は下記のように書きます。
//ex2
(
Env.new(
[0, 1, 0, 0.6, 0.2, 1],
[0.1, 0.4, 0.1, 0.4, 0.1],
[-1, 3, 0, 20, -5],//カーブをノードごとに設定
3,
).plot;
)
どのノードでサスティンするか
次のパラメータの3は、リリースノードの指定です。
このエンベロープをSynthDefに入れて演奏したとき、「どのノードでサスティンするか」をSuperColliderに教えるためのものです。
このコードのように3を設定した場合、
エンベロープが発動してnode3まで来ると、そのレベル(このコードでは0.6)でサスティンします。
そして、鍵盤を離すとnode4に以降しながらリリースします。
(リリースノードを指定しなかった場合、最終ノードがリリースノードになります。)
では、出来上がったエンベロープをSynthDefの音色にあててみます。
//ex3
//前回使ったSynthDefをいじって、フィルターエンベロープに今回作ったものをあてています。
(
SynthDef(\freeEnv, {
arg gate=1, freq=220;
var wg, amp=0.2, aEnv, fEnv;
aEnv = EnvGen.kr(Env.asr(0.01, 1, 3), gate, doneAction:2);
fEnv = EnvGen.kr(
Env.new(
[0, 1, 0, 0.6, 0.2, 1],
[0.1, 0.4, 0.1, 0.4, 0.1],
0,
3,
// 1
).range(0, 2000),
gate);
wg = Saw.ar(freq)!2;
wg = RLPF.ar(wg, 200 + fEnv, 0.1);
Out.ar(0, wg * amp * aEnv);
}).add;
)
当て方としてはEnv.adsrなどと同じく、EnvGen.krの第一パラメータの部分に置くだけです。(改行しないと見づらいのでEnv.newのところで改行しています。)
Pbindで鳴らしてみると、フィルターが変化するのがわかります。
//ex4
(
Pbind(
\instrument, \freeEnv,
\midinote, Pseq([60,67], inf),
\dur, 4,
\sustain, 2
).play;
)
(ex3補足)
fEnvをそのまま使うとレベルが0-1しか変化しないので、エンベロープのレベル幅を2000にしています。
これでカットオフ周波数が200-2200まで変化するようになりました。
エンベロープのレベル幅を2000にする書き方としては、こう書いても
こんなふうに書いても
同じ結果が得られます。
ループ
ところで、ex3の、コメントアウトしてる部分、これはループノードの指定です。
鍵盤を押している間(gate=1の間)、エンベロープは「リリースノード」〜「ループノード」を繰り返します。
なのでex3のコメントアウトをはずしてループを有効にすると、エンベロープはnode3→node1を繰り返します。
サスティンしてる間繰り返され、鍵盤を離すと(gateが0になると)ノード4以降に移行します。
ちょっと変則的なLFOになりますね。
<目次へ>
https://note.com/sc3/n/nb08177c4c011