From db5c023acd237d7015933bd21a5a6dbe5755841d Mon Sep 17 00:00:00 2001 From: skal Date: Thu, 19 Feb 2026 00:00:06 +0100 Subject: fix(mq_editor): fuse spread_above/below into single spread param Asymmetric spread offset the pitch center. Replace with a single symmetric `spread` in harmonics config. autodetectSpread now returns max(above, below). Update all defaults, UI, comments, and README. handoff(Gemini): spread is now a single param; no compat shims. Co-Authored-By: Claude Sonnet 4.6 --- tools/mq_editor/mq_synth.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'tools/mq_editor/mq_synth.js') diff --git a/tools/mq_editor/mq_synth.js b/tools/mq_editor/mq_synth.js index e5f7e1a..eeb3b00 100644 --- a/tools/mq_editor/mq_synth.js +++ b/tools/mq_editor/mq_synth.js @@ -26,7 +26,7 @@ function buildHarmonics(harmonics) { // Synthesize audio from MQ partials // partials: array of {freqCurve (with a0-a3 for amp), harmonics?, resonator?} -// harmonics: {decay, freq_mult, jitter, spread_above, spread_below} +// harmonics: {decay, freq_mult, jitter, spread} // resonator: {enabled, r, gainComp} — two-pole resonator mode per partial // integratePhase: true = accumulate 2π*f/SR per sample (correct for varying freq) // false = 2π*f*t (simpler, only correct for constant freq) @@ -37,11 +37,10 @@ function synthesizeMQ(partials, sampleRate, duration, integratePhase = true, opt const pcm = new Float32Array(numSamples); const defaultHarmonics = { - decay: 0.0, - freq_mult: 1.0, - jitter: 0.05, - spread_above: 0.02, - spread_below: 0.02 + decay: 0.0, + freq_mult: 1.0, + jitter: 0.05, + spread: 0.02 }; // Pre-build per-partial configs with fixed spread/jitter and phase accumulators @@ -78,17 +77,16 @@ function synthesizeMQ(partials, sampleRate, duration, integratePhase = true, opt } else { // --- Sinusoidal (harmonic) mode --- const harm = partial.harmonics || defaultHarmonics; - const spread_above = harm.spread_above ?? 0.0; - const spread_below = harm.spread_below ?? 0.0; - const jitter = harm.jitter ?? 0.0; + const spread = harm.spread ?? 0.0; + const jitter = harm.jitter ?? 0.0; const harmonicList = buildHarmonics(harm); const replicaData = []; for (let h = 0; h < harmonicList.length; ++h) { const hc = harmonicList[h]; - const spread = randFloat(p * 67890 + h * 999, -spread_below, spread_above); + const spreadVal = randFloat(p * 67890 + h * 999, -spread, spread); const initPhase = randFloat(p * 67890 + h, 0.0, 1.0) * jitter * 2.0 * Math.PI; - replicaData.push({ ratio: hc.ratio, ampMult: hc.ampMult, spread, phase: initPhase }); + replicaData.push({ ratio: hc.ratio, ampMult: hc.ampMult, spread: spreadVal, phase: initPhase }); } configs.push({ mode: 'sinusoid', fc, replicaData }); } -- cgit v1.2.3