Nodejs bindings for
orottier/web-audio-api-rs
usingnapi-rs
npm install [--save] node-web-audio-api
import { AudioContext, OscillatorNode, GainNode } from 'node-web-audio-api';
const audioContext = new AudioContext();
setInterval(() => {
const now = audioContext.currentTime;
const env = new GainNode(audioContext);
env.connect(audioContext.destination);
env.gain.value = 0;
env.gain.setValueAtTime(0, now);
env.gain.linearRampToValueAtTime(1, now + 0.02);
env.gain.exponentialRampToValueAtTime(0.0001, now + 1);
const osc = new OscillatorNode(audioContext);
osc.frequency.value = 200 + Math.random() * 2800;
osc.connect(env);
osc.start(now);
osc.stop(now + 1);
}, 80);
or using with old fashionned commonjs syntax
const { AudioContext, OscillatorNode, GainNode } = require('node-web-audio-api');
const audioContext = new AudioContext();
//...
- Currently the library does not provide any way of chosing the output interface, system default interface will be used. As the spec and web-audio-api evolve evolve, thus should change in the future see orottier/web-audio-api-rs#216
- On Linux systems, the audio backend is Alsa, which limits the number of online AudioContext to 1. This is subject to change in the future.
On Raspberry Pi, the default render quantum size (128) is too small and underruns occurs frequently. To prevent that, if you do not explicitely provide a latency hint in the AudioContext options, the value is automatically set to 'playback' which uses a buffer of 1024 samples. While this is not per se spec compliant, it allow usage of the library in a more user friendly manner. In the future, this might change according to the support of other audio backend, which is now alsa.
const audioContext = new AudioContext({ latencyHint: 'playback' });
The 'playback' latency hint, 1024 samples / ~21ms at 48000Hz, has been found a good value.
binaries | tested | |
---|---|---|
Windows x64 | ✓ | |
Windows arm64 | ✓ | |
macOS x64 | ✓ | ✓ |
macOS aarch64 | ✓ | |
Linux x64 gnu | ✓ | |
Linux arm gnueabihf (RPi) | ✓ | ✓ |
If prebuilt binaries are not shippped for your platform, you will need to:
- Install rust toolchain
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- Install and build from github
npm install --save git+https://github.com/b-ma/node-web-audio-api.git
cd node_modules/node-web-audio-api
npm run build
The package will then be built on your machine, which might take some time
- async function are not trully async but only monkey patched on the JS side, this will
be updated once
web-audio-api-rs
provide async version of the methods. - see
web-audio-api-rs
The npm script rely on cargo-bump
to maintain version synced between
the package.json
and the Cargo.toml
files. Therefore, you will need to install
cargo-bump
on your machine
cargo install cargo-bump
This project is licensed under the BSD-3-Clause license.