09.SuperColliderのゲート(ノートON/OFF)
今回は一般的なシンセに多く採用されているADSRエンベロープを使います。
Env.adsrで作ることができます。
ADSRエンベロープはキーON情報を受け取るとエンベロープが動作し始め、キーOFF情報を受けて初めてReleaseTimeに移行します。
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