function fmSynth() {
let carrier, mod1;
let attackTime = attack;
let releaseTime = release;
this.playNote = function (note) {
carrier = audioCtx.createOscillator();
mod1 = audioCtx.createOscillator();
carrier.frequency.value = getNoteFrequency(note);
mod1.frequency.value = mod1Freq + mod1FreqFine;
var mod1Gain = audioCtx.createGain();
mod1Gain.gain.value = mod1Depth;
let envelope = audioCtx.createGain();
envelope.gain.cancelScheduledValues(audioCtx.currentTime);
envelope.gain.setValueAtTime(0, audioCtx.currentTime);
envelope.gain.linearRampToValueAtTime(1, audioCtx.currentTime + attackTime);
envelope.gain.linearRampToValueAtTime(
0,
audioCtx.currentTime + attackTime + releaseTime
);
mod1.connect(mod1Gain);
mod1Gain.connect(carrier.detune);
carrier.connect(envelope);
envelope.connect(analyzer);
envelope.connect(masterGain);
mod1.start();
carrier.start();
mod1.stop(audioCtx.currentTime + attackTime + releaseTime);
carrier.stop(audioCtx.currentTime + attackTime + releaseTime);
};
}