ondas
TypeScript icon, indicating that this package has built-in type declarations

0.4.1 • Public • Published

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);

Package Sidebar

Install

npm i ondas

Weekly Downloads

0

Version

0.4.1

License

MIT

Unpacked Size

7.19 kB

Total Files

7

Last publish

Collaborators

  • danigb