diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index 3e511641..3ba03489 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -21,53 +21,55 @@ const fm = (osc, harmonicityRatio, modulationIndex, wave = 'sine') => { return mod(modfreq, modgain, wave); }; -const waveforms = ['sine', 'square', 'triangle', 'sawtooth']; +const waveforms = ['triangle', 'square', 'sawtooth', 'sine']; const noises = ['pink', 'white', 'brown', 'crackle']; export function registerSynthSounds() { - registerSound('bet', (begin, value, onended) => { - const ac = getAudioContext(); - let { note, freq, duration } = value; - note = note || 36; - if (typeof note === 'string') { - note = noteToMidi(note); // e.g. c3 => 48 - } - // get frequency - if (!freq && typeof note === 'number') { - freq = midiToFreq(note); // + 48); - } + [...waveforms].forEach((s, i) => { + registerSound(s, (begin, value, onended) => { + const ac = getAudioContext(); + let { note, freq, duration } = value; + note = note || 36; + if (typeof note === 'string') { + note = noteToMidi(note); // e.g. c3 => 48 + } + // get frequency + if (!freq && typeof note === 'number') { + freq = midiToFreq(note); // + 48); + } - // set frequency - freq = Number(freq); + // set frequency + freq = Number(freq); - const [attack, decay, sustain, release] = getADSRValues( - [value.attack, value.decay, value.sustain, value.release], - 'linear', - [0.001, 0.05, 0.6, 0.01], - ); + const [attack, decay, sustain, release] = getADSRValues( + [value.attack, value.decay, value.sustain, value.release], + 'linear', + [0.001, 0.05, 0.6, 0.01], + ); - const holdend = begin + duration; - const end = holdend + release + 0.01; + const holdend = begin + duration; + const end = holdend + release + 0.01; - let node = getWorklet(ac, 'better-oscillator', { frequency: freq, begin, end }); + let node = getWorklet(ac, 'better-oscillator', { frequency: freq, wave: i, begin, end }); - const envGain = gainNode(1); - node = node.connect(envGain); + const envGain = gainNode(1); + node = node.connect(envGain); - getParamADSR(node.gain, attack, decay, sustain, release, 0, 1, begin, holdend, 'exponential'); + getParamADSR(node.gain, attack, decay, sustain, release, 0, 0.3, begin, holdend, 'linear'); - return { - node, - stop: (time) => { - // o.stop(time); - }, - triggerRelease: (time) => { - // envGain?.stop(time); - }, - }; + return { + node, + stop: (time) => { + // o.stop(time); + }, + triggerRelease: (time) => { + // envGain?.stop(time); + }, + }; + }); }); - [...waveforms, ...noises].forEach((s) => { + [...noises].forEach((s) => { registerSound( s, (t, value, onended) => { @@ -78,12 +80,9 @@ export function registerSynthSounds() { ); let sound; - if (waveforms.includes(s)) { - sound = getOscillator(s, t, value); - } else { - let { density } = value; - sound = getNoiseOscillator(s, t, density); - } + + let { density } = value; + sound = getNoiseOscillator(s, t, density); let { node: o, stop, triggerRelease } = sound;