[perf] fix connect leak when .noise() is in the mix
This commit is contained in:
parent
f6bb3869de
commit
bfa8fa3c75
3 changed files with 28 additions and 12 deletions
|
|
@ -262,7 +262,15 @@ export function drywet(dry, wet, wetAmount = 0) {
|
||||||
let mix = ac.createGain();
|
let mix = ac.createGain();
|
||||||
dry_gain.connect(mix);
|
dry_gain.connect(mix);
|
||||||
wet_gain.connect(mix);
|
wet_gain.connect(mix);
|
||||||
return mix;
|
return {
|
||||||
|
node: mix,
|
||||||
|
onended: () => {
|
||||||
|
dry_gain.disconnect(mix);
|
||||||
|
wet_gain.disconnect(mix);
|
||||||
|
dry.disconnect(dry_gain);
|
||||||
|
wet.disconnect(wet_gain);
|
||||||
|
},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
let curves = ['linear', 'exponential'];
|
let curves = ['linear', 'exponential'];
|
||||||
|
|
@ -297,6 +305,10 @@ export function getVibratoOscillator(param, value, t) {
|
||||||
gain.gain.value = vibmod * 100;
|
gain.gain.value = vibmod * 100;
|
||||||
vibratoOscillator.connect(gain);
|
vibratoOscillator.connect(gain);
|
||||||
gain.connect(param);
|
gain.connect(param);
|
||||||
|
vibratoOscillator.onended = () => {
|
||||||
|
gain.disconnect(param);
|
||||||
|
vibratoOscillator.disconnect(gain);
|
||||||
|
};
|
||||||
vibratoOscillator.start(t);
|
vibratoOscillator.start(t);
|
||||||
return vibratoOscillator;
|
return vibratoOscillator;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -65,8 +65,9 @@ export function getNoiseOscillator(type = 'white', t, density = 0.02) {
|
||||||
export function getNoiseMix(inputNode, wet, t) {
|
export function getNoiseMix(inputNode, wet, t) {
|
||||||
const noiseOscillator = getNoiseOscillator('pink', t);
|
const noiseOscillator = getNoiseOscillator('pink', t);
|
||||||
const noiseMix = drywet(inputNode, noiseOscillator.node, wet);
|
const noiseMix = drywet(inputNode, noiseOscillator.node, wet);
|
||||||
|
noiseOscillator.node.onended = () => noiseMix.onended();
|
||||||
return {
|
return {
|
||||||
node: noiseMix,
|
node: noiseMix.node,
|
||||||
stop: (time) => noiseOscillator?.stop(time),
|
stop: (time) => noiseOscillator?.stop(time),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,19 +47,17 @@ export function registerSynthSounds() {
|
||||||
[0.001, 0.05, 0.6, 0.01],
|
[0.001, 0.05, 0.6, 0.01],
|
||||||
);
|
);
|
||||||
|
|
||||||
let sound = getOscillator(s, t, value);
|
|
||||||
let { node: o, stop, triggerRelease } = sound;
|
|
||||||
|
|
||||||
// turn down
|
// turn down
|
||||||
const g = gainNode(0.3);
|
const g = gainNode(0.3);
|
||||||
|
|
||||||
const { duration } = value;
|
let sound = getOscillator(s, t, value, () => {
|
||||||
|
|
||||||
o.onended = () => {
|
|
||||||
o.disconnect();
|
|
||||||
g.disconnect();
|
g.disconnect();
|
||||||
onended();
|
onended();
|
||||||
};
|
});
|
||||||
|
|
||||||
|
let { node: o, stop, triggerRelease } = sound;
|
||||||
|
|
||||||
|
const { duration } = value;
|
||||||
|
|
||||||
const envGain = gainNode(1);
|
const envGain = gainNode(1);
|
||||||
let node = o.connect(g).connect(envGain);
|
let node = o.connect(g).connect(envGain);
|
||||||
|
|
@ -446,7 +444,7 @@ export function waveformN(partials, type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// expects one of waveforms as s
|
// expects one of waveforms as s
|
||||||
export function getOscillator(s, t, value) {
|
export function getOscillator(s, t, value, onended) {
|
||||||
let { n: partials, duration, noise = 0 } = value;
|
let { n: partials, duration, noise = 0 } = value;
|
||||||
let o;
|
let o;
|
||||||
// If no partials are given, use stock waveforms
|
// If no partials are given, use stock waveforms
|
||||||
|
|
@ -460,7 +458,6 @@ export function getOscillator(s, t, value) {
|
||||||
}
|
}
|
||||||
// set frequency
|
// set frequency
|
||||||
o.frequency.value = getFrequencyFromValue(value);
|
o.frequency.value = getFrequencyFromValue(value);
|
||||||
o.start(t);
|
|
||||||
|
|
||||||
let vibratoOscillator = getVibratoOscillator(o.detune, value, t);
|
let vibratoOscillator = getVibratoOscillator(o.detune, value, t);
|
||||||
|
|
||||||
|
|
@ -473,6 +470,12 @@ export function getOscillator(s, t, value) {
|
||||||
noiseMix = getNoiseMix(o, noise, t);
|
noiseMix = getNoiseMix(o, noise, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
o.onended = () => {
|
||||||
|
noiseMix?.node.disconnect();
|
||||||
|
onended();
|
||||||
|
};
|
||||||
|
o.start(t);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
node: noiseMix?.node || o,
|
node: noiseMix?.node || o,
|
||||||
stop: (time) => {
|
stop: (time) => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue