![見出し画像](https://assets.st-note.com/production/uploads/images/143495873/rectangle_large_type_2_f45ca0122214210c0e29a34a2640dba9.png?width=1200)
自由にエンベロープを書く
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;
)
![](https://assets.st-note.com/img/1717924408472-ahK8U9TlSn.png?width=1200)
例えば、こんなエンベロープを作ってみました。(ex1を実行すると上記グラフを見ることができます。)
例なので、あまり実用的ではないかもしれませんが、アタックの山を2個作ったり、そういうことができるのだということがわかります。
このあとの説明をしやすいように、エンベロープの折れ曲がっているポイントにピンク色をつけます。
![](https://assets.st-note.com/img/1717924488067-UnALPkDTp9.png?width=1200)
SuperColliderでは、図のピンクのポイントをノード(node)と呼ぶようです。
そして、0からナンバーをつけて呼びます。
![](https://assets.st-note.com/img/1717924061612-81nzEzAs52.png?width=1200)
さて、ex1のコードの説明です。
Env.newのひとつ目のパラメータは、各ノードのレベルです。
作りたいノードの数だけ書き込むことができます。
そして、ふたつ目のパラメータで、各ノード間の時間を設定します。
これでエンベロープの出来上がりです。
![](https://assets.st-note.com/img/1717924659203-gdKftzW8Y3.png?width=1200)
![](https://assets.st-note.com/img/1717924805728-ynfhYIpvs3.png?width=1200)
カーブ
さて、次のパラメータの0ですが、これはエンベロープの線のカーブです。
![](https://assets.st-note.com/img/1717926893343-xjvzctvlSy.png)
0で直線。
正の数を入力すると、後ろ側にふくらんでいくカーブ曲線になり、
負の数を入力すると、前側に膨らんでいくカーブ曲線になります。
下の図は、上から
1
0
-1
-10
を入力したものです。
![](https://assets.st-note.com/img/1717924876073-Pz85pJP4PR.png?width=1200)
ノードごとにカーブを変えることもできます。
その場合は下記のように書きます。
//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;
)
![](https://assets.st-note.com/img/1717924919416-C5decOPT3z.png?width=1200)
どのノードでサスティンするか
次のパラメータの3は、リリースノードの指定です。
このエンベロープをSynthDefに入れて演奏したとき、「どのノードでサスティンするか」をSuperColliderに教えるためのものです。
![](https://assets.st-note.com/img/1717926935082-jKkLPEFTag.png)
このコードのように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にする書き方としては、こう書いても
![](https://assets.st-note.com/img/1717925658542-qaT1z0kOXR.png)
こんなふうに書いても
![](https://assets.st-note.com/img/1717925671116-jCZ2kRAsRk.png)
同じ結果が得られます。
ループ
ところで、ex3の、コメントアウトしてる部分、これはループノードの指定です。
鍵盤を押している間(gate=1の間)、エンベロープは「リリースノード」〜「ループノード」を繰り返します。
なのでex3のコメントアウトをはずしてループを有効にすると、エンベロープはnode3→node1を繰り返します。
サスティンしてる間繰り返され、鍵盤を離すと(gateが0になると)ノード4以降に移行します。
ちょっと変則的なLFOになりますね。
<目次へ>
https://note.com/sc3/n/nb08177c4c011