New technique using ADSR envelope

This commit is contained in:
Raphael Forment 2023-09-04 21:17:16 +02:00
parent ec8616a515
commit 5be7898522
2 changed files with 72 additions and 20 deletions

View file

@ -66,18 +66,20 @@ export const getADSR = (attack, decay, sustain, release, velocity, begin, end) =
return gainNode; return gainNode;
}; };
export function createFilter(context, type, frequency, Q, curve, to, over, t) { export function createFilter(context, type, frequency, Q, attack, decay, sustain, release, fenvmod, t) {
const filter = context.createBiquadFilter(); const filter = context.createBiquadFilter();
filter.type = type; filter.type = type;
filter.frequency.value = frequency; filter.frequency.value = frequency;
filter.Q.value = Q; filter.Q.value = Q;
if (to !== null && over !== null) { // Apply ADSR to filter frequency
if (curve === 'lin') { if (fenvmod > 0) {
filter.frequency.linearRampToValueAtTime(to, t + over); const sustainFreq = sustain * frequency;
} else { filter.frequency.linearRampToValueAtTime(frequency * fenvmod, t + attack);
filter.frequency.exponentialRampToValueAtTime(to, t + over); filter.frequency.linearRampToValueAtTime(sustainFreq, t + attack + decay);
} filter.frequency.setValueAtTime(sustainFreq, end);
filter.frequency.linearRampToValueAtTime(frequency, end + release);
} }
return filter; return filter;
} }

View file

@ -178,18 +178,32 @@ export const superdough = async (value, deadline, hapDuration) => {
source, source,
gain = 0.8, gain = 0.8,
// filters // filters
order = 12, order = '12db',
to, fenvmod = 2,
filtenv = 'lin',
over,
// low pass // low pass
lpattack,
lpdecay,
lpsustain,
lprelease,
cutoff, cutoff,
resonance = 1, resonance = 1,
// high pass // high pass
hpattack,
hpdecay,
hpsustain,
hprelease,
hcutoff, hcutoff,
hresonance = 1, hresonance = 1,
// full adsr for filter
lpadsr,
hpadsr,
bpadsr,
// band pass // band pass
bandf, bandf,
bpattack,
bpdecay,
bpsustain,
bprelease,
bandq = 1, bandq = 1,
// //
coarse, coarse,
@ -215,6 +229,9 @@ export const superdough = async (value, deadline, hapDuration) => {
if (bank && s) { if (bank && s) {
s = `${bank}_${s}`; s = `${bank}_${s}`;
} }
lpadsr && (lpattack = lpadsr[0]) && (lpdecay = lpadsr[1]) && (lpsustain = lpadsr[2]) && (lprelease = lpadsr[3]);
bpadsr && (bpattack = bpadsr[0]) && (bpdecay = bpadsr[1]) && (bpsustain = bpadsr[2]) && (bprelease = bpadsr[3]);
hpadsr && (hpattack = hpadsr[0]) && (hpdecay = hpadsr[1]) && (hpsustain = hpadsr[2]) && (hprelease = hpadsr[3]);
// get source AudioNode // get source AudioNode
let sourceNode; let sourceNode;
if (source) { if (source) {
@ -245,28 +262,61 @@ export const superdough = async (value, deadline, hapDuration) => {
chain.push(gainNode(gain)); chain.push(gainNode(gain));
if (cutoff !== undefined) { if (cutoff !== undefined) {
const filter1 = createFilter(ac, 'lowpass', cutoff, resonance, filtenv, to || cutoff, over || hapDuration, t); const filter1 = createFilter(ac, 'lowpass', cutoff, resonance, lpattack, lpdecay, lpsustain, lprelease, fmodenv, t);
chain.push(filter1); chain.push(filter1);
if (order === 24) { if (order === '24db') {
const filter2 = createFilter(ac, 'lowpass', cutoff, resonance, filtenv, to || cutoff, over || hapDuration, t); const filter2 = createFilter(
ac,
'lowpass',
cutoff,
resonance,
lpattack,
lpdecay,
lpsustain,
lprelease,
fmodenv,
t,
);
chain.push(filter2); chain.push(filter2);
} }
} }
if (hcutoff !== undefined) { if (hcutoff !== undefined) {
const filter1 = createFilter(ac, 'highpass', hcutoff, hresonance, filtenv, to || hcutoff, over || hapDuration, t); const filter1 = createFilter(
ac,
'highpass',
hcutoff,
hresonance,
hpattack,
hpdecay,
hpsustain,
hprelease,
fenvmod,
t,
);
chain.push(filter1); chain.push(filter1);
if (order === 24) { if (order === '24db') {
const filter2 = createFilter(ac, 'highpass', hcutoff, hresonance, filtenv, to || hcutoff, over || hapDuration, t); const filter2 = createFilter(
ac,
'highpass',
hcutoff,
hresonance,
hpattack,
hpdecay,
hpsustain,
hprelease,
fenvmod,
t,
);
chain.push(filter2); chain.push(filter2);
} }
} }
if (bandf !== undefined) { if (bandf !== undefined) {
const filter1 = createFilter(ac, 'bandpass', bandf, bandq, filtenv, to || bandf, over || hapDuration, t); const filter1 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenvmod, t);
chain.push(filter1); chain.push(filter1);
if (order === 24) { if (order === '24db') {
const filter2 = createFilter(ac, 'bandpass', bandf, bandq, filtenv, to || bandf, over || hapDuration, t); const filter2 = createFilter(ac, 'bandpass', bandf, bandq, bpattack, bpdecay, bpsustain, bprelease, fenvmod, t);
chain.push(filter2); chain.push(filter2);
} }
} }