diff options
Diffstat (limited to 'tools/mq_editor/app.js')
| -rw-r--r-- | tools/mq_editor/app.js | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/tools/mq_editor/app.js b/tools/mq_editor/app.js index 9df00fb..55b8d25 100644 --- a/tools/mq_editor/app.js +++ b/tools/mq_editor/app.js @@ -49,13 +49,18 @@ document.getElementById('hpK2').addEventListener('input', function() { // Show/hide global resonator params when forceResonator toggled document.getElementById('forceResonator').addEventListener('change', function() { document.getElementById('globalResParams').style.display = this.checked ? '' : 'none'; + if (viewer) viewer.render(); }); document.getElementById('globalR').addEventListener('input', function() { document.getElementById('globalRVal').textContent = parseFloat(this.value).toFixed(4); + if (viewer) viewer.render(); }); document.getElementById('globalGain').addEventListener('input', function() { document.getElementById('globalGainVal').textContent = parseFloat(this.value).toFixed(2); + if (viewer) viewer.render(); }); +document.getElementById('forceRGain').addEventListener('change', () => { if (viewer) viewer.render(); }); + let audioBuffer = null; let viewer = null; let audioContext = null; @@ -195,7 +200,8 @@ function loadAudioBuffer(buffer, label) { document.getElementById('exploreBtn').disabled = false; document.getElementById('contourBtn').disabled = false; editor.setViewer(viewer); - viewer.onPartialSelect = (i) => editor.onPartialSelect(i); + viewer.onGetSynthOpts = () => getSynthParams().opts; + viewer.onPartialSelect = (i) => editor.onPartialSelect(i); viewer.onRender = () => editor.onRender(); viewer.onBeforeChange = pushUndo; viewer.onExploreMove = (time, freq) => { @@ -219,10 +225,9 @@ function loadAudioBuffer(buffer, label) { viewer.onExploreCommit = (partial) => { if (!extractedPartials) extractedPartials = []; pushUndo(); - const {spread_above, spread_below} = autodetectSpread(partial, stftCache, fftSize, audioBuffer.sampleRate); - if (!partial.harmonics) partial.harmonics = { decay: 0.0, freq_mult: 2.0, jitter: 0.05, spread_above: 0.02, spread_below: 0.02 }; - partial.harmonics.spread_above = spread_above; - partial.harmonics.spread_below = spread_below; + const {spread} = autodetectSpread(partial, stftCache, fftSize, audioBuffer.sampleRate); + if (!partial.harmonics) partial.harmonics = { decay: 0.0, freq_mult: 2.0, jitter: 0.05, spread: 0.02 }; + partial.harmonics.spread = spread; extractedPartials.unshift(partial); refreshPartialsView(0); setStatus(`${exploreMode}: added partial (${extractedPartials.length} total)`, 'info'); @@ -333,7 +338,7 @@ function createNewPartial() { v0: 440, v1: 440, v2: 440, v3: 440, a0: 1.0, a1: 1.0, a2: 1.0, a3: 1.0, }, - harmonics: { decay: 0.0, freq_mult: 2.0, jitter: 0.05, spread_above: 0.02, spread_below: 0.02 }, + harmonics: { decay: 0.0, freq_mult: 2.0, jitter: 0.05, spread: 0.02 }, }; extractedPartials.unshift(newPartial); refreshPartialsView(0); @@ -357,12 +362,11 @@ function autoSpreadAll() { if (!extractedPartials || !stftCache) return; const fs = stftCache.fftSize; const sr = audioBuffer.sampleRate; - const defaults = { decay: 0.0, freq_mult: 2.0, jitter: 0.05, spread_above: 0.02, spread_below: 0.02 }; + const defaults = { decay: 0.0, freq_mult: 2.0, jitter: 0.05, spread: 0.02 }; for (const p of extractedPartials) { - const {spread_above, spread_below} = autodetectSpread(p, stftCache, fs, sr); + const {spread} = autodetectSpread(p, stftCache, fs, sr); if (!p.harmonics) p.harmonics = { ...defaults }; - p.harmonics.spread_above = spread_above; - p.harmonics.spread_below = spread_below; + p.harmonics.spread = spread; } if (viewer) viewer.render(); const sel = viewer ? viewer.selectedPartial : -1; @@ -384,7 +388,7 @@ for (const el of [birthPersistenceEl, deathAgeEl, phaseErrorWeightEl, minLengthE el.addEventListener('change', () => { if (stftCache) runExtraction(); }); } -function playAudioBuffer(buffer, statusMsg) { +function playAudioBuffer(buffer, statusMsg, timeOffset = 0) { const startTime = audioContext.currentTime; currentSource = audioContext.createBufferSource(); currentSource.buffer = buffer; @@ -402,7 +406,7 @@ function playAudioBuffer(buffer, statusMsg) { setStatus(statusMsg, 'info'); function tick() { if (!currentSource) return; - viewer.setPlayheadTime(audioContext.currentTime - startTime); + viewer.setPlayheadTime(timeOffset + audioContext.currentTime - startTime); requestAnimationFrame(tick); } tick(); @@ -526,7 +530,9 @@ document.addEventListener('keydown', (e) => { const partial = extractedPartials[sel]; if (!partial) return; stopAudio(); - playAudioBuffer(getAudioBuffer([partial], 0.05), `Playing partial #${sel}...`); + const tStart = Math.min(...partial.times); + const offset = Math.max(0, tStart - 0.05); + playAudioBuffer(getAudioBuffer([partial], 0.05), `Playing partial #${sel}...`, offset); } else if (e.code === 'KeyP') { e.preventDefault(); if (viewer) viewer.togglePeaks(); |
