From 99e94d18ce54d1ad73c7c0349119d4cd8fb4f965 Mon Sep 17 00:00:00 2001 From: skal Date: Tue, 17 Feb 2026 21:28:58 +0100 Subject: feat(mq_editor): peaks display, STFT cache refactor, threshold reactivity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - STFTCache: cache squaredAmplitude (re²+im²) per frame, add getSquaredAmplitude(t) - getMagnitudeDB uses cached sq amp (10*log10, no sqrt) - detectPeaks uses squaredAmp from cache instead of recomputing FFT - extractPartials: use cache frames, return {partials, frames} - Press 'p' to toggle raw peak overlay in viewer - threshold input: step=any, change event triggers re-extraction - runExtraction() shared by button and threshold change handoff(Claude): mq_partial peaks/cache refactor complete --- tools/mq_editor/index.html | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'tools/mq_editor/index.html') diff --git a/tools/mq_editor/index.html b/tools/mq_editor/index.html index 84abd1c..27eba2a 100644 --- a/tools/mq_editor/index.html +++ b/tools/mq_editor/index.html @@ -82,7 +82,7 @@ - + @@ -173,9 +173,8 @@ } }); - // Extract partials - extractBtn.addEventListener('click', () => { - if (!audioBuffer) return; + function runExtraction() { + if (!stftCache) return; setStatus('Extracting partials...', 'info'); extractBtn.disabled = true; @@ -189,13 +188,12 @@ sampleRate: audioBuffer.sampleRate }; - const partials = extractPartials(audioBuffer, params); + const result = extractPartials(params, stftCache); - extractedPartials = partials; - setStatus(`Extracted ${partials.length} partials`, 'info'); - - // Update viewer - viewer.setPartials(partials); + extractedPartials = result.partials; + viewer.setFrames(result.frames); + setStatus(`Extracted ${result.partials.length} partials`, 'info'); + viewer.setPartials(result.partials); } catch (err) { setStatus('Extraction error: ' + err.message, 'error'); @@ -203,6 +201,16 @@ } extractBtn.disabled = false; }, 50); + } + + // Extract partials + extractBtn.addEventListener('click', () => { + if (!audioBuffer) return; + runExtraction(); + }); + + threshold.addEventListener('change', () => { + if (stftCache) runExtraction(); }); // Play audio @@ -325,6 +333,9 @@ if (!playBtn.disabled) { playBtn.click(); } + } else if (e.code === 'KeyP') { + e.preventDefault(); + if (viewer) viewer.togglePeaks(); } }); -- cgit v1.2.3