From 36ff76f03a0d8874d2b4563e2291e487f04d6cb8 Mon Sep 17 00:00:00 2001 From: Aqua Date: Sat, 31 Oct 2026 20:42:06 +0000 Subject: [PATCH 1/4] Add thruster Faust patch with an rpm control Sustained heavy thruster: low rotor rumble, blade-chopped noise rasp, high-Q hull rattle modes, tanh clip. Compiled as Faust source through CompileSource; not a .aqua script and not indexed in library.yaml. Co-Authored-By: Claude Sonnet 5.5 --- patches/thruster/thruster.dsp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 patches/thruster/thruster.dsp diff --git a/patches/thruster/thruster.dsp b/patches/thruster/thruster.dsp new file mode 100644 index 0000000..58fbe6b --- /dev/null +++ b/patches/thruster/thruster.dsp @@ -0,0 +1,27 @@ +// thruster: sustained, heavy, brittle-hull thruster with an RPM control. +// Compile as Faust source (AquaSynthPatchCompiler.CompileSource); it is not a .aqua script. +// Control: rpm (300..6000). Rotor tone = 28 Hz + rpm*0.025 (about 36..180 Hz); three blades chop the rasp at 3x that. +declare name "thruster"; +import("stdfaust.lib"); + +rpm = hslider("rpm", 1200, 300, 6000, 1) : si.smooth(ba.tau2pole(0.2)); +load = (rpm - 300) / 5700; +shaft = 28 + rpm * 0.025; + +// effort: slow random wander of the shaft speed +wander = no.noise : fi.lowpass(2, 5) : *(0.35); +f0 = shaft * (1 + 0.04 * wander); + +// low rumble: saw at shaft speed plus a square a sub-octave down, low-passed +rumble = (os.sawtooth(f0) + 0.7 * os.square(f0 * 0.5)) : fi.lowpass(3, 60 + 2.5 * shaft); + +// blade pass: rasp noise chopped at 3x shaft, band tracks rpm +chop = 0.5 + 0.5 * os.osc(f0 * 3) ^ 2; +rasp = no.noise : fi.resonbp(700 + rpm * 0.6, 1.5, 1) : *(chop); + +// brittle hull: high-Q modes rattled by noise, louder with load +mode(f, q) = no.noise : fi.resonbp(f, q, 1); +rattle = (mode(173, 40) * (0.3 + 0.7 * load) + 0.8 * mode(311, 35) + 0.6 * mode(467, 30) + 0.4 * mode(1130, 25)) * (0.1 + 0.9 * load ^ 2) * 3; + +mix = rumble * (0.5 + 0.5 * load) + rasp * (0.3 + 0.6 * load) + rattle; +process = mix * (0.4 + 0.6 * load) : *(2.2) : ma.tanh : *(0.5); From e567b44c24e22f0d9d240e789fad01f7b32816fa Mon Sep 17 00:00:00 2001 From: Aqua Date: Sat, 31 Oct 2026 20:45:51 +0000 Subject: [PATCH 2/4] thruster: drive falls with load so tanh no longer pins the peak at high rpm Drive 2.2 -> max(0.1, 0.9 - load); rasp load weight 0.6 -> 1.5. rpm=4800 peak 0.500 -> 0.358. Co-Authored-By: Claude Sonnet 5.5 --- patches/thruster/thruster.dsp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/patches/thruster/thruster.dsp b/patches/thruster/thruster.dsp index 58fbe6b..b23d9b9 100644 --- a/patches/thruster/thruster.dsp +++ b/patches/thruster/thruster.dsp @@ -23,5 +23,6 @@ rasp = no.noise : fi.resonbp(700 + rpm * 0.6, 1.5, 1) : *(chop); mode(f, q) = no.noise : fi.resonbp(f, q, 1); rattle = (mode(173, 40) * (0.3 + 0.7 * load) + 0.8 * mode(311, 35) + 0.6 * mode(467, 30) + 0.4 * mode(1130, 25)) * (0.1 + 0.9 * load ^ 2) * 3; -mix = rumble * (0.5 + 0.5 * load) + rasp * (0.3 + 0.6 * load) + rattle; -process = mix * (0.4 + 0.6 * load) : *(2.2) : ma.tanh : *(0.5); +mix = rumble * (0.5 + 0.5 * load) + rasp * (0.3 + 1.5 * load) + rattle; +// drive falls with load so the tanh stage stays out of saturation at high rpm; rasp and hull modes carry the strain +process = mix * (0.4 + 0.6 * load) * max(0.1, 0.9 - 1.0 * load) : ma.tanh : *(0.5); From 882b7203f51d2ab6373ce2b594d5e53e81dc04e0 Mon Sep 17 00:00:00 2001 From: Aqua Date: Sat, 31 Oct 2026 20:48:55 +0000 Subject: [PATCH 3/4] thruster: lower hull-mode Q and soft-limit the rattle so high rpm is louder than low rpm Hull modes Q 40/35/30/25 -> 20/18/16/14; tanh on the rattle alone; drive floor 0.1 -> 0.35. Linux render, 48 kHz, 512-frame blocks: rpm 4800 steady RMS 0.1252 > rpm 600 0.0850; peaks 0.216/0.354/0.325. Co-Authored-By: Claude Sonnet 5.5 --- patches/thruster/thruster.dsp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/patches/thruster/thruster.dsp b/patches/thruster/thruster.dsp index b23d9b9..9cabb67 100644 --- a/patches/thruster/thruster.dsp +++ b/patches/thruster/thruster.dsp @@ -19,10 +19,10 @@ rumble = (os.sawtooth(f0) + 0.7 * os.square(f0 * 0.5)) : fi.lowpass(3, 60 + 2.5 chop = 0.5 + 0.5 * os.osc(f0 * 3) ^ 2; rasp = no.noise : fi.resonbp(700 + rpm * 0.6, 1.5, 1) : *(chop); -// brittle hull: high-Q modes rattled by noise, louder with load +// brittle hull: high-Q modes rattled by noise, louder with load; tanh on the rattle alone keeps ring-up spikes from setting the peak mode(f, q) = no.noise : fi.resonbp(f, q, 1); -rattle = (mode(173, 40) * (0.3 + 0.7 * load) + 0.8 * mode(311, 35) + 0.6 * mode(467, 30) + 0.4 * mode(1130, 25)) * (0.1 + 0.9 * load ^ 2) * 3; +rattle = (mode(173, 20) * (0.3 + 0.7 * load) + 0.8 * mode(311, 18) + 0.6 * mode(467, 16) + 0.4 * mode(1130, 14)) * (0.1 + 0.9 * load ^ 2) * 3 : *(4) : ma.tanh : /(4); mix = rumble * (0.5 + 0.5 * load) + rasp * (0.3 + 1.5 * load) + rattle; -// drive falls with load so the tanh stage stays out of saturation at high rpm; rasp and hull modes carry the strain -process = mix * (0.4 + 0.6 * load) * max(0.1, 0.9 - 1.0 * load) : ma.tanh : *(0.5); +// drive falls only gently with load so tanh stays out of saturation while high rpm still ends up louder than low rpm +process = mix * (0.4 + 0.6 * load) * max(0.35, 0.9 - 1.0 * load) : ma.tanh : *(0.5); From c6561da8d4290b80fcac9926e96384927b412c56 Mon Sep 17 00:00:00 2001 From: Aqua Date: Sat, 31 Oct 2026 20:54:51 +0000 Subject: [PATCH 4/4] thruster: v5 gain term 0.9-0.5*load plus 0.425 output trim Peak under 0.4 at rpm 600, rpm 4800 and the 600-4800 sweep. Co-Authored-By: Claude Sonnet 5.5 --- patches/thruster/thruster.dsp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/patches/thruster/thruster.dsp b/patches/thruster/thruster.dsp index 9cabb67..9260b6a 100644 --- a/patches/thruster/thruster.dsp +++ b/patches/thruster/thruster.dsp @@ -25,4 +25,5 @@ rattle = (mode(173, 20) * (0.3 + 0.7 * load) + 0.8 * mode(311, 18) + 0.6 * mode( mix = rumble * (0.5 + 0.5 * load) + rasp * (0.3 + 1.5 * load) + rattle; // drive falls only gently with load so tanh stays out of saturation while high rpm still ends up louder than low rpm -process = mix * (0.4 + 0.6 * load) * max(0.35, 0.9 - 1.0 * load) : ma.tanh : *(0.5); +// final 0.425 trim keeps peak under 0.4 at rpm 4800 +process = mix * (0.4 + 0.6 * load) * (0.9 - 0.5 * load) : ma.tanh : *(0.425);