From edc32b995266a208ba2b12a41dc5cb67eab8e65d Mon Sep 17 00:00:00 2001 From: Pierre Alexandre Tremblay Date: Thu, 16 Jan 2020 14:00:09 +0000 Subject: [PATCH] Started on size_of_slices and reorganised the example folders accordingly - working with average and tolerance as condition --- .../{ => segmenting}/nb_of_slices.scd | 0 .../Examples/segmenting/size_of_slices.scd | 81 +++++++++++++++++++ 2 files changed, 81 insertions(+) rename release-packaging/ignore/Examples/{ => segmenting}/nb_of_slices.scd (100%) create mode 100644 release-packaging/ignore/Examples/segmenting/size_of_slices.scd diff --git a/release-packaging/ignore/Examples/nb_of_slices.scd b/release-packaging/ignore/Examples/segmenting/nb_of_slices.scd similarity index 100% rename from release-packaging/ignore/Examples/nb_of_slices.scd rename to release-packaging/ignore/Examples/segmenting/nb_of_slices.scd diff --git a/release-packaging/ignore/Examples/segmenting/size_of_slices.scd b/release-packaging/ignore/Examples/segmenting/size_of_slices.scd new file mode 100644 index 0000000..d87cefd --- /dev/null +++ b/release-packaging/ignore/Examples/segmenting/size_of_slices.scd @@ -0,0 +1,81 @@ +( +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, target, tolerance, startThresh, prevThresh, curThresh, curVal, prevVal, iters, maxIters, dVal, dThresh; + startTime = Main.elapsedTime; + prevThresh = 0.1; //initial threshold (between 0.00001 and 0.99999 + target = 0.3 * s.sampleRate; //average of slices desired + tolerance = 0.01 * s.sampleRate; // the acceptable error in the number of slices yield + maxIters = 100; //max number of iterations acceptable + + //makes a first iteration and checks the average of slight lenght + FluidBufNoveltySlice.process(s,b, indices: c, threshold: prevThresh,action:{|x|x.getn(0,x.numFrames,{|y|var out; out = Array.new; y.doAdjacentPairs({|a,b|out = out ++ (b - a);});prevVal = out.mean;})}); + //makes a second iteration + s.sync; // OWEN: why is this needed??? + "1: % % %\n".postf(prevThresh, prevVal, c.numFrames); + if ( (prevVal > target), { + curThresh = (prevThresh * 0.5).max(0.000001); + }, { + curThresh = (prevThresh * 2).min(0.999999); + }); + FluidBufNoveltySlice.process(s,b, indices: c, threshold: curThresh,action:{|x|x.getn(0,x.numFrames,{|y|var out; out = Array.new; y.doAdjacentPairs({|a,b|out = out ++ (b - a);});curVal = out.mean;})}); + s.sync; + "2: % % %\n".postf(curThresh, curVal, c.numFrames); + //makes further iterations until the result is achieved, or the maximum of acceptable iterations is reached + iters = 2; + while ( { + (iters < maxIters) && ((curVal - target).abs > tolerance) + }, { + 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).min(0.999999).max(0.000001); + },{ + //if we have + curThresh = (((dThresh / dVal) * (target - curVal)) + curThresh).min(0.999999).max(0.000001); + }); + FluidBufNoveltySlice.process(s,b, indices: c, threshold: curThresh,action:{|x|x.getn(0,x.numFrames,{|y|var out; out = Array.new; y.doAdjacentPairs({|a,b|out = out ++ (b - a);});curVal = out.mean;})}); + s.sync; + "%: % % %\n".postf(iters, curThresh, curVal, c.numFrames); + } + ); + //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 for an average lenght of % samples per slices in % seconds and % iterations.\n".postf(curThresh, curVal.asInt, (Main.elapsedTime - startTime).round(0.01), iters); + } + ); +}.play +) + + + + +//sanity check +c.getn(0,c.numFrames,{|x|a=x}) + +a +d = Array.new; +a.doAdjacentPairs({|a,b|d = d ++ (b - a);}) +d.median +d.mean +{e=0;d.do({|x|e = e + (x - d.mean).squared});e = e / d.size; e = e.sqrt;}.value +f = d.sort +f.first +f.last +(f.blendAt((f.size-1) * 0.75) - f.blendAt((f.size-1) * 0.25))