ディレイ
ヘルプではUGen > Delaysとして分類されています。エフェクトとしてのディレイには CombC
などを使います。 DelayC
などはただの遅延素子なのでフィードバックはかかりません。
exception in real time: alloc failed
が出るときは s.options.memSize
で確保するメモリを増やしてサーバを再起動します。デフォルトでは8192KBが確保されます。
s.options.memSize = 1000000; // 1GBのメモリを確保。 SynthDef(\delay, { | out(0), in(0), delayTime(0.2), decaytime(16), wet(0.5) | var input = In.ar(in, 2); var dry = input * (1 - wet); var delay = CombC.ar(input, 4, delayTime, decaytime, wet, dry); OffsetOut.ar(out, delay); } ).add; TempoClock.tempo = 140 / 60; ~seq = Pbind( \degree, Pseq([0, 2.2, 4.35, 6.67, 8.81], inf), \dur, 0.5, \amp, 0.3, \out, 10 ); ~delay = Pfx(~seq, \delay, \delayTime, 0.63, \in, 10).play;
以下はステレオディレイの例です。 Pfxb
を使う場合は SynthDef
の出力チャンネル数を s.options.numOutputBusChannels
以下にしないとエラーがでるようなので注意してください。
SynthDef(\delayStereo, { | out(0), in(0), delayTimeL(0.2), delayTimeR(0.15), decaytime(16) , wet(0.5) | var input = In.ar(in, 2); var dry = input * (1 - wet); var delayL = CombC.ar(input[0], 4, delayTimeL, decaytime, wet, dry[0]); var delayR = CombC.ar(input[1], 4, delayTimeR, decaytime, wet, dry[1]); OffsetOut.ar(out, [delayL, delayR]); } ).add; ~seq1 = Pbind( \out, 10, \degree, Pseq([[0, 3], [0, 5], [2, 5], [2, 7]], inf), \amp, 0.2 ); ~seq2 = Pbind( \out, 10, \degree, Pseq([ Pseq([Rest], 4), Pseq([14, 11, 8, Rest]) ], inf), \dur, 4, \amp, 0.2 ); ~seq3 = Pbind( \out, 10, \degree, Pseq([ Pseq([Rest], 8), Pseq([-10, -9, -11, -10, -9, -11, -10, -14]) ], inf), \dur, 8, \amp, 0.4 ); ~par = Ppar([~seq1, ~seq2, ~seq3]); TempoClock.tempo = 100 / 60; ~delay = Pfxb(~par, \delayStereo, \in, 10, \delayTimeL, TempoClock.beatDur * 0.78, \delayTimeR, TempoClock.beatDur * 0.666, ).play;
フィードバック
フェイザ
ノッチができるフィルタを直列につないでカットオフ周波数をLFOで揺らすとフェイザになります。
以下の例では DelayC
でコムフィルタを作っています。 DelayC
のかわりに AllpassC
などを使っても似たような効果になります。
s.options.memSize = 1000000; SynthDef(\phaser, { | out(0), in(0), rate(0.2), minDelay(0.0001), maxDelay(0.001) , dry(1), feedback(0.5) | var input = In.ar(in, 2); var inputFeedback = DelayC.ar(LocalIn.ar(2), 0.01, 0.0001, feedback); var phaser = List[]; var lfo = LFPar.ar(rate).exprange(minDelay, maxDelay); var temp = input.do({ |channel, index| var filter = channel + inputFeedback[index]; 4.do({ filter = DelayC.ar(filter, 1, lfo, 2/7, 0-filter * 5/7) // filter = AllpassC.ar(filter, 1, lfo, 0.001, 2/7, 0-filter * 5/7) }); phaser.add(filter) }); var output = phaser + (input * dry * 5/7); LocalOut.ar(output); OffsetOut.ar(out, output) } ).add; ~seq = Pbind( \out, 10, \scale, Scale.chromatic, \degree, Pseq([ [0, 5, 9, 14], [2.01, 9.01, 16, -2.5], [3, 6.98, 8.1, 10], [4.97, 9, 10, 12], [8, 9.99, 11.5, 19], [3, 7.02, 8.01, 10], [5, 8.96, 10, 12.01], [-2, 1.41, 3, 5] ], inf), \dur, 1, ); TempoClock.tempo = 130 / 60; ~phaser = Pfx(~seq, \phaser, \in, 10, \feedback, 0.8).play;