Reverb.js is a Web Audio API extension for creating reverb nodes and an accompanying impulse-response reverb library. You can quickly load any of the provided impulse responses or use your own.
The Web Audio API does not specifically include a reverb node type. Instead, it has something better: a convolution node! Convolution is a mathematical transformation that combines an impulse response and a dry signal to yield a wet signal. Reverberation is easy to model with impulse responses since most reverberation has a linear response (contains little distortion). Impulse responses for simulating reverberation are often generated by recording a percussive noise or frequency sweep in a space. Does this all sound convoluted? Well, technically, it is!
This project is dedicated to the public domain via the CC0 license. However, most of the impulse responses are copyright and come with their own licenses (many are Creative Commons), so if you end up redistributing these, please make sure you follow the applicable licenses mentioned in the attributions.
Here is a demo of Reverb.js with each of the samples in the reverb library.
audioContext was the name of the variable containing the reference to the AudioContext, first call:
This will add three different functions for creating a reverb node.
audioContext.createReverbFromBase64(audioBase64, callback) -> AudioNode audioContext.createReverbFromUrl(audioUrl, callback) -> AudioNode audioContext.createReverbFromBase64Url(audioBase64, callback) -> AudioNode
These act like any of the other
audioContext.create...() functions, and each immediately returns a new node (of the ConvolverNode type) and asynchronously attempts to fetch and/or decode the given impulse response into the convolver node's
buffer, calling the optional
callback after it has successfully loaded.
Alternatively, you can use the
audioContext.createReverbFromUrl to load the impulse response from any URL.
Finally, if only plain-text URLs are accessible from your site's origin (as is the case with the demo on GitHub), there is a
audioContext.createReverbFromBase64Url function, which fetches the Base64-encoded contents of an audio file from a URL.
For the best cross-platform performance, use 32-bit float, 2 channel (stereo), 44.1KHz WAV (uncompressed) or M4A (AAC compressed) impulse responses. As of late 2015, there is universal support for both WAV and M4A in all major browsers, so the choice to use WAV or M4A mostly depends on whether fidelity or size is most important. Keep in mind that audio codecs are primarily designed to compress sound, speech, and music—not impulse responses. Depending on the nature of the impulse response, compression may result in a noticeable change in the color of reverberation.
The reverbjs.extend() function also adds three complementary functions for loading source samples. These work just like the createReverb... functions above except that they create source nodes using the loaded buffer.
audioContext.createSourceFromBase64(audioBase64, callback) -> AudioNode audioContext.createSourceFromUrl(audioUrl, callback) -> AudioNode audioContext.createSourceFromBase64Url(audioBase64, callback) -> AudioNode