sclass SimpleBaseDrumFinder2 { double windowSize = 10.0; // seconds int imageHeight = 10; // must be >= segmenter.gridSize transient ISegmenter segmenter; transient new L buf; transient int bufSize; transient BWImage lastImage; transient L ranges; L addFrequencyImageBrightnesses(float[] l) { if (segmenter == null) segmenter = mandatorySegmenterFromAGIBlue("Find base drum #1"); buf.add(l); bufSize += l(last(buf)); if (bufSize < audio_estimatedFrequencyImageWidth(windowSize)) null; print("Have img! " + l(buf)); float[] data = normalizeFloatArray(concatFloatArrays(buf)); lastImage = bwImageFromColumnFloats(imageHeight, data); buf.clear(); bufSize = 0; ranges = map rectXRange(segmenter.get(toBufferedImage(lastImage))); print(n2(ranges, "base drum") + ": " + ranges); ret ranges; } }