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

sonify

v0.3.1

Published

A module to sonify data

Readme

Sonify

A module that allows you to sonify timeseries data. The Sonify class will scale your data to a given pitch range and song length, and then allow you play it in the browser using the Web Audio API.

The duration of a note is calculated by measuring the time between two data points. This is then scaled to the timeframe provided by songLength. You can optionally set staticRythm: true to disregard timestamps and give each data point an equal note length.

Usage

import Sonify from "sonify";

const data = [
  [1536969666906, 1],
  [1546969674206, 2],
  [1556966695555, 4.3],
  [1566959697655, 2.3],
  [1576669693906, 3]
];

// Instantiate a new Sonify instance with our data,
// with a song length of 10 seconds. Resulting pitches
// should span 3 octaves, starting from C06.
const Sonifier = new Sonify({
  data, 
  songLength: 10,
  octaves: 3,
  baseOctave: 6,
  glissando: true,
  staticRhythm: false,
  onEnded: () => console.log("that's all folks!")
});

Sonifier.play();

console.log(Sonifier.isPlaying); // true

Sonifier.stop();

API

Sonify constructor options

* = required

| Name | Type | Sample Value | Description | Default | | ------------ | -------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | | data* | Array<Array> | [[1586969694206, 2.3], [1596969695555, 5.3]] | Two dimensional array of data points | | | songLength* | number | 60 | Length of the generated song in seconds | | | volume | number | 0.05 | The volume of the song, from 0.0 to 1.0. | 0.05 | | pitches | Array | ["A", "C#", "E"] | Array of pitch names to use. Default is all 12 chromatic notes | ["C", "C#", "D", "D#", "E", "F", "Gb", "G", "A", "Ab", "Bb", "B"] | | octaveRange | number | 2 | Number of octaves that the song should span. | 3 | | baseOctave | number | 4 | Starting octave for the sonification. There are 9 octaves available, so baseOctave must be less than 9 - octaveRange. | 6 | | glissando | boolean | true | Whether or not to glide from one pitch to another. With this option enabled you can clearly hear the shape of the data. | false | | staticRhythm | boolean | false | Disregard timestamps and give each data point an equal note length by dividing the provided songLength by the number of data points. | false | | onEnded | function | () => console.log("That's all folks") | Callback that is invoked when the song is finished playing | |

Methods

Sonify.prototype.play()

Initiates playback of the provided data

Sonify.prototype.stop()

Stops playback and clears the web audio context

Developers