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);