複数のOut.ar(ディレイ系エフェクトの回の補足)とSplay
今日は「ディレイ系エフェクトとPfx」の回の補足的な内容です。
この回↑では、下図のような結線イメージでディレイエフェクトをかける紹介をしました。
これだと原音を直接エフェクトにインプットしています。
でもDAWやミキサーでエフェクトセンドするみたいに、「センド(send)でエフェクトに信号を送りたい」という場合もあると思います。
それについて書きます。
といっても実は簡単で、SynthDef内にOutクラスを2個置くだけです。
実は「Demand / Trig1」の回や「リズムループを作った」の回のコードでもそのようにしていたのですが、特に説明はしませんでした。
音源にOutクラスを2個使うと下図のようなイメージになります。
前回そのままのコードがこちら。
(まずcommand+bでサーバ起動します。)
(メニューからBootSeverを選択してもOKです。)
(
SynthDef(\synth1, {
arg freq=440, gate=1;
var sig, amp=0.3;
sig = LFTri.ar(freq) * EnvGen.kr(Env.perc(0.01, 0.4), gate, doneAction:2);
Out.ar(50, sig!2 * amp);
}).add;
SynthDef(\effect1, {
var sig, eff;
sig = In.ar(50, 2);
eff = sig + CombN.ar(sig, 0.6, [0.38,0.6], 4, 0.3);
Out.ar(0, eff);
}).add;
~seq = Pbind(
\instrument, \synth1,
\midinote, Pseq([60, 62, 64, \], inf),
\dur, 0.5,
);
Pfx(~seq, \effect1).play;
)
この\synth1のSynthDefに、Out.arをもうひとつ足します。
(
SynthDef(\synth1, {
arg freq=440, gate=1;
var sig, amp=0.3;
sig = LFTri.ar(freq) * EnvGen.kr(Env.perc(0.01, 0.4), gate, doneAction:2);
Out.ar(50, sig!2 * amp);
Out.ar(0, sig!2 * amp);
}).add;
SynthDef(\effect1, {
var sig, eff;
sig = In.ar(50, 2);
eff = sig + CombN.ar(sig, 0.6, [0.38,0.6], 4, 0.3);
Out.ar(0, eff);
}).add;
~seq = Pbind(
\instrument, \synth1,
\midinote, Pseq([60, 62, 64, \], inf),
\dur, 0.5,
);
Pfx(~seq, \effect1).play;
)
これでひとまず完了です。
こうすると\synth1はアウト0とアウト50の両方から出力されます。
ただ、少し改造が必要です。
eff = sig + CombN.ar(sig, 0.6, [0.38,0.6], 4, 0.3);
この行は原音(sig)にエフェクト音(CombN.ar)を足しています。原音はアウト0から出るようにしたのでこの行での原音は不要になりました。
eff = CombN.ar(sig, 0.6, [0.38,0.6], 4, 0.3);
こうすることでeffect1のSynthDefは純粋にエフェクト音になりますので、そのようにします。
それと、ふたつのOut.arに同じ変数(amp)を使っているので音量調整がやりづらいですね。
例えばアウト50の音量(amp)を絞るとアウト0の音量(amp)も変わってしまいます。
そこで・・・
Out.ar(50, sig!2 * send);
Out.ar(0, sig!2 * amp);
こんなふうにしようと思います。
これで、変数"amp"で原音の音量を、変数"send"でディレイに送る音量を、別々に設定できるようになります。
(
SynthDef(\synth1, {
arg freq=440, gate=1;
var sig, amp=0.3, send=0.25;
sig = LFTri.ar(freq) * EnvGen.kr(Env.perc(0.01, 0.4), gate, doneAction:2);
Out.ar(50, sig!2 * send);
Out.ar(0, sig!2 * amp);
}).add;
SynthDef(\effect1, {
var sig, eff;
sig = In.ar(50, 2);
eff = CombN.ar(sig, 0.6, [0.38,0.6], 4, 0.3);
Out.ar(0, eff);
}).add;
~seq = Pbind(
\instrument, \synth1,
\midinote, Pseq([60, 62, 64, \], inf),
\dur, 0.5,
);
Pfx(~seq, \effect1).play;
)
完成です。
sendの数値を変えて実行するとセンド量が変わっていくのを感じられると思います。
Out.arをさらに追加
さらに、ディレイとは別にリバーブなど他のエフェクトもかけたい場合があります。
SynthDef内へのOut.arの追加は、いくつでもOKです。(だと思います。僕の経験は最高3個ですが。。)
下記の例ではもうひとつOut.arを追加してバス60に送った信号にリバーブをかけました。
このとき注意なのが・・・エフェクトを追加したので、追加したリバーブ用にもPfxを作らないといけないということです。
a = Pfx(~seq, \effect1);
Pfx(a, \effect2).play;
このように、effect1のPfxを変数aに入れて、それをeffect2のPfxに入れました。
(
SynthDef(\synth1, {
arg freq=440, gate=1;
var sig, amp=0.3, send1=0.6, send2=0.35;
sig = LFTri.ar(freq) * EnvGen.kr(Env.perc(0.01, 0.4), gate, doneAction:2);
Out.ar(50, sig!2 * send1);
Out.ar(60, sig!2 * send2);
Out.ar(0, sig!2 * amp);
}).add;
SynthDef(\effect1, {
var sig, eff;
sig = In.ar(50, 2);
eff = CombN.ar(sig, 0.6, [0.38,0.6], 4, 0.3);
// eff = Splay.ar(eff, 0.33);
Out.ar(0, eff);
}).add;
SynthDef(\effect2, {
var sig, eff;
sig = In.ar(60, 2);
eff = FreeVerb2.ar(sig[0], sig[1], 1, 0.7, 0.9);
Out.ar(0, eff);
}).add;
~seq = Pbind(
\instrument, \synth1,
\midinote, Pseq([60, 62, 64, \], inf),
\dur, 0.5,
);
a = Pfx(~seq, \effect1);
b = Pfx(a, \effect2);
b.play;
)
Splay
ところで、ディレイ音をLRにパンニングした場合、「広がりすぎ」ってこともありますよね。「もう少しセンターに寄せたい」みたいなこと。
そんなときに便利なのがSplayクラスです。
左右の広がりを調整できます。
先ほどのコードに仕込んでおきました
eff = Splay.ar(eff, 0.33);
この行のコメントアウトをはずすとSplayが生きて、ディレイ音が少し中央に寄るはずです。
Splay.ar(入力信号, spread)
という使い方です。
spreadは0でセンター、1で左右に振り切る、です。
Splayは他にも便利な使い方があります。
下記のようなコードを鳴らしたとき、通常だったらLFTri.arの
60がLチャンネルから
64がRチャンネルから
出力されて、67, 71, 74, 78はマルチアウト出力又は仮想出力から出力されますが、
このLFTriにSplayを通すと、「全部の音をいい感じにLRに」振ってくれます。
(
SynthDef(\splayTone, {
var sig, env, amp=0.3;
env = EnvGen.kr(Env.perc);
sig = LFTri.ar(([60, 64, 67, 71, 74, 78]).midicps);
sig = Splay.ar(sig, 0.6);
// sig = Pan2.ar(sig);
Out.ar(0, sig * env * amp);
}).play;
)
Pan2の行のコメントアウトをはずして
Splayの行をコメントアウトすると、聴き比べができます。
上記コードのSplayによる自動パンニングで、「低い音をセンターに寄せたい」などの場合は
LFTri.arの音程を[78, 71, 64, 60, 67, 74]
など、に並べ替えればOKです。(↑60と64が真ん中あたりに来る。)
ちなみに、midicpsはMIDIノートナンバーを周波数に変換してくれるメソッドです。