only use fm envelope when needed

This commit is contained in:
Felix Roos 2023-08-31 04:13:41 +02:00
parent b1b084452c
commit ee0aaca2b0
2 changed files with 37 additions and 14 deletions

View File

@ -134,6 +134,13 @@ const generic_params = [
* *
*/ */
[['fmi', 'fmh'], 'fm'], [['fmi', 'fmh'], 'fm'],
// fm envelope
['fmenv'],
['fmattack'],
['fmdecay'],
['fmsustain'],
['fmrelease'],
['fmvelocity'],
/** /**
* Select the sound bank to use. To be used together with `s`. The bank name (+ "_") will be prepended to the value of `s`. * Select the sound bank to use. To be used together with `s`. The bank name (+ "_") will be prepended to the value of `s`.

View File

@ -26,7 +26,7 @@ export function registerSynthSounds() {
wave, wave,
(t, value, onended) => { (t, value, onended) => {
// destructure adsr here, because the default should be different for synths and samples // destructure adsr here, because the default should be different for synths and samples
const { let {
attack = 0.001, attack = 0.001,
decay = 0.05, decay = 0.05,
sustain = 0.6, sustain = 0.6,
@ -34,11 +34,11 @@ export function registerSynthSounds() {
fmh: fmHarmonicity = 1, fmh: fmHarmonicity = 1,
fmi: fmModulationIndex, fmi: fmModulationIndex,
fmenv: fmEnvelopeType = 'linear', fmenv: fmEnvelopeType = 'linear',
fmattack: fmAttack = 0.001, fmattack: fmAttack, // = 0.001,
fmdecay: fmDecay = 0.2, fmdecay: fmDecay, // = 0.2,
fmsustain: fmSustain = 0.001, fmsustain: fmSustain, // = 0.001,
fmrelease: fmRelease = 0.1, fmrelease: fmRelease, // = 0.1
fmvelocity: fmVelocity = 1, fmvelocity: fmVelocity, // = 1,
fmwave: fmWaveform = 'sine', fmwave: fmWaveform = 'sine',
} = value; } = value;
let { n, note, freq } = value; let { n, note, freq } = value;
@ -55,22 +55,37 @@ export function registerSynthSounds() {
// make oscillator // make oscillator
const { node: o, stop } = getOscillator({ t, s: wave, freq }); const { node: o, stop } = getOscillator({ t, s: wave, freq });
// FM + FM envelope
let stopFm, fmEnvelope; let stopFm, fmEnvelope;
if (fmModulationIndex) { if (fmModulationIndex) {
const { node: modulator, stop } = fm(o, fmHarmonicity, fmModulationIndex, fmWaveform); const { node: modulator, stop } = fm(o, fmHarmonicity, fmModulationIndex, fmWaveform);
fmEnvelope = getEnvelope(fmAttack, fmDecay, fmSustain, fmRelease, fmVelocity, t); if ([fmAttack, fmDecay, fmSustain, fmRelease, fmVelocity].find((v) => v !== undefined)) {
if (fmEnvelopeType === 'exp') { // no envelope by default
fmEnvelope = getExpEnvelope(fmAttack, fmDecay, fmVelocity, t); modulator.connect(o.frequency);
fmEnvelope.node.maxValue = fmModulationIndex * 2; } else {
fmEnvelope.node.minValue = 0.00001; fmAttack = fmAttack ?? 0.001;
fmDecay = fmDecay ?? 0.001;
fmSustain = fmSustain ?? 1;
fmRelease = fmRelease ?? 0.001;
fmVelocity = fmVelocity ?? 1;
fmEnvelope = getEnvelope(fmAttack, fmDecay, fmSustain, fmRelease, fmVelocity, t);
if (fmEnvelopeType === 'exp') {
fmEnvelope = getExpEnvelope(fmAttack, fmDecay, fmVelocity, t);
fmEnvelope.node.maxValue = fmModulationIndex * 2;
fmEnvelope.node.minValue = 0.00001;
}
modulator.connect(fmEnvelope.node);
fmEnvelope.node.connect(o.frequency);
} }
modulator.connect(fmEnvelope.node);
fmEnvelope.node.connect(o.frequency);
stopFm = stop; stopFm = stop;
} }
// turn down
const g = gainNode(0.3); const g = gainNode(0.3);
// envelope
// gain envelope
const { node: envelope, stop: releaseEnvelope } = getEnvelope(attack, decay, sustain, release, 1, t); const { node: envelope, stop: releaseEnvelope } = getEnvelope(attack, decay, sustain, release, 1, t);
o.onended = () => { o.onended = () => {
o.disconnect(); o.disconnect();
g.disconnect(); g.disconnect();
@ -80,6 +95,7 @@ export function registerSynthSounds() {
node: o.connect(g).connect(envelope), node: o.connect(g).connect(envelope),
stop: (releaseTime) => { stop: (releaseTime) => {
releaseEnvelope(releaseTime); releaseEnvelope(releaseTime);
fmEnvelope?.stop(releaseTime);
let end = releaseTime + release; let end = releaseTime + release;
stop(end); stop(end);
stopFm?.(end); stopFm?.(end);