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