diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index b828645c..f58161b1 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -76,6 +76,7 @@ export function registerSynthSounds() { const holdend = begin + duration; const end = holdend + release + 0.01; + const voices = clamp(unison, 1, 100); let node = getWorklet( ac, @@ -85,13 +86,14 @@ export function registerSynthSounds() { begin, end, freqspread: detune * 0.1, - voices: clamp(unison, 0, 100), + voices, panspread: clamp(spread, 0, 1), }, { outputChannelCount: [2], }, ); + const gainAdjustment = 1 / Math.sqrt(voices); // console.log(node.parameters.get('frequency')); getPitchEnvelope(node.parameters.get('detune'), value, begin, holdend); getVibratoOscillator(node.parameters.get('detune'), value, begin); @@ -99,7 +101,7 @@ export function registerSynthSounds() { const envGain = gainNode(1); node = node.connect(envGain); - getParamADSR(node.gain, attack, decay, sustain, release, 0, 0.3, begin, holdend, 'linear'); + getParamADSR(node.gain, attack, decay, sustain, release, 0, 0.3 * gainAdjustment, begin, holdend, 'linear'); return { node, diff --git a/packages/superdough/worklets.mjs b/packages/superdough/worklets.mjs index ad47be37..01729951 100644 --- a/packages/superdough/worklets.mjs +++ b/packages/superdough/worklets.mjs @@ -230,7 +230,6 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { const freqspread = params.freqspread[0]; let panspread = params.panspread[0]; panspread = panspread * 0.5 + 0.5; - const gainAdjustment = 1; for (let n = 0; n < voices; n++) { let adj = 0; @@ -247,8 +246,8 @@ class SuperSawOscillatorProcessor extends AudioWorkletProcessor { this.phase[n] = this.phase[n] ?? Math.random(); const v = saw(this.phase[n], dt); - output[0][i] = (output[0][i] + v * (1 - balance)) * gainAdjustment; - output[1][i] = (output[1][i] + v * balance) * gainAdjustment; + output[0][i] = output[0][i] + v * (1 - balance); + output[1][i] = output[1][i] + v * balance; this.phase[n] += dt;