PatternProxy stream reference
superclass: Pattern
keeps a reference to a stream that can be replaced while playing.
Multiple streams are thus handled without creating dependancies.
related: Pdefn
*new(source)
create a new instance with a pattern (the source).
the pattern should be a value pattern (see Pdefn)
for event pattern proxy, see: EventPatternProxy
instead of a pattern, a function can be passed in, creating a routine.
*default
a default source, if none is given. the default is 1.0 (it is not 0.0 in order to make it safe for durations)
source_(obj)
set the source. If a quantization is given, schedule this change to the next beat
clear set the source to nil
quant_
set the quantization value
quant
get the quantization value
*defaultQuant_
set the default quantization value for the class. (default: nil)
condition_(func)
provide a condition under which the pattern is switched when a new one is inserted.
the stream value and a count is passed into the function
the methods count_(n) simply counts up to n and switches the pattern then
reset
switch the pattern immediately. (stuck conditions can be subverted by this)
embedInStream(inval)
just like any pattern, embeds itself in stream
PatternProxy implements some methods for the benefits of its subclasses Pdefn/Pdef/Tdef which
are not useful for PatternProxy, EventStreamProxy and TaskProxy.
envir_(event)
provide a default environment for the proxy.
If given, it is used as an environment for the routine
function. When set for the first time, the routine pattern is rebuilt.
set(key, val, key2, val2, ...)
set arguments in the environment.
If there is none, it is created and the pattern is rebuilt.
endless
returns a Proutine that plays the proxy endlessly, replacing nil with a default
value (1). This allows to create streams that idle on until a new pattern is inserted.
// example
a = PatternProxy(Pseq([1, 2, 3], inf));
x = Pseq([0, 0, a], inf).asStream;
t = Task({ loop({ x.next.postln; 0.3.wait }) }).play;
a.source = Pseq([55, 66, 77], inf);
a.source = Pseq([55, 66, 77], 1);
t.stop;
// PatternProxy, like Pdefn can be accessed in multiple streams
(
SynthDef("Pdefhelp", { arg out, freq, sustain=1, amp=1, pan;
var env, u=1;
env = EnvGen.kr(Env.perc(0.03, sustain), 1, doneAction:2);
5.do { var d; d = exprand(0.01, 1); u = SinOsc.ar(d * 300, u, rrand(0.1,1.2) * d, 1) };
Out.ar(out, Pan2.ar(SinOsc.ar(u + 1 * freq, 0, amp * env), pan));
}).store;
s.boot;
)
(
x = PatternProxy.new;
x.source = Pseq([0, 3, 2], inf);
Pset(\instrument, \Pdefhelp,
Ppar([
Pbind(\degree, x),
Pbind(\degree, x, \dur, 1/3)
])
).play;
)
x.source = Prand([0, 3, [1s, 4]], inf);
x.source = Pn(Pshuf([0, 3, 2, 7, 6], 2), inf);
// if quant is set, the update is done at the next beat or whatever is specified:
x.quant = 4;
x.source = Pn(Pseries(0, 1, 8), inf);
x.quant = nil; // reactivate immediacy
(
x.source = Prout {
loop {
4.do { |i|
#[2, 3, 4].choose.yield;
#[5, 0, 11].choose.yield;
#[6, 3, 4].choose.do { |j| (i % j).yield };
}
}
}
)