symphonia.js
A "way too simple" cross-platform zero dependency audio playback library for Node.js
Supported Platforms
- Windows (x64)
- macOS (x64)
- macOS (ARM64)
- Linux (x64)
Supported Audio Formats
- MP3
- WAV
- Vorbis
- FLAC
- MP4
- AAC
Note
Take note that the node_modules
generated by npm when installing this package is non-portable across platforms in order to save space. Thus, you'll need to run npm install
when transferring your project between platforms in order for this package to work correctly (you should not be committing your node_modules
anyway so for most use cases this shouldn't be a problem).
Lastly, when you call the functions for the first time it might take a few seconds for the computer to respond. This is perfectly normal behaviour as it might be caused by Windows Defender.
Credits
Usage
const axios = require('axios')
const fs = require('fs')
const symphonia = require('@tropicbliss/symphonia')
try {
const buf = fs.readFileSync('chime.ogg') // Gets a Buffer
symphonia.playFromBuf(buf, { speed: 1.0, volume: 1.0, isBlocking: true }) // The option object is optional. The speed and volume is both set to 1.0 and `isBlocking` is set to `true` by default.
// You can also obtain buffers from a web request
axios
.get(URL)
.then((res) => Buffer.from(res.data, 'binary'))
.then((buf) => {
symphonia.playFromBuf(buf)
})
// Play a sine wave at the frequency of 440Hz for 250ms
symphonia.playFromSine(440.0, 250)
} catch (e) {
console.log('Error playing audio: ', e)
}
Note that calling playFromX()
without setting the isBlocking
option parameter blocks the main thread by default, so pass false
to isBlocking
to make the methods non-blocking.
const fs = require('fs')
const symphonia = require('@tropicbliss/symphonia')
async function playStuff() {
const buf = fs.readFileSync('chime.ogg')
const data = symphonia.playFromBuf(buf, { isBlocking: false })
console.log("I'm not done yet, do something else to prevent this program from exiting!")
if (data.totalDuration) {
console.log(`This audio will be played for ${data.totalDuration} seconds.`)
await new Promise((resolve) => setTimeout(resolve, data.totalDuration * 1000))
}
}
try {
playStuff()
} catch (e) {
console.log('Error playing audio: ', e)
}