Sine WaveFrequency: 440Hz |
var sineOsc = new Tone.Oscillator({ frequency: 440, type: "sine", volume: -12 }).toMaster(); //Toggle On/Off sineToggle.on('*', function(data){ if (data.value == 1){ sineOsc.start(); }else if (data.value == 0){ sineOsc.stop(); } }); //Set initial slider values sineFreqSlider.set({ value: 0.330 }, true); sineVolSlider.set({ value: 0.8 }, true); //Frequency slider function sineFreqSlider.on('*', function(data){ //Scale and offset var frequency = data.value * 900 + 100; sineOsc.frequency.value = frequency; }); //Volume slider function sineVolSlider.on('*', function(data){ /*Another scale and offset (0-1 mapped to -60-0). Math.floor is a built-in JS function for rounding.*/ var volume = Math.floor(data.value * 60 - 60); sineOsc.volume.value = volume; }); |
Adding Partials of a Sawtooth Wave |
var sawOsc = new Tone.Oscillator({ frequency: 440, volume: -12 }).toMaster(); sawPartialNumber.set({ value: 1 }, true); /* Sawtooth partial selector function. Tone.js has built in functionality that allows us to specify how many overtones (partials) the wave will have. */ sawPartialNumber.on('*', function(data){ if (data.value >= 1){ sawOsc.type = "sawtooth" + (data.value + 1); } }); |
Filtering a Sawtooth WaveCutoff Frequency: 5000 Hz |
/* Using an oscillator with a lot of harmonics (like a sawtooth wave) and removing some of the high harmonics using a lowpass filter is probably the most common form of synthesis. */ var lowPassFilter = new Tone.Filter({ type: "lowpass", frequency: 5000, Q: 10 }).toMaster(); var filterOsc = new Tone.Oscillator({ type: "sawtooth", frequency: 440, volume: -12 }).connect(lowPassFilter); cutoffFrequencyDial.set({ value: 1 }, true); cutoffFrequencyDial.on('*', function(data){ var cutoff = Math.floor(data.value * 5000); lowPassFilter.frequency.value = cutoff; }); |
Phase CancellationSine Triangle 0° Out of Phase |
var phaseOsc1 = new Tone.Oscillator({ frequency: 440, volume: -12 }).toMaster(); var phaseOsc2 = new Tone.Oscillator({ frequency: 440, volume: -12 }).toMaster(); phaseSlider.set({ value: 0 }, true); //Oscillator toggles phaseSineToggle.on('*', function(data){ if (data.value == 1){ phaseOsc1.type = "sine"; phaseOsc2.type = "sine"; phaseOsc1.start(); phaseOsc2.start(); phaseTriToggle.set({ value: 0 }, false); }else if (data.value == 0){ phaseOsc1.stop(); phaseOsc2.stop(); } }); phaseTriToggle.on('*', function(data){ if (data.value == 1){ phaseOsc1.type = "triangle"; phaseOsc2.type = "triangle"; phaseOsc1.start(); phaseOsc2.start(); phaseSineToggle.set({ value: 0 }, false); }else if (data.value == 0){ phaseOsc1.stop(); phaseOsc2.stop(); } }); /* Phase slider function. There are actually 2 oscillators playing at the same time. The slider changes the second oscillator's phase from 0° - 180° */ phaseSlider.on('*', function(data){ var phase = Math.floor(data.value * 180); phaseOsc2.phase = phase; }); |
Beating |
/* When 2 tones are very close together in frequency, they will produce a phenomenon known as beating. The beating frequency is equivalent to the difference in frequency between the two tones. */ var beatOsc1 = new Tone.Oscillator({ type: "sine", frequency: 440, volume: -12 }).toMaster(); var beatOsc2 = new Tone.Oscillator({ type: "sine", frequency: 441, volume: -12 }).toMaster(); beatFreqNumber.set({ value: 1 }, true); beatFreqNumber.on('*', function(data){ beatOsc2.frequency.value = beatOsc1.frequency.value + data.value; }); |
Frequency Modulation |
//Fun with FM synthesis var fmSynth = new Tone.FMSynth({ harmonicity: 0, modulationIndex: 0, modulator: { oscillator: { type: "sine" } } }).toMaster(); fmPosition.set({ x: 0, y: 0 }, true); fmToggle.on('*', function(data){ if (data.value == 1){ fmSynth.triggerAttack("A4"); }else if (data.value == 0){ fmSynth.triggerRelease(); } }); fmPosition.on('*', function(data){ var index = data.y * 10; var harmonicity = data.x * 3; fmSynth.modulationIndex.value = index; fmSynth.harmonicity.value = harmonicity; }); |