Web Audio Portamento Oscillator Test
HTML
<button id="play">Play</button>
<button id="stop">Stop</button>
JavaScript
var audioContext = new AudioContext();
var running = true;
function step() {
if (!running) {
return;
}
tick();
requestAnimationFrame(step);
}
var oscillator;
var startFrequency = 440,
targetFrequency = 880,
prevFrequency = startFrequency,
currFrequency = startFrequency;
function start() {
oscillator = audioContext.createOscillator();
oscillator.type = 0;
oscillator.frequency.value = startFrequency;
oscillator.connect(audioContext.destination);
oscillator.start(0);
step();
}
function stop() {
oscillator.stop(0);
running = false;
}
var glideStartTime = 2,
glideTime = 5;
function tick() {
var currTime = audioContext.currentTime;
if (currTime > glideStartTime) {
var alpha = clamp((currTime - glideStartTime) / glideTime);
oscillator.frequency.value = lerp(startFrequency, targetFrequency, alpha);
}
}
function clamp(value, min, max) {
return Math.min(Math.max(value, 0), 1);
}
function lerp(a, b, alpha) {
return (1 - alpha) * a + alpha * b;
}
$('#play').bind('click', start);
$('#stop').bind('click', stop);