From 82c90471954d41f90d39c3b4c108a4ee0f24c766 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Thu, 18 Sep 2025 10:47:23 +0200 Subject: [PATCH 1/7] 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 1cb9241a..ea572224 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/7] 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 ea572224..7231792c 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); From c64aa3bf01b1af8a01f26064ce9a4542fe1ffcd4 Mon Sep 17 00:00:00 2001 From: Kissaki Date: Sun, 21 Sep 2025 18:27:05 +0200 Subject: [PATCH 3/7] Fix link syntax in `project-start` --- website/src/pages/technical-manual/project-start.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/pages/technical-manual/project-start.mdx b/website/src/pages/technical-manual/project-start.mdx index 4e6e3763..d5612736 100644 --- a/website/src/pages/technical-manual/project-start.mdx +++ b/website/src/pages/technical-manual/project-start.mdx @@ -118,7 +118,7 @@ If you'd rather use your own UI, you can use the `@strudel/web` package: ``` -For more info on this package, see the [@strudel/web README]https://codeberg.org/uzu/strudel/src/branch/main/packages/web#strudel-web). +For more info on this package, see the [@strudel/web README](https://codeberg.org/uzu/strudel/src/branch/main/packages/web#strudel-web). ## Via npm From 4d39f36868c4240f242443e5492861820c24288a Mon Sep 17 00:00:00 2001 From: Kissaki Date: Sun, 21 Sep 2025 18:31:59 +0200 Subject: [PATCH 4/7] Fix web README sample code Looks like the code was copied, and then the wrong string was replaced when creating this code sample. --- packages/web/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/README.md b/packages/web/README.md index 659c8271..e86600cd 100644 --- a/packages/web/README.md +++ b/packages/web/README.md @@ -62,7 +62,7 @@ initStrudel(); document.getElementById('play').addEventListener('click', () => evaluate('note("c a f e").jux(rev)') ); -document.getElementById('play').addEventListener('stop', +document.getElementById('stop').addEventListener('click', () => hush() ); ``` From 3e7ae880430a547f6fa70ae88b392966d02d71c6 Mon Sep 17 00:00:00 2001 From: drhayes Date: Mon, 10 Nov 2025 17:02:55 +0100 Subject: [PATCH 5/7] Fix typo: 'studel' -> 'strudel' --- website/src/pages/technical-manual/project-start.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/pages/technical-manual/project-start.mdx b/website/src/pages/technical-manual/project-start.mdx index 4a269d1b..b9a4ab0e 100644 --- a/website/src/pages/technical-manual/project-start.mdx +++ b/website/src/pages/technical-manual/project-start.mdx @@ -32,7 +32,7 @@ There are 3 quick ways to embed strudel in your website: ### Inside an iframe -Using an iframe is the most easy way to embed a studel tune. +Using an iframe is the most easy way to embed a strudel tune. You can embed any pattern of your choice via an iframe and the URL of the pattern of your choice: ```html From 3e05525dc29666e9fc5222790dbe825f03a6b5b4 Mon Sep 17 00:00:00 2001 From: jeromew Date: Fri, 14 Nov 2025 22:06:39 +0000 Subject: [PATCH 6/7] [perf] disconnect `send` effect AudioNode when `room` is used --- packages/superdough/superdough.mjs | 3 ++- packages/superdough/superdoughoutput.mjs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index b59e3ae0..16ae3cec 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -708,7 +708,8 @@ export const superdough = async (value, t, hapDuration, cps = 0.5, cycle = 0.5) roomIR = await loadBuffer(url, ac, ir, 0); } orbitBus.getReverb(roomsize, roomfade, roomlp, roomdim, roomIR, irspeed, irbegin); - orbitBus.sendReverb(post, room); + const send = orbitBus.sendReverb(post, room); + audioNodes.push(send); } if (djf != null) { diff --git a/packages/superdough/superdoughoutput.mjs b/packages/superdough/superdoughoutput.mjs index afe91e71..a4235efd 100644 --- a/packages/superdough/superdoughoutput.mjs +++ b/packages/superdough/superdoughoutput.mjs @@ -78,7 +78,7 @@ export class Orbit { return this.reverbNode; } sendReverb(node, amount) { - effectSend(node, this.reverbNode, amount); + return effectSend(node, this.reverbNode, amount); } sendDelay(node, amount) { From 92d87093e0b0a322801238f9d10ebe2a448af678 Mon Sep 17 00:00:00 2001 From: jeromew Date: Sat, 15 Nov 2025 13:39:24 +0000 Subject: [PATCH 7/7] [perf] disconnect Offline AudioNode connections in generateReverb --- packages/superdough/reverbGen.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/superdough/reverbGen.mjs b/packages/superdough/reverbGen.mjs index d2533cae..bb050874 100644 --- a/packages/superdough/reverbGen.mjs +++ b/packages/superdough/reverbGen.mjs @@ -104,6 +104,8 @@ var applyGradualLowpass = function (input, lpFreqStart, lpFreqEnd, lpFreqEndAt, player.start(); context.oncomplete = function (event) { callback(event.renderedBuffer); + filter.disconnect(); + player.disconnect(); }; context.startRendering();