From 5ed28d6168b8d323ed64efa049c0feb285d73678 Mon Sep 17 00:00:00 2001 From: "Jade (Rose) Rowland" Date: Mon, 31 Mar 2025 00:17:26 -0400 Subject: [PATCH] gain curve func --- packages/superdough/helpers.mjs | 4 ++-- packages/superdough/superdough.mjs | 24 ++++++++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index e51156fe..2ad1567c 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -1,9 +1,9 @@ -import { getAudioContext } from './superdough.mjs'; +import { getAudioContext } from './superdough.mjs'; import { clamp, nanFallback } from './util.mjs'; export function gainNode(value) { const node = getAudioContext().createGain(); - node.gain.value = value; + node.gain.value = value return node; } diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index fc81f565..a9372ca1 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -20,6 +20,16 @@ export function registerSound(key, onTrigger, data = {}) { soundMap.setKey(key.toLowerCase(), { onTrigger, data }); } +let gainCurveFunc = (val) => Math.pow(val,2) + +export function applyGainCurve(val) { + return gainCurveFunc(val) +} + +export function setGainCurve(newGainCurveFunc) { + gainCurveFunc = newGainCurveFunc +} + function aliasBankMap(aliasMap) { // Make all bank keys lower case for case insensitivity for (const key in aliasMap) { @@ -87,7 +97,7 @@ export function getSound(s) { const defaultDefaultValues = { s: 'triangle', - gain: 0.8, + gain: 1, postgain: 1, density: '.03', ftype: '12db', @@ -471,12 +481,17 @@ export const superdough = async (value, t, hapDuration) => { compressorRelease, } = value; - gain = nanFallback(gain, 1); + gain = applyGainCurve(nanFallback(gain, 1)); + postgain = applyGainCurve(postgain) + shapevol = applyGainCurve(shapevol) + distortvol = applyGainCurve(distortvol) + delay = applyGainCurve(delay) + velocity = applyGainCurve(velocity) + //music programs/audio gear usually increments inputs/outputs from 1, so imitate that behavior channels = (Array.isArray(channels) ? channels : [channels]).map((ch) => ch - 1); - gain *= velocity; // velocity currently only multiplies with gain. it might do other things in the future let toDisconnect = []; // audio nodes that will be disconnected when the source has ended const onended = () => { toDisconnect.forEach((n) => n?.disconnect()); @@ -516,6 +531,7 @@ export const superdough = async (value, t, hapDuration) => { // gain stage chain.push(gainNode(gain)); + chain.push(gainNode(.8 * velocity)) //filter const ftype = getFilterType(value.ftype); @@ -616,7 +632,7 @@ export const superdough = async (value, t, hapDuration) => { } // last gain - const post = new GainNode(ac, { gain: postgain }); + const post = new GainNode(ac, { gain:postgain }); chain.push(post); connectToDestination(post, channels);