music-beat-detector is a library that analyzes a music stream and detects any beat. It can be used to control lights or any magic effect by the music wave.
Bundled with this library there are three components:
MusicBeatDetector
is able to analyze any PCM 16bit Little Endian audio stream. It detects music peaks and realtime bpm.MusicBeatScheduler
is able to sync any detected peak with the listened audio. It's useful to control some lights or any other effect.MusicGraph
generates an SVG graph that displays every detected peak. It's useful to tune the peak detection.
const fs = require('fs')
const Speaker = require('speaker')
const createMusicStream = require('create-music-stream') //read this https://github.com/chrvadala/create-music-stream#faq
const {MusicBeatDetector, MusicBeatScheduler, MusicGraph} = require('music-beat-detector')
const musicSource = process.argv[2] //get the first argument on cli
const musicGraph = new MusicGraph()
const musicBeatScheduler = new MusicBeatScheduler(pos => {
console.log(`peak at ${pos}ms`) // your music effect goes here
})
const musicBeatDetector = new MusicBeatDetector({
plotter: musicGraph.getPlotter(),
scheduler: musicBeatScheduler.getScheduler(),
})
createMusicStream(musicSource)
.pipe(musicBeatDetector.getAnalyzer())
.on('peak-detected', (pos, bpm) => console.log(`peak-detected at ${pos}ms, detected bpm ${bpm}`))
.on('end', () => {
fs.writeFileSync('graph.svg', musicGraph.getSVG())
console.log('end')
})
.pipe(new Speaker())
.on('open', () => musicBeatScheduler.start())
You can play any music sound supported by the library create-music-stream. Note: The beat detection performs better on mp3 files than YouTube video.
node example.js ./track.mp3
node example.js https://www.youtube.com/watch?v=qeMFqkcPYcg
node example.js https://www.youtube.com/watch?v=Zi_XLOBDo_Y
node example.js https://www.youtube.com/watch?v=n_GFN3a0yj0
node example.js https://www.youtube.com/watch?v=59Q_lhgGANc
Param | Default | Description |
---|---|---|
options.sensitivity | 0.6 | Response to the music wave (value from 0.5 to 1) |
options.plotter | - | Instance of MusicGraph |
options.scheduler | - | Instance of MusicBeatScheduler |
options.minThreashold | 1638 | Peaks under this level are ignored (usually they're noise) |
options.debugFilter | false | Stream the filtered music throught the lowpass filter (for debug purpose) |
getAnalyzer()
- Returns a transformer stream that analyze the music
getScheduler()
- returns an instance used byMusicBeatDetector
start()
- start effects (usually controlled by speaker events)
getPlotter()
- returns an instance used byMusicBeatDetector
getSVG()
- returns a string with the SVG that displays the analyzed music
- chrvadala (author)