見出し画像

自由にエンベロープを書く

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

例えば、こんなエンベロープを作ってみました。(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


いいなと思ったら応援しよう!