見出し画像

09.SuperColliderのゲート(ノートON/OFF)

今回は一般的なシンセに多く採用されているADSRエンベロープを使います。
Env.adsrで作ることができます。
ADSRエンベロープはキーON情報を受け取るとエンベロープが動作し始め、キーOFF情報を受けて初めてReleaseTimeに移行します。

キーOFF情報を受けるまでSustain Levelが続く


SynthDefがキーOFF情報を受けるにはどうすればよいでしょうか。
次のコードのようにします。

(
SynthDef(\synth1, {
	arg freq=440, gate=1;
	var sig, env;
	env = EnvGen.kr(Env.adsr, gate, doneAction:2);
	sig = Saw.ar(freq, 0.3)!2;
	Out.ar(0, sig * env)
}).add;
)

前回のSynthDefとの違いは・・・?
まずはEnv.adsrが使われています。それと、argにgateが加わっています。
つまりgate情報をfunctionの外から(Pbindから)受けられるようにする(argに登録しておく)、ただそれだけでOKです。
※初期値を1にしておく必要があります。

EnvGen.krの第2パラメータgateは
「0より大きい数値を受け取ったらキーON(エンベロープ発動)」
「0を受け取ったらキーOFF(リリースへ移行)」
という機能が備わっています。

Pbind側からは、\midinote発生のたびにキーON情報として数値の1を、その音符の\dur間隔後にキーOFF情報として数値の0を\synth1に送っている、そういう仕組みになっています。ですのでPbind側は特に何も意識することなく通常通り音符を再生すればOKです。

では上記SynthDefを実行したのち、次のPbindを実行してみましょう。

(
Pbind(
	\instrument, \synth1, 
	\midinote, Pseq([45, \], inf), 
	\dur, 1,
).play(TempoClock.new(100/60));
)

45の隣の\は休符です。休符を表現したいときは上記のように数値の代わりに\を入れます。
再生するとmidinoteの45が1拍、休符1拍が繰り返されます。
ちゃんと音符ごとにキーOFFされている(エンベロープがリリースする)のを音で確認できますね。

リリースタイムを長めに設定して実験してみます。

(
SynthDef(\synth1, {
	arg freq=440, gate=1;
	var sig, env;
	env = EnvGen.kr(Env.adsr(0.01, 0.3, 0.5, 2), gate, doneAction:2);
	sig = Saw.ar(freq, 0.3)!2;
	Out.ar(0, sig * env)
}).add;
)

このSynthDefを実行したあとに、さっきのPbindを実行してみてください。
キーOFF後の余韻が長くなりました。
同じPbindを使ってもSynthDef側の設定で音が変わるのを確かめられますね。
ちなみに、Pbind再生中にSynthDefを繰り返し実行していくことも可能です。シーケンス再生しながら音色をいじっていくのに便利です。
例えば、Pbind再生中にSynthDef内のSaw.arをSinOsc.arにチェンジして実行する、なんてこともOKです。


ステップシーケンサーのような感じに


ではもう一度SynthDefをいじって今度は歯切れよくリリースする音にします。音色も雰囲気を変えてSawからLFPulseにしてみました。

(
SynthDef(\synth1, {
	arg freq=440, gate=1;
	var sig, env;
	env = EnvGen.kr(Env.adsr(0.01,0.6,0.5,0.2), gate, doneAction:2);
	sig = LFPulse.ar(freq)!2;
	Out.ar(0, sig * env * 0.3)
}).add;
)

Pbindのほうも音符を16個置いて、16ステップシーケンサーみたいにしてみます。
(midinoteの数列の前後の改行は、ただ見た目の見やすさのために入れました。)

(
Pbind(
	\instrument, \synth1, 
	\midinote, Pseq([
		56, 67, 70, 72, 44, 70, 75, 77,
		79, 67, 70, 72, 87, 70, 77, 75
	], inf), 
	\dur, 0.5,
	\legato, 1,
).play(TempoClock.new(110/60));
)

Pbindの中に\legatoというのを追加しました。
legatoは、durで設定した音間隔に対して、ゲートOFFするタイミングを割合で変化させます、、っていう説明ではよくわからない(というかうまく説明できてない)と思いますので、音を聴いて違いを感じてほしいです。
SynthDefを実行したあとPbindを実行してみてください。legatoが1の場合普通です。一度コマンド&ピリオドでシーケンスを止めて、logatoを0.6とかにすると少しスタッカート気味になります。
0.2や0.3にするともっと顕著です。

(
Pbind(
	\instrument, \synth1, 
	\midinote, Pseq([
		56, 67, 70, 72, 44, 70, 75, 77,
		79, 67, 70, 72, 87, 70, 77, 75
	], inf), 
	\dur, 0.5,
	\legato, 0.3,
).play(TempoClock.new(110/60));
)

逆にlegatoを1より大きい数値にすると、音がかぶっていきます。

(
Pbind(
	\instrument, \synth1, 
	\midinote, Pseq([
		56, 67, 70, 72, 44, 70, 75, 77,
		79, 67, 70, 72, 87, 70, 77, 75
	], inf), 
	\dur, 0.5,
	\legato, 1.5,
).play(TempoClock.new(110/60));
)

似たようなことをsusuttainを使って指定することも可能です。
sustainは割合で指定するのではなく実際の音長で指定します。
下記は、durが0.5に対して音長は0.25ということをやっています。(同じことをlegatoでやると、\legato, 0.5と書くのと同じです。)

(
Pbind(
	\instrument, \synth1, 
	\midinote, Pseq([
		56, 67, 70, 72, 44, 70, 75, 77,
		79, 67, 70, 72, 87, 70, 77, 75
	], inf), 
	\dur, 0.5,
	\sustain, 0.25,
).play(TempoClock.new(110/60));
)

音符ごとにも指定できるので、細かいニュアンスを表現するのに適しています。

(
Pbind(
	\instrument, \synth1, 
	\midinote, Pseq([
		56, 67, 70, 72, 44, 70, 75, 77,
		79, 67, 70, 72, 84, 70, 77, 75
	], inf), 
	\dur, 0.5,
	\sustain, Pseq([
		0.5, 0.2, 0.5, 0.7, 0.5, 0.2, 0.5, 0.5,
		0.5, 0.2, 0.5, 0.2, 2.0, 0.2, 0.5, 0.5
	], inf),
).play(TempoClock.new(110/60));
)

ちなみにPbind内の\midinoteや\durなどのパラメータを書く順番は自由に変えても大丈夫です。
下記の例だと\durを最後に持ってきてみました。

(
Pbind(
	\instrument, \synth1, 
	\midinote, Pseq([
		56, 67, 70, 72, 44, 70, 75, 77,
		79, 67, 70, 72, 84, 70, 77, 75
	], inf), 
	\sustain, Pseq([
		0.5, 0.2, 0.5, 0.7, 0.5, 0.2, 0.5, 0.5,
		0.5, 0.2, 0.5, 0.2, 2.0, 0.2, 0.5, 0.5
	], inf),
	\dur, 0.5,
).play(TempoClock.new(110/60));
)

ゲートについてはこんなところです。
次回はステレオ、パンニングについて書きたいと思います。

今日のまとめ


・SynthDefがキーOFF情報を受け取るには、argにgate=1を置いておく。
・休符は、\(バックスラッシュ)
・Pbind再生中にSynthDefをどんどん変化させる(実行していく)こともできる。
・legatoはdurに対する割合で音長を変化させる
・sustainは音長を直接数値で指定する


<目次>にも今回のリンクを作っておきます。https://note.com/sc3/n/nb08177c4c01

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