From 82c90471954d41f90d39c3b4c108a4ee0f24c766 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 18 Sep 2025 10:47:23 +0200 Subject: [PATCH 1/2] fix: unstable filter --- packages/supradough/dough.mjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/supradough/dough.mjs b/packages/supradough/dough.mjs index 1cb9241ad..ea572224b 100644 --- a/packages/supradough/dough.mjs +++ b/packages/supradough/dough.mjs @@ -1,5 +1,5 @@ // this is dough, the superdough without dependencies -// @ts-check +// @ts-nocheck // @ts-ignore ignore next line because sampleRate is unknown const SAMPLE_RATE = typeof sampleRate !== 'undefined' ? sampleRate : 48000; const PI_DIV_SR = Math.PI / SAMPLE_RATE; @@ -151,7 +151,8 @@ export class TwoPoleFilter { resonance = Math.max(resonance, 0); cutoff = Math.min(cutoff, 20000); - const c = 2 * Math.sin(cutoff * PI_DIV_SR); + let c = 2 * Math.sin(cutoff * PI_DIV_SR); + c = clamp(c, 0, 1.14); // this line prevents instability TODO: test const r = Math.pow(0.5, (resonance + 0.125) / 0.125); const mrc = 1 - r * c; From a0c2edad30485e27fdbc787d6a58588724ad63a8 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 18 Sep 2025 10:54:41 +0200 Subject: [PATCH 2/2] fix: add clamp function --- packages/supradough/dough.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/supradough/dough.mjs b/packages/supradough/dough.mjs index ea572224b..7231792c9 100644 --- a/packages/supradough/dough.mjs +++ b/packages/supradough/dough.mjs @@ -6,6 +6,7 @@ const PI_DIV_SR = Math.PI / SAMPLE_RATE; const ISR = 1 / SAMPLE_RATE; let gainCurveFunc = (val) => Math.pow(val, 2); +const clamp = (num, min, max) => Math.min(Math.max(num, min), max); function applyGainCurve(val) { return gainCurveFunc(val);