From ec8616a51513229f06f77216d2c4bd771091980d Mon Sep 17 00:00:00 2001 From: Raphael Forment Date: Mon, 4 Sep 2023 04:56:45 +0200 Subject: [PATCH] Envelope filter and filter order --- packages/superdough/helpers.mjs | 14 ++++++++-- packages/superdough/superdough.mjs | 44 ++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index 07e2b121..9ce197e1 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -66,10 +66,18 @@ export const getADSR = (attack, decay, sustain, release, velocity, begin, end) = return gainNode; }; -export const getFilter = (type, frequency, Q) => { - const filter = getAudioContext().createBiquadFilter(); +export function createFilter(context, type, frequency, Q, curve, to, over, t) { + const filter = context.createBiquadFilter(); filter.type = type; filter.frequency.value = frequency; filter.Q.value = Q; + + if (to !== null && over !== null) { + if (curve === 'lin') { + filter.frequency.linearRampToValueAtTime(to, t + over); + } else { + filter.frequency.exponentialRampToValueAtTime(to, t + over); + } + } return filter; -}; +} diff --git a/packages/superdough/superdough.mjs b/packages/superdough/superdough.mjs index af22355f..cf3c231e 100644 --- a/packages/superdough/superdough.mjs +++ b/packages/superdough/superdough.mjs @@ -9,7 +9,7 @@ import './reverb.mjs'; import './vowel.mjs'; import { clamp } from './util.mjs'; import workletsUrl from './worklets.mjs?url'; -import { getFilter, gainNode } from './helpers.mjs'; +import { createFilter, gainNode } from './helpers.mjs'; import { map } from 'nanostores'; import { logger } from './logger.mjs'; @@ -177,6 +177,11 @@ export const superdough = async (value, deadline, hapDuration) => { bank, source, gain = 0.8, + // filters + order = 12, + to, + filtenv = 'lin', + over, // low pass cutoff, resonance = 1, @@ -239,11 +244,37 @@ export const superdough = async (value, deadline, hapDuration) => { // gain stage chain.push(gainNode(gain)); - // filters - cutoff !== undefined && chain.push(getFilter('lowpass', cutoff, resonance)); - hcutoff !== undefined && chain.push(getFilter('highpass', hcutoff, hresonance)); - bandf !== undefined && chain.push(getFilter('bandpass', bandf, bandq)); - vowel !== undefined && chain.push(ac.createVowelFilter(vowel)); + if (cutoff !== undefined) { + const filter1 = createFilter(ac, 'lowpass', cutoff, resonance, filtenv, to || cutoff, over || hapDuration, t); + chain.push(filter1); + if (order === 24) { + const filter2 = createFilter(ac, 'lowpass', cutoff, resonance, filtenv, to || cutoff, over || hapDuration, t); + chain.push(filter2); + } + } + + if (hcutoff !== undefined) { + const filter1 = createFilter(ac, 'highpass', hcutoff, hresonance, filtenv, to || hcutoff, over || hapDuration, t); + chain.push(filter1); + if (order === 24) { + const filter2 = createFilter(ac, 'highpass', hcutoff, hresonance, filtenv, to || hcutoff, over || hapDuration, t); + chain.push(filter2); + } + } + + if (bandf !== undefined) { + const filter1 = createFilter(ac, 'bandpass', bandf, bandq, filtenv, to || bandf, over || hapDuration, t); + chain.push(filter1); + if (order === 24) { + const filter2 = createFilter(ac, 'bandpass', bandf, bandq, filtenv, to || bandf, over || hapDuration, t); + chain.push(filter2); + } + } + + if (vowel !== undefined) { + const vowelFilter = ac.createVowelFilter(vowel); + chain.push(vowelFilter); + } // effects coarse !== undefined && chain.push(getWorklet(ac, 'coarse-processor', { coarse })); @@ -282,6 +313,7 @@ export const superdough = async (value, deadline, hapDuration) => { analyserSend = effectSend(post, analyserNode, analyze); } + console.log(chain); // connect chain elements together chain.slice(1).reduce((last, current) => last.connect(current), chain[0]);