141 lines
3 KiB
Text
141 lines
3 KiB
Text
|
class:: LocalOut
|
||
|
summary:: Write to buses local to a synth.
|
||
|
related:: Classes/LocalIn
|
||
|
categories:: UGens>InOut
|
||
|
|
||
|
|
||
|
Description::
|
||
|
|
||
|
LocalOut writes to buses that are local to the enclosing synth. The buses
|
||
|
should have been defined by a link::Classes/LocalIn:: ugen. The
|
||
|
code::channelsArray:: must be the same number of channels
|
||
|
as were declared in the link::Classes/LocalIn:: . These are like the
|
||
|
global buses, but are more convenient if you want to implement a self
|
||
|
contained effect that uses a feedback processing loop.
|
||
|
|
||
|
|
||
|
warning::
|
||
|
|
||
|
Audio written to a LocalOut will not be read by a corresponding
|
||
|
link::Classes/LocalIn:: until the next cycle, i.e. one block size of
|
||
|
samples later. Because of this it is important to take this additional
|
||
|
delay into account when using link::Classes/LocalIn:: to create
|
||
|
feedback delays with delay times shorter than the threshold of pitch
|
||
|
(i. e. < 0.05 seconds or > 20Hz), or where sample accurate
|
||
|
alignment is required. See the resonator example below.
|
||
|
|
||
|
::
|
||
|
|
||
|
classmethods::
|
||
|
|
||
|
method::ar, kr
|
||
|
|
||
|
argument::channelsArray
|
||
|
|
||
|
An Array of channels or single output to write out. You cannot
|
||
|
change the size of this once a SynthDef has been built.
|
||
|
|
||
|
|
||
|
Examples::
|
||
|
|
||
|
code::
|
||
|
|
||
|
(
|
||
|
{
|
||
|
var source, local;
|
||
|
|
||
|
source = Decay.ar(Impulse.ar(0.3), 0.1) * WhiteNoise.ar(0.2);
|
||
|
|
||
|
local = LocalIn.ar(2) + [source, 0]; // read feedback, add to source
|
||
|
|
||
|
local = DelayN.ar(local, 0.2, 0.2); // delay sound
|
||
|
|
||
|
// reverse channels to give ping pong effect, apply decay factor
|
||
|
LocalOut.ar(local.reverse * 0.8);
|
||
|
|
||
|
Out.ar(0, local);
|
||
|
}.play;
|
||
|
)
|
||
|
|
||
|
|
||
|
|
||
|
(
|
||
|
z = SynthDef("tank", {
|
||
|
var local, in;
|
||
|
|
||
|
in = Mix.fill(12, {
|
||
|
Pan2.ar(
|
||
|
Decay2.ar(Dust.ar(0.05), 0.1, 0.5, 0.1)
|
||
|
* FSinOsc.ar(IRand(36,84).midicps).cubed.max(0),
|
||
|
Rand(-1,1))
|
||
|
});
|
||
|
in = in + Pan2.ar(Decay2.ar(Dust.ar(0.03), 0.04, 0.3) * BrownNoise.ar, 0);
|
||
|
|
||
|
4.do { in = AllpassN.ar(in, 0.03, {Rand(0.005,0.02)}.dup, 1); };
|
||
|
|
||
|
local = LocalIn.ar(2) * 0.98;
|
||
|
local = OnePole.ar(local, 0.5);
|
||
|
|
||
|
local = Rotate2.ar(local[0], local[1], 0.23);
|
||
|
local = AllpassN.ar(local, 0.05, {Rand(0.01,0.05)}.dup, 2);
|
||
|
|
||
|
local = DelayN.ar(local, 0.3, [0.19,0.26]);
|
||
|
local = AllpassN.ar(local, 0.05, {Rand(0.03,0.15)}.dup, 2);
|
||
|
|
||
|
local = LeakDC.ar(local);
|
||
|
local = local + in;
|
||
|
|
||
|
LocalOut.ar(local);
|
||
|
|
||
|
Out.ar(0, local);
|
||
|
}).play;
|
||
|
)
|
||
|
|
||
|
|
||
|
|
||
|
(
|
||
|
z = SynthDef("tape", {
|
||
|
var local, in, amp;
|
||
|
|
||
|
in = SoundIn.ar([0, 1]);
|
||
|
|
||
|
amp = Amplitude.kr(Mix.ar(in));
|
||
|
in = in * (amp > 0.02); // noise gate
|
||
|
|
||
|
local = LocalIn.ar(2);
|
||
|
local = OnePole.ar(local, 0.4);
|
||
|
local = OnePole.ar(local, -0.08);
|
||
|
|
||
|
local = Rotate2.ar(local[0], local[1], 0.2);
|
||
|
|
||
|
local = DelayN.ar(local, 0.25, 0.25);
|
||
|
|
||
|
local = LeakDC.ar(local);
|
||
|
local = ((local + in) * 1.25).softclip;
|
||
|
|
||
|
LocalOut.ar(local);
|
||
|
|
||
|
Out.ar(0, local * 0.1);
|
||
|
}).play;
|
||
|
)
|
||
|
|
||
|
// Resonator, must subtract blockSize for correct tuning
|
||
|
(
|
||
|
var play, imp, initial;
|
||
|
SynthDef("testRes", {
|
||
|
|
||
|
play = LocalIn.ar(1);
|
||
|
imp = Impulse.ar(1);
|
||
|
|
||
|
LocalOut.ar(DelayC.ar(imp + (play * 0.995), 1, 440.reciprocal - ControlRate.ir.reciprocal)); // for feedback
|
||
|
|
||
|
OffsetOut.ar(0, play);
|
||
|
|
||
|
}).play(s);
|
||
|
|
||
|
{SinOsc.ar(440, 0, 0.2) }.play(s, 1); // compare pitch
|
||
|
)
|
||
|
|
||
|
::
|
||
|
|