Web Audio API

By  on  

The Web Audio API allows developers to load and decode audio on demand using JavaScript.  The more I evaluate awesome games for Firefox OS TVs, the more I get to learn about these APIs that I normally wouldn't touch.  The following is a very basic introduction to the WebAudio API, often used for JavaScript games or apps allowing modification of audio on the front end.

Let's start with a reduced Web Audio API code sample:

// Create an AudioContext instance for this sound
var audioContext = new (window.AudioContext || window.webkitAudioContext)();
// Create a buffer for the incoming sound content
var source = audioContext.createBufferSource();
// Create the XHR which will grab the audio contents
var request = new XMLHttpRequest();
// Set the audio file src here
request.open('GET', 'sound-effect.mp3', true);
// Setting the responseType to arraybuffer sets up the audio decoding
request.responseType = 'arraybuffer';
request.onload = function() {
  // Decode the audio once the require is complete
  audioContext.decodeAudioData(request.response, function(buffer) {
    source.buffer = buffer;
    // Connect the audio to source (multiple audio buffers can be connected!)
    source.connect(audioContext.destination);
    // Simple setting for the buffer
    source.loop = true;
    // Play the sound!
    source.start(0);
  }, function(e) {
    console.log('Audio error! ', e);
  });
}
// Send the request which kicks off 
request.send();

I've tried to comment within the code to describe the process as best as possible.  Remember that the above is a very reduced example; there's much more you can do with Web Audio.

I won't pretend to be an expert of all the nuances with Web Audio -- I was simply super excited to see all of this working.  Web Audio does way more than simply allow you to play the audio; you can modify the audio with filters, ramping, and a bunch more.  You can learn more about WebAudio from these awesome sources:

Have you done anything awesome with Web Audio?  Please share with the noobs like me!

Cloudinary

Recent Features

  • By
    fetch API

    One of the worst kept secrets about AJAX on the web is that the underlying API for it, XMLHttpRequest, wasn't really made for what we've been using it for.  We've done well to create elegant APIs around XHR but we know we can do better.  Our effort to...

  • By
    An Interview with Eric Meyer

    Your early CSS books were instrumental in pushing my love for front end technologies. What was it about CSS that you fell in love with and drove you to write about it? At first blush, it was the simplicity of it as compared to the table-and-spacer...

Incredible Demos

  • By
    MooTools Zoomer Plugin

    I love to look around the MooTools Forge. As someone that creates lots of plugins, I get a lot of joy out of seeing what other developers are creating and possibly even how I could improve them. One great plugin I've found is...

  • By
    iPhone-Style Passwords Using MooTools PassShark

    Every once in a while I come across a plugin that blows me out of the water and the most recent culprit is PassShark: a MooTools plugin that duplicates the iPhone's method of showing/hiding the last character in a password field. This gem of...

Discussion

  1. Plopz

    Its funny that you commented every line except the most important.

    source.connect(audioContext.destination);
    

    The magic of the audio api is that you can connect, combine and chain together all of these different nodes which operate on I/O to manipulate the data. The Web Audio developer tools in firefox is helpful to visualize these node traversals.

  2. The Web Audio API also includes a built-in synthetiser that you can use to play sounds without using sound file. I worked on a musical game during a hackathon where you can compose music with strangers or friends: http://polytun.es/

    Also, Pizzicato is a great library to create to create and manipulate sounds with the Web Audio API : https://github.com/alemangui/pizzicato

  3. I made a synthesizer and sound visualizer using the full power of Web Audio API, called Comet. You can find it here:

    https://venerons.github.io/Comet

  4. David,

    We have done cool stuff with the web audio API in conjunction with SoundCTL audio API, doing real time audio streaming and routing.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!