class library: SynthDef - lazy implementation of removeUGen
[supercollider.git] / HelpSource / Classes / EventPatternProxy.schelp
blob1c261f6123571f1db6073c068d729752bef1878c
1 class:: EventPatternProxy
2 summary:: event stream reference
3 categories:: Libraries>JITLib>Patterns
4 related:: Classes/Pdef
6 description::
7 Keeps a reference to a stream that can be replaced while playing. Multiple streams are thus handled without creating dependancies.
9 ClassMethods::
11 method::new
12 create a new instance with a pattern (the source). The pattern should be an emphasis::event pattern:: (see link::Classes/Pdef::)
14 method::default
15 a default source, if none is given. the default is a Pbind with resting notes of 1.0 beat duration.
17 method::defaultQuant
18 set the default quantization value for the class.
20 InstanceMethods::
22 method::source
23 set the source (a pattern). If a quantization is given, schedule this change to the next beat ( strong::pattern_::(..) is equivalent)
25 method::clear
26 set the source to nil
28 method::quant
29 get or set the quantization value. can be an array [quant, phase, offset, outset]
31 method::fadeTime
32 when the synthdefs that are used contain an code::\amp:: control, the patterns are replaced by crossfading the previous with the new over this time (in beats)
34 method::envir
35 provide a default event for the Pdef. It is used to filter the incoming stream before it is passed to the source pattern. This is similar to link::Classes/NodeProxy#-nodeMap::. When set for the first time, the pattern is rebuilt.
37 method::set
38 set arguments in the default event. If there is none, it is created and the pattern is rebuilt.
40 subsection::a) using as stream reference
42 method::embedInStream
43 just like any pattern, embeds itself in stream
45 subsection::b) using as EventStreamPlayer
47 method::play
48 starts the EventPatternProxy and creates a player. if you want to play multiple instances, use link::#-fork::.
50 argument::quant
51 can be an array of [quant, phase, offset, outset]
53 method::stop
54 stops the player
56 method::player
57 the current player (if the Pdef is simply used in other streams this is code::nil::)
59 method::pause, resume, reset
60 perform player method
62 method::isPlaying
63 returns true if Pdef is running. if a Pdef is playing and its stream ends, it will schedule a stream for playing as soon as a new one is assigned to it.
66 Examples::
68 subsection::a) embedding EventPatternProxy in streams
70 code::
72 SynthDef("Pdefhelp", { arg out, freq, sustain=1, amp=1, pan;
73         var env, u=1;
74         env = EnvGen.kr(Env.perc(0.03, sustain), 1, doneAction:2);
75         5.do { var d; d = exprand(0.01, 1); u = SinOsc.ar(d * 300, u, rrand(0.1,1.2) * d, 1) };
76         Out.ar(out, Pan2.ar(SinOsc.ar(u + 1 * freq, 0, amp * env), pan));
78 }).add;
80 s.boot;
82 #a, b, c, m = { EventPatternProxy.new } ! 4;
84 m.play;
85 m.source = Pbind(\instrument, \Pdefhelp, \dur, 1, \degree, 16, \legato, 0.1);
87 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.25, \degree, Pseq(#[0, 5, 4, 3]));
88 b.source = Pbind(\instrument, \Pdefhelp, \dur, 0.125, \degree, Pseq(#[7, 8, 7, 8]));
89 c.source = Pbind(\instrument, \Pdefhelp, \dur, 0.25, \degree, Pseq(#[0, 1, 2], 2));
91 x = Pseq([a, b, c], inf).play;
94 c.source = Pbind(\instrument, \Pdefhelp, \dur, 0.25, \degree, Pseq(#[4, 3, 1, 2]*3));
97 // infinite loops are scheduled (to ths clock's next beat by default) and released:
99 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.753, \degree, Pseq(#[0, 5, 4, 3, 2], inf));
100 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.125, \degree, Pseq(#[0, 5, 4, 3] + 1, 1));
101 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.25, \degree, Pseq(#[0, 5, 4, 3] - 1, 1));
103 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.125, \degree, Pseq(#[0, 5] - 1, 1));
104 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.753, \degree, Pshuf(#[0, 5, 4, 3, 2], inf));
106 x.stop;
107 m.stop;
109 // EventPatternProxy can be used in multiple patterns
112 x = Ppar([
113         Pbindf(Pn(a, inf),
114                 \gtranspose, Pstutter(8, Pseq(#[0, 2, 0, 3],inf))
115         ),
116         Pbindf(Pn(a, inf),
117                 \gtranspose, Pstutter(8, Pseq(#[7, 4, 0, 3],inf)),
118                 \dur, 0.6
119         ),
120         Pbindf(Pn(a, inf),
121                 \degree, Pseq(#[0, 5, 4, 3, 2, 3, 2], 1)
122         )
123 ]).play;
126 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.1, \degree, Pseq(#[0, 1, 0, 1, 2], inf));
128 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.2, \degree, Pseq([0, 4], inf));
130 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.2, \degree, Pseq([0, 4, Prand([6, 8b],2)], inf));
132 a.source = Pbind(\instrument, \Pdefhelp, \dur, 0.1, \degree, Pseq(#[0, 1b, 1, 2b, 2, 3, 4b, 4, 5], inf));
134 a.set(\detune, -50); // set environment
135 a.set(\detune, 0);
137 x.stop;
140 subsection::b) playing EventPatternProxy
142 code::
144 // load a synthdef
145 s.boot;
146 SynthDef("gpdef",
147         { arg out=0, freq=440, sustain=0.05, amp=0.1, pan;
148                 var env;
149                 env = EnvGen.kr(Env.perc(0.01, sustain), doneAction:2) * amp;
150                 Out.ar(out, Pan2.ar(SinOsc.ar(freq, 0, env), pan))
151         }).add;
155 #x, y = {EventPatternProxy.new} ! 2;
157 x.play; // play them. A silent resting pattern is used.
158 y.play;
161 // assign various patterns to it:
163 x.source = Pbind(\dur, 0.25, \instrument, \gpdef);
164 x.source = Pbind(\dur, 0.25, \degree, Pseq([3, 4, 5b, 6], inf), \instrument, \gpdef);
165 x.source = Pbind(\dur, 0.25, \degree, Pseq([3, 4, 5b, 6]+1, inf), \instrument, \gpdef);
166 y.source = Pbind(\dur, 0.25, \degree, Pseq([3, 4, 5b, 6]-1, inf), \instrument, \gpdef);
167 y.source = Pbind(\dur, 0.25, \degree, Pseq([3, 4, 5b]-2, inf), \instrument, \gpdef);
169 // using fadeTime:
171 y.fadeTime = 8.0;
172 y.source = Pbind(\dur, 0.125, \degree, Pseq([3, 4, 5b, 6]+4.rand, inf), \instrument, \gpdef);
173 y.source = Pbind(\dur, 0.25, \degree, Pseq([3, 4, 5b, 6]-2, inf), \instrument, \gpdef);
176 x.source = Pbind(
177                 \dur, 1 / 6,
178                 \degree, Pseq([3, 4, Prand([8, 2, 3, 9, 10],1) - 5, 6]+1, inf),
179                 \instrument, \gpdef
180                 )
181         );
184 x.source = Pbind(
185                 \dur, 0.25,
186                 \degree, Pseq([3, 4, Prand([8, 2, 3, 9, 10],1), 6], inf),
187                 \instrument, \gpdef)
188         );
190 x.stop;
194 // tempo change
195 TempoClock.default.tempo = 1.3;
196 y.source = Pbind(\dur, 0.25, \degree, Pseq([3, 4, 5, 6]+1, inf), \instrument, \gpdef);
198 // drop in ending patterns
200 x.play;
201 x.fadeTime = nil;
203 x.source = Pbind(\dur, 0.25, \degree, Pseq([3, [7,4], 5, 6]-2), \instrument, \gpdef);
204 x.source = Pbind(\dur, 0.125, \degree, Pseq([3, [7,4], 5, 4]-3), \instrument, \gpdef);
205 x.source = Pbind(\dur, 0.35, \degree, Pseq([3, [7,4], 5, 4, 3]-3), \instrument, \gpdef);
206 x.source = Pbind(\dur, 0.25, \degree, Pshuf([3, [7,4], 5, 6]-2), \instrument, \gpdef);
210 TempoClock.default.tempo = 1.0;
211 x.stop;
212 y.stop;