npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ondas

v0.4.1

Published

Web audio instruments

Readme

Ondas

ondas is a collection of web audio instruments ready to be used with no setup.

Example:

import { SplendidGrandPiano, Soundfont } from "ondas";

const context = new AudioContext();
const piano = new SplendidGrandPiano(context);
piano.start({ note: "C4" });

const marimba = new Soundfont(context, { instrument: "marimba" });
marimba.start({ note: 60, velocity: 80 });

See demo: https://danigb.github.io/samples/

Install with npm or your favourite package manager:

npm i ondas

Documentation

Create an instrument

All instruments follows the same pattern: new Instrument(context, options). For example:

import { SplendidGrandPiano, Soundfont } from "ondas";

const piano = new SplendidGrandPiano(context, { decayTime: 0.5 });

const marimba = new Soundfont(context, { instrument: "marimba" });

Wait for audio loading

You can start playing notes as soon as one audio is loaded. But if you want to wait for all of them, you can use loaded() function that returns a promise:

piano.loaded().then(() => {
  // now the piano is fully loaded
});

Since the promise returns the instrument instance, you can create and wait in a single line:

const piano = await new SplendidGrandPiano(context).loaded();

Start and stop notes

The start function accepts a bunch of options:

piano.start({ note: "C4", velocity: 80, time: 5, duration: 1 });

The velocity is a number between 0 and 128 the represents at which velocity the key is pressed. The bigger the number, louder the sound. But velocity not only controls the loudness. In some instruments, it also affects the timbre.

The start function returns a stop function for the given note:

const stopNote = piano.start({ note: 60 });
stopNote({ time: 10 });

Bear in mind that you may need to call context.resume() before playing a note

Schedule notes

You can schedule notes using time and duration properties:

const now = context.currentTime;
[60, 62, 64, 65, 67].forEach((midi, i) => {
  piano.start({ midi, time: now + i, duration: 0.5 });
});

Stop all notes

Instruments have a global stop function that stops all notes:

button.onclick = () => piano.stop();

Change volume

setVolume uses a scale where 0 means no volume, and 128 is max volume without amplification:

piano.setVolume(80);

Bear in mind that volume is global to the instrument, but velocity is specific for each note.

Add effects

Use output.addSend(name, effect, mix) to create connect an effect using a send bus:

import { DattorroReverb, SplendidGrandPiano } from "ondas";
const reverb = new DatorroReverb(context);
const piano = new SplendidGrandPiano(context, { volume });
piano.output.addSend("reverb", reverb, 0.2);

Change effects send

Use output.setSend(name, mix) to change the mix level:

piano.output.setSend("reverb", 0.5);

Instruments

Sampler

An audio buffer sampler.

import { Sampler } from "ondas";

const samples = {
  kick: "https://danigb.github.io/samples/drum-machines/808-mini/kick.m4a",
  snare: "https://danigb.github.io/samples/drum-machines/808-mini/snare-1.m4a",
};
const sampler = new Sampler(new AudioContext(), { samples });
sampler.start({ note: "kick" });

Soundfont

A Soundfont player.

import { Soundfont } from "ondas";

const marimba = new Soundfont(new AudioContext(), "marimba");
marimba.start({ note: "C4" });

Piano

A sampled acoustic piano. It uses Steinway samples with 4 velocity layers from SplendidGrandPiano

import { SplendidGrandPiano } from "ondas";

const piano = new SplendidGrandPiano(new AudioContext());

piano.start({ note: "C4" });

Effects

Dattorro Reverb

An algorithmic reverb. It uses a modified version of DatorroReverbNode.

import { DattorroReverb } from "ondas";

const reverb = new DattorroReverb(new AudioContext());
const oscillator = context.createOscillator();
oscillator.connect(reverb);