//jr: modified for patterns in dur argument.
//nil is now accepted as 'wait until duration
is over' and get next duration
Pfindur2 : FilterPattern
{
var <>dur,
<>tolerance;
*new { arg dur,
pattern, tolerance = 0.001;
^super.new(pattern).dur_(dur).tolerance_(tolerance)
}
asStream {
^Routine.new({
arg inevent;
var item, stream, delta, duration, durStream;
var sawNil=false,
elapsed = 0.0, nextElapsed=0.0;
durStream
= dur.asStream;
loop({
duration
= durStream.value;
stream
= pattern.asStream;
elapsed
= 0.0;
sawNil
= false;
if(duration.notNil,
{
while({
inevent
= stream.next(inevent);
if(inevent.isNil, {
sawNil = true;
inevent = Event.protoEvent.use({
~freq = \rest;
~delta
= 0.0 })
});
delta = inevent.delta;
nextElapsed
= elapsed + delta;
sawNil.not && (nextElapsed.round(tolerance) <
duration)
}, {
elapsed = nextElapsed;
inevent = inevent.yield;
});
inevent = inevent.copy;
// fix delta time.
inevent.put(\delta, duration
- elapsed);
inevent = inevent.yield;
}, {
nil.alwaysYield;
});
});
});
}
}
This page was created by SimpleText2Html 1.0.3 on 13-Aug-101.