Use setvalueattime to pin values and prevent bleed

This commit is contained in:
Aria 2025-12-04 22:50:28 -06:00
parent d50af71ba1
commit 4c99f4866b
3 changed files with 16 additions and 13 deletions

View file

@ -137,11 +137,10 @@ export function getCompressor(ac, threshold, ratio, knee, attack, release) {
attack: attack ?? 0.005, attack: attack ?? 0.005,
release: release ?? 0.05, release: release ?? 0.05,
}; };
node.threshold.value = options.threshold; const now = ac.currentTime;
node.ratio.value = options.ratio; Object.entries(options).forEach(([key, value]) => {
node.knee.value = options.knee; node[key].setValueAtTime(value, now);
node.attack.value = options.attack; });
node.release.value = options.release;
return node; return node;
} }
@ -224,8 +223,10 @@ export function createFilter(context, start, end, params, cps, cycle) {
const factory = () => context.createBiquadFilter(); const factory = () => context.createBiquadFilter();
filter = getNodeFromPool('filter', factory); filter = getNodeFromPool('filter', factory);
filter.type = type; filter.type = type;
filter.Q.value = q; const now = context.currentTime;
filter.frequency.value = frequency; Object.entries({ Q: q, frequency }).forEach(([key, value]) => {
filter[key].setValueAtTime(value, now);
});
frequencyParam = filter.frequency; frequencyParam = filter.frequency;
} }
const envelopeValues = [params.attack, params.decay, params.sustain, params.release]; const envelopeValues = [params.attack, params.decay, params.sustain, params.release];

View file

@ -175,10 +175,11 @@ export function registerSynthSounds() {
}; };
const factory = () => new AudioWorkletNode(ac, 'supersaw-oscillator', { outputChannelCount: [2] }); const factory = () => new AudioWorkletNode(ac, 'supersaw-oscillator', { outputChannelCount: [2] });
const o = getNodeFromPool('supersaw', factory); const o = getNodeFromPool('supersaw', factory);
const now = ac.currentTime;
Object.entries(params).forEach(([key, value]) => { Object.entries(params).forEach(([key, value]) => {
if (value !== undefined) { const param = o.parameters.get(key);
o.parameters.get(key).value = value; const target = value !== undefined ? value : param.defaultValue;
} param.setValueAtTime(target, now);
}); });
o.port.postMessage({ type: 'initialize' }); o.port.postMessage({ type: 'initialize' });
o.port.onmessage = (e) => { o.port.onmessage = (e) => {

View file

@ -238,10 +238,11 @@ export async function onTriggerSynth(t, value, onended, tables, cps, frameLen) {
}; };
const factory = () => new AudioWorkletNode(ac, 'wavetable-oscillator-processor', { outputChannelCount: [2] }); const factory = () => new AudioWorkletNode(ac, 'wavetable-oscillator-processor', { outputChannelCount: [2] });
const source = getNodeFromPool('wavetable', factory); const source = getNodeFromPool('wavetable', factory);
const now = ac.currentTime;
Object.entries(params).forEach(([key, value]) => { Object.entries(params).forEach(([key, value]) => {
if (value !== undefined) { const param = source.parameters.get(key);
source.parameters.get(key).value = value; const target = value !== undefined ? value : param.defaultValue;
} param.setValueAtTime(target, now);
}); });
source.port.postMessage({ type: 'initialize', payload }); source.port.postMessage({ type: 'initialize', payload });
source.port.onmessage = (e) => { source.port.onmessage = (e) => {