diff --git a/Sources/MenuBand/MenuBandSampleVoice.swift b/Sources/MenuBand/MenuBandSampleVoice.swift index 14a2b9ae6a..b284c99b39 100644 --- a/Sources/MenuBand/MenuBandSampleVoice.swift +++ b/Sources/MenuBand/MenuBandSampleVoice.swift @@ -385,7 +385,9 @@ final class MenuBandSampleVoice { private func trimmedStartFrame(scratch: AVAudioPCMBuffer, frames: Int) -> Int { guard let data = scratch.floatChannelData?[0], frames > 0 else { return 0 } - let window = 128 + let window = 256 + let requiredHotWindows = 2 + var hotWindows = 0 var i = 0 while i < frames { let end = min(frames, i + window) @@ -396,7 +398,12 @@ final class MenuBandSampleVoice { } let rms = sqrt(sumSq / Float(end - i)) if rms >= trimThreshold { - return max(0, i - trimPrerollFrames) + hotWindows += 1 + if hotWindows >= requiredHotWindows { + return max(0, i - window * (requiredHotWindows - 1) - trimPrerollFrames) + } + } else { + hotWindows = 0 } i += window } diff --git a/Sources/MenuBand/MenuBandSynth.swift b/Sources/MenuBand/MenuBandSynth.swift index 0177c3c895..cb58352600 100644 --- a/Sources/MenuBand/MenuBandSynth.swift +++ b/Sources/MenuBand/MenuBandSynth.swift @@ -726,6 +726,8 @@ final class MenuBandSynth { NSLog("MenuBand SampleVoice: synth startSampleRecording (playbackEngineRunning=\(engine.isRunning))") _ = resumeAudioEngineIfNeeded() sampleRecordingActive = true + sampleVoice.setOutputEnabled(false) + sampleVoice.panic() sampleVoice.startRecording() } @@ -738,6 +740,9 @@ final class MenuBandSynth { let ok = sampleVoice.stopRecording() sampleRecordingActive = false onSampleLevel?(0) + if usingSampleBackend { + sampleVoice.setOutputEnabled(true) + } NSLog("MenuBand SampleVoice: synth stopSampleRecording result usable=\(ok)") scheduleIdleSuspendIfNeeded() return ok