From 0df20ca5bfb98cf4871cf40fb242e72fc1f3b2f5 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Fri, 27 Jun 2025 16:12:00 -0400 Subject: [PATCH] gainlin --- packages/core/controls.mjs | 12 ++++ packages/superdough/superdough.mjs | 6 +- test/__snapshots__/examples.test.mjs.snap | 69 +++++++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 3a7faf081..632d556e2 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -160,6 +160,18 @@ export const { velocity } = registerControl('velocity'); * */ export const { gain } = registerControl('gain'); + +/** + * Applies a linear gain adjustment + * + * @name gainlinear + * @synonyms gainlin + * @param {number | Pattern} amount gainl. + * @example + * s("hh*8").gainlin(".4!2 1 .4!2 1 .4 1").fast(2) + * + */ +export const { gainlinear, gainlin } = registerControl('gainlinear', 'gainlin'); /** * Gain applied after all effects have been processed. * diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index 887fb6437..926821b83 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -35,7 +35,7 @@ export function registerSound(key, onTrigger, data = {}) { soundMap.setKey(key, { onTrigger, data }); } -let gainCurveFunc = (val) => val; +let gainCurveFunc = (val) => Math.pow(val, 2); export function applyGainCurve(val) { return gainCurveFunc(val); @@ -482,6 +482,7 @@ export const superdough = async (value, t, hapDuration, cps) => { bank, source, gain = getDefaultValue('gain'), + gainlinear, postgain = getDefaultValue('postgain'), density = getDefaultValue('density'), // filters @@ -559,6 +560,9 @@ export const superdough = async (value, t, hapDuration, cps) => { delay = applyGainCurve(delay); velocity = applyGainCurve(velocity); gain *= velocity; // velocity currently only multiplies with gain. it might do other things in the future + if (gainlinear != null) { + gain *= gainlinear; + } const chainID = Math.round(Math.random() * 1000000); diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index f3607cb48..fc4510b8f 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -3872,6 +3872,75 @@ exports[`runs examples > example "gain" example index 0 1`] = ` ] `; +exports[`runs examples > example "gainlinear" example index 0 1`] = ` +[ + "[ 0/1 → 1/16 | s:hh gainlinear:0.4 ]", + "[ 1/16 → 1/8 | s:hh gainlinear:0.4 ]", + "[ 1/8 → 3/16 | s:hh gainlinear:1 ]", + "[ 3/16 → 1/4 | s:hh gainlinear:0.4 ]", + "[ 1/4 → 5/16 | s:hh gainlinear:0.4 ]", + "[ 5/16 → 3/8 | s:hh gainlinear:1 ]", + "[ 3/8 → 7/16 | s:hh gainlinear:0.4 ]", + "[ 7/16 → 1/2 | s:hh gainlinear:1 ]", + "[ 1/2 → 9/16 | s:hh gainlinear:0.4 ]", + "[ 9/16 → 5/8 | s:hh gainlinear:0.4 ]", + "[ 5/8 → 11/16 | s:hh gainlinear:1 ]", + "[ 11/16 → 3/4 | s:hh gainlinear:0.4 ]", + "[ 3/4 → 13/16 | s:hh gainlinear:0.4 ]", + "[ 13/16 → 7/8 | s:hh gainlinear:1 ]", + "[ 7/8 → 15/16 | s:hh gainlinear:0.4 ]", + "[ 15/16 → 1/1 | s:hh gainlinear:1 ]", + "[ 1/1 → 17/16 | s:hh gainlinear:0.4 ]", + "[ 17/16 → 9/8 | s:hh gainlinear:0.4 ]", + "[ 9/8 → 19/16 | s:hh gainlinear:1 ]", + "[ 19/16 → 5/4 | s:hh gainlinear:0.4 ]", + "[ 5/4 → 21/16 | s:hh gainlinear:0.4 ]", + "[ 21/16 → 11/8 | s:hh gainlinear:1 ]", + "[ 11/8 → 23/16 | s:hh gainlinear:0.4 ]", + "[ 23/16 → 3/2 | s:hh gainlinear:1 ]", + "[ 3/2 → 25/16 | s:hh gainlinear:0.4 ]", + "[ 25/16 → 13/8 | s:hh gainlinear:0.4 ]", + "[ 13/8 → 27/16 | s:hh gainlinear:1 ]", + "[ 27/16 → 7/4 | s:hh gainlinear:0.4 ]", + "[ 7/4 → 29/16 | s:hh gainlinear:0.4 ]", + "[ 29/16 → 15/8 | s:hh gainlinear:1 ]", + "[ 15/8 → 31/16 | s:hh gainlinear:0.4 ]", + "[ 31/16 → 2/1 | s:hh gainlinear:1 ]", + "[ 2/1 → 33/16 | s:hh gainlinear:0.4 ]", + "[ 33/16 → 17/8 | s:hh gainlinear:0.4 ]", + "[ 17/8 → 35/16 | s:hh gainlinear:1 ]", + "[ 35/16 → 9/4 | s:hh gainlinear:0.4 ]", + "[ 9/4 → 37/16 | s:hh gainlinear:0.4 ]", + "[ 37/16 → 19/8 | s:hh gainlinear:1 ]", + "[ 19/8 → 39/16 | s:hh gainlinear:0.4 ]", + "[ 39/16 → 5/2 | s:hh gainlinear:1 ]", + "[ 5/2 → 41/16 | s:hh gainlinear:0.4 ]", + "[ 41/16 → 21/8 | s:hh gainlinear:0.4 ]", + "[ 21/8 → 43/16 | s:hh gainlinear:1 ]", + "[ 43/16 → 11/4 | s:hh gainlinear:0.4 ]", + "[ 11/4 → 45/16 | s:hh gainlinear:0.4 ]", + "[ 45/16 → 23/8 | s:hh gainlinear:1 ]", + "[ 23/8 → 47/16 | s:hh gainlinear:0.4 ]", + "[ 47/16 → 3/1 | s:hh gainlinear:1 ]", + "[ 3/1 → 49/16 | s:hh gainlinear:0.4 ]", + "[ 49/16 → 25/8 | s:hh gainlinear:0.4 ]", + "[ 25/8 → 51/16 | s:hh gainlinear:1 ]", + "[ 51/16 → 13/4 | s:hh gainlinear:0.4 ]", + "[ 13/4 → 53/16 | s:hh gainlinear:0.4 ]", + "[ 53/16 → 27/8 | s:hh gainlinear:1 ]", + "[ 27/8 → 55/16 | s:hh gainlinear:0.4 ]", + "[ 55/16 → 7/2 | s:hh gainlinear:1 ]", + "[ 7/2 → 57/16 | s:hh gainlinear:0.4 ]", + "[ 57/16 → 29/8 | s:hh gainlinear:0.4 ]", + "[ 29/8 → 59/16 | s:hh gainlinear:1 ]", + "[ 59/16 → 15/4 | s:hh gainlinear:0.4 ]", + "[ 15/4 → 61/16 | s:hh gainlinear:0.4 ]", + "[ 61/16 → 31/8 | s:hh gainlinear:1 ]", + "[ 31/8 → 63/16 | s:hh gainlinear:0.4 ]", + "[ 63/16 → 4/1 | s:hh gainlinear:1 ]", +] +`; + exports[`runs examples > example "gap" example index 0 1`] = `[]`; exports[`runs examples > example "grow" example index 0 1`] = `