1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
PfadeIn : FilterPattern {
var <>fadeTime, <>holdTime=0, <>tolerance;
*new { arg pattern, fadeTime=1.0, holdTime=0.0, tolerance=0.0001;
^super.new(pattern).fadeTime_(fadeTime).holdTime_(holdTime).tolerance_(tolerance)
}
embedInStream { arg inval;
var outval, elapsed=0, stream, c;
stream = pattern.asStream;
if(holdTime > 0.0) { Event.silent(holdTime, inval).yield };
loop {
outval = stream.next(inval);
if(outval.isNil) { ^nil.yield };
elapsed = elapsed + outval.delta;
c = elapsed / fadeTime;
if(c >= 1.0) {
inval = outval.yield;
^stream.embedInStream(inval);
} {
outval = outval.copy;
outval[\amp] = c.max(0) * outval[\amp];
// outval[\amp] = (c.max(0) * pi * 0.25).sin * outval[\amp];
inval = outval.yield;
}
}
}
storeArgs { ^[ pattern, fadeTime, holdTime, tolerance ] }
}
PfadeOut : PfadeIn {
embedInStream { arg inval;
var outval, elapsed=0, cleanup, stream, c;
stream = pattern.asStream;
cleanup = EventStreamCleanup.new;
loop {
inval = stream.next(inval) ?? { ^cleanup.exit(inval) };
cleanup.update(inval);
elapsed = elapsed + inval.delta;
if(elapsed.round(tolerance) <= holdTime) {
inval = inval.yield;
} {
c = elapsed - holdTime / fadeTime;
if(c >= 1.0) {
^cleanup.exit(inval);
} {
inval[\amp] = (1.0 - c.max(0)) * inval[\amp];
inval = inval.yield;
}
}
}
}
}
PfinQuant : FilterPattern {
var <>quant, <>clock;
*new { arg pattern, quant, clock;
^super.new(pattern).quant_(quant).clock_(clock)
}
embedInStream { arg inval;
var value, stream = pattern.asStream;
var referenceClock = clock ? thisThread.clock;
var endAt = quant.nextTimeOnGrid(referenceClock);
while {
value = stream.next(inval);
value.notNil and: { referenceClock.beats < endAt }
} {
inval = value.yield;
};
^inval
}
}
|