web-audio-beat-detector
Version:
A beat detection utility which is using the Web Audio API.
79 lines (58 loc) • 3.2 kB
Markdown

# web-audio-beat-detector
**A beat detection utility which is using the Web Audio API.**
[](https://www.npmjs.com/package/web-audio-beat-detector)
This module is based on the technique explained by [Joe Sullivan](http://joesul.li/van/) in his article [Beat Detection Using JavaScript and the Web Audio API](http://joesul.li/van/beat-detection-using-web-audio/). It retrieves the beats as BPM of a given AudioBuffer. The algorithm used is not as complex (and expensive to compute) as many others. But it yields surprisingly good results especially for electronic music.
## Usage
The `web-audio-beat-detector` module is available on
[npm](https://www.npmjs.com/package/web-audio-beat-detector) and can be installed as usual.
```shell
npm install web-audio-beat-detector
```
You can then import its public function `analyze()` like this:
```js
import { analyze } from 'web-audio-beat-detector';
```
The `analyze()` function expects an `AudioBuffer` as its first parameter and it returns a `Promise`
which eventually resolves with the tempo of that buffer as a number. An example usage might look
like this:
```js
analyze(audioBuffer)
.then((tempo) => {
// the tempo could be analyzed
})
.catch((err) => {
// something went wrong
});
```
Additionally you can also import the `guess()` function like this:
```js
import { guess } from 'web-audio-beat-detector';
```
The `guess()` function expects an `AudioBuffer` as well and also returns a `Promise`. The `Promise`
will resolve with an object containing the estimated BPM (the rounded tempo) and the offset of the
first beat in seconds.
```js
guess(audioBuffer)
.then(({ bpm, offset, tempo }) => {
// the bpm and offset could be guessed
// the tempo is the same as the one returned by analyze()
})
.catch((err) => {
// something went wrong
});
```
`analyze()` and `guess()` do both support `offset` and `duration` as optional arguments. When specified these two values are used to select only a part of the given `AudioBuffer`. There usage is the same as described in the documentation of the [`AudioBufferSourceNode.start()`](https://webaudio.github.io/web-audio-api/#widl-AudioBufferSourceNode-start-void-double-when-double-offset-double-duration) method.
By default the bpm are expected to be between 90 and 180 bpm. This can be changed by specifying the `tempoSettings`. These can be passed as the last argument to `analyze()` or `guess()`.
```js
// with an offset and duration
analyze(audioBuffer, 1, 10, { maxTempo: 120, minTempo: 60 });
// with no other arguments
analyze(audioBuffer, { maxTempo: 120, minTempo: 60 });
```
## Acknowledgement
A more comprehensive implementation has been done by [José M. Pérez](https://jmperezperez.com). It
comes with an UI to search for tracks on Spotify which can then be analyzed. He also wrote a blog
post
([Detecting tempo of a song using browser's Audio API](https://jmperezperez.com/bpm-detection-javascript/))
about it.