From 6bcf8b91cc60ecc157f4afdbf06db97f693c577b Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 31 Aug 2023 04:22:54 +0200 Subject: [PATCH] fix: getExpEnvelope full adsr --- packages/superdough/helpers.mjs | 7 ++++--- packages/superdough/synth.mjs | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index e07f0d7d..eb05c4cb 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -39,15 +39,16 @@ export const getEnvelope = (attack, decay, sustain, release, velocity, begin) => }; }; -export const getExpEnvelope = (attack, decay, velocity, begin) => { +export const getExpEnvelope = (attack, decay, sustain, release, velocity, begin) => { const gainNode = getAudioContext().createGain(); gainNode.gain.setValueAtTime(0.0001, begin); gainNode.gain.exponentialRampToValueAtTime(velocity, begin + attack); - gainNode.gain.exponentialRampToValueAtTime(0.0001, begin + attack + decay); + gainNode.gain.exponentialRampToValueAtTime(sustain * velocity, begin + attack + decay); return { node: gainNode, stop: (t) => { - gainNode.gain.exponentialRampToValueAtTime(0.0001, t + decay); + // similar to getEnvelope, this will glitch if sustain level has not been reached + gainNode.gain.exponentialRampToValueAtTime(0.0001, t + release); }, }; }; diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 6095d881..1e9ea114 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -70,7 +70,7 @@ export function registerSynthSounds() { fmVelocity = fmVelocity ?? 1; fmEnvelope = getEnvelope(fmAttack, fmDecay, fmSustain, fmRelease, fmVelocity, t); if (fmEnvelopeType === 'exp') { - fmEnvelope = getExpEnvelope(fmAttack, fmDecay, fmVelocity, t); + fmEnvelope = getExpEnvelope(fmAttack, fmDecay, fmSustain, fmRelease, fmVelocity, t); fmEnvelope.node.maxValue = fmModulationIndex * 2; fmEnvelope.node.minValue = 0.00001; }