!7 replace MarkedImage with BWImageAndRange. static L markedImages; p-exp { L files = latestFilesFirst(audioRecordingsWithSingleClip()); pnl(files); markedImages = map_printProgress(f audioFileToBWImageAndRange, files); showOriginalClips(); findBestBand(); } srecord Band(IntRange r, float threshold) {} svoid findBestBand { final int h = first(markedImages).image.getHeight(); final new Best best; final new AIStrategy_RandomWithVariation strategy; strategy.random = func -> Band { Band(randomIntRange(1, 0, h), randomFloat()) }; strategy.vary = func(Band b) -> Band { Band(varyIntRange(b.r, 5, 1, 0, h), varyFloat(b.threshold)) }; strategy.submit = func(final Band b) -> double { new Scorer scorer; for (MarkedImage img : markedImages) audio_scoreExitPoints(scorer, img, audio_exitPointsUsingBand_v1(img.image, b.r, threshold := b.threshold)); if (best.put(b, scorer!)) { print(scorer + " / Band: " + b + " of " + h); quickShowZoomedImage(mergeBWImagesVertically(map(markedImages, func(MarkedImage img) -> BWImage { new Var processedImage; L exitPoints = audio_exitPointsUsingBand_v1(img.image, b.r, threshold := b.threshold, +processedImage, printStreaks := true); ret markIntRangesOnTopOfBWImage( squishBWImage(processedImage!, 20), ll(intRange(img.start, img.end)), intsToSize2Ranges(map(func(int x) -> int { max(0, x-2) }, exitPoints))); }))); } ret scorer!; }; thread { while licensed { strategy.go(); } } } svoid showOriginalClips { showImage(mergeBWImagesVertically(map renderBWImageAndRange(markedImages))); }