Examples: now has an iterative finder of a given number of slice (like the max JS version)
parent
eab7216739
commit
6e7ebed876
@ -0,0 +1,61 @@
|
||||
(
|
||||
b = Buffer.read(s,File.realpath(FluidBufNoveltySlice.class.filenameSymbol).dirname.withTrailingSlash ++ "../AudioFiles/Nicol-LoopE-M.wav");
|
||||
c = Buffer.new(s);
|
||||
)
|
||||
|
||||
(
|
||||
// with basic params
|
||||
Routine{
|
||||
var startTime, goal, startThresh, prevThresh, curThresh, curVal, prevVal, iters, maxIters, dVal, dThresh;
|
||||
startTime = Main.elapsedTime;
|
||||
prevThresh = 0.1; //initial threshold
|
||||
goal = 10; //number of slices desired
|
||||
maxIters = 100; //max number of iterations acceptable
|
||||
|
||||
//makes a first iteration
|
||||
FluidBufNoveltySlice.process(s,b, indices: c, threshold:prevThresh,action:{|x|prevVal = x.numFrames});
|
||||
s.sync;
|
||||
//makes a second iteration
|
||||
if ( (prevVal < goal), {
|
||||
curThresh = prevThresh * 0.5;
|
||||
}, {
|
||||
curThresh = prevThresh * 2;
|
||||
});
|
||||
FluidBufNoveltySlice.process(s,b, indices: c, threshold:curThresh,action:{|x|curVal = x.numFrames});
|
||||
s.sync;
|
||||
|
||||
//makes further iterations until the result is achieved, or the maximum of acceptable iterations is reached
|
||||
iters = 2;
|
||||
while ( {
|
||||
(iters < maxIters) && ((curVal - goal) != 0)
|
||||
}, {
|
||||
iters = iters + 1;
|
||||
dVal = curVal - prevVal;
|
||||
dThresh = curThresh - prevThresh;
|
||||
|
||||
prevThresh = curThresh;
|
||||
prevVal = curVal;
|
||||
|
||||
if ( (dVal == 0), {
|
||||
//if we have not change results between the last 2 passes, make the variation of threshold bigger
|
||||
curThresh = dThresh + curThresh;
|
||||
},{
|
||||
//if we have
|
||||
curThresh = ((dThresh / dVal) * (goal - curVal)) + curThresh;
|
||||
});
|
||||
FluidBufNoveltySlice.process(s,b, indices: c, threshold:curThresh,action:{|x|curVal = x.numFrames});
|
||||
s.sync;
|
||||
}
|
||||
);
|
||||
//depending on the outcome, gives the right info back
|
||||
|
||||
if ( iters >= maxIters, {
|
||||
// failed
|
||||
"Failed to find a suitable threshold in % seconds.\n".postf((Main.elapsedTime - startTime).round(0.01));
|
||||
}, {
|
||||
// succeeded
|
||||
"Found % as a suitable threshold in % seconds and % iterations.\n".postf(curThresh, (Main.elapsedTime - startTime).round(0.01), iters);
|
||||
}
|
||||
);
|
||||
}.play
|
||||
)
|
||||
Loading…
Reference in New Issue