mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-26 21:18:49 +00:00
fix: cut glitches due to envelope release trouble
This commit is contained in:
parent
7b529a30f4
commit
8a22c5627a
@ -27,12 +27,15 @@ export const getEnvelope = (attack, decay, sustain, release, velocity, begin) =>
|
|||||||
return {
|
return {
|
||||||
node: gainNode,
|
node: gainNode,
|
||||||
stop: (t) => {
|
stop: (t) => {
|
||||||
gainNode.gain.setValueAtTime(sustain * velocity, t);
|
if (typeof gainNode.gain.cancelAndHoldAtTime === 'function') {
|
||||||
|
gainNode.gain.cancelAndHoldAtTime(t);
|
||||||
|
} else {
|
||||||
|
// firefox: this will glitch when the sustain has not been reached yet at the time of release
|
||||||
|
gainNode.gain.setValueAtTime(sustain * velocity, t);
|
||||||
|
}
|
||||||
gainNode.gain.linearRampToValueAtTime(0, t + release);
|
gainNode.gain.linearRampToValueAtTime(0, t + release);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
// gainNode.gain.linearRampToValueAtTime(0, end + release); // release
|
|
||||||
// return gainNode;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getADSR = (attack, decay, sustain, release, velocity, begin, end) => {
|
export const getADSR = (attack, decay, sustain, release, velocity, begin, end) => {
|
||||||
|
|||||||
@ -223,9 +223,12 @@ export async function onTriggerSample(t, value, onended, bank) {
|
|||||||
}*/
|
}*/
|
||||||
const { node: envelope, stop: releaseEnvelope } = getEnvelope(attack, decay, sustain, release, 1, t);
|
const { node: envelope, stop: releaseEnvelope } = getEnvelope(attack, decay, sustain, release, 1, t);
|
||||||
bufferSource.connect(envelope);
|
bufferSource.connect(envelope);
|
||||||
|
const out = ac.createGain(); // we need a separate gain for the cutgroups because firefox...
|
||||||
|
envelope.connect(out);
|
||||||
bufferSource.onended = function () {
|
bufferSource.onended = function () {
|
||||||
bufferSource.disconnect();
|
bufferSource.disconnect();
|
||||||
envelope.disconnect();
|
envelope.disconnect();
|
||||||
|
out.disconnect();
|
||||||
onended();
|
onended();
|
||||||
};
|
};
|
||||||
const stop = (endTime, playWholeBuffer = !clip) => {
|
const stop = (endTime, playWholeBuffer = !clip) => {
|
||||||
@ -236,15 +239,14 @@ export async function onTriggerSample(t, value, onended, bank) {
|
|||||||
bufferSource.stop(releaseTime + release);
|
bufferSource.stop(releaseTime + release);
|
||||||
releaseEnvelope(releaseTime);
|
releaseEnvelope(releaseTime);
|
||||||
};
|
};
|
||||||
const handle = { node: envelope, bufferSource, stop };
|
const handle = { node: out, bufferSource, stop };
|
||||||
|
|
||||||
// cut groups
|
// cut groups
|
||||||
// TODO: sometimes, the cutting won't work for very fast triggering...
|
|
||||||
// it worked before :-/
|
|
||||||
if (cut !== undefined) {
|
if (cut !== undefined) {
|
||||||
const prev = cutGroups[cut];
|
const prev = cutGroups[cut];
|
||||||
if (prev) {
|
if (prev) {
|
||||||
prev.stop(time, false);
|
prev.node.gain.setValueAtTime(1, time);
|
||||||
|
prev.node.gain.linearRampToValueAtTime(0, time + 0.01);
|
||||||
}
|
}
|
||||||
cutGroups[cut] = handle;
|
cutGroups[cut] = handle;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user