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

tonal-range

v2.2.2

Published

Create ranges of notes

Downloads

305

Readme

Range

A collection of functions to create note ranges.

Example

const Range = require("tonal-range")
import * as Range from "tonal-range"

Example

// ascending chromatic range
Range.chromatic(["C4", "E4"]) // => ["C4", "Db4", "D4", "Eb4", "E4"]
// descending chromatic range
Range.chromatic(["E4", "C4"]) // => ["E4", "Eb4", "D4", "Db4", "C4"]
// combining ascending and descending in complex ranges
Range.chromatic(["C2", "E2", "D2"]) // => ["C2", "Db2", "D2", "Eb2", "E2", "Eb2", "D2"]
// numeric (midi note numbers) range
Range.numeric(["C4", "E4", "Bb3"]) // => [60, 61, 62, 63, 64]
// complex numeric range
Range.numeric(["C4", "E4", "Bb3"]) // => [60, 61, 62, 63, 64, 63, 62, 61, 60, 59, 58]

Range.numeric(array)Array

Create a numeric range. You supply a list of notes or numbers and it will be conected to create complex ranges.

Kind: static method of Range
Returns: Array - an array of numbers or empty array if not vald parameters

| Param | Type | Description | | --- | --- | --- | | array | Array | the list of notes or numbers used |

Example

Range.numeric(["C5", "C4"]) // => [ 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60 ]
// it works midi notes
Range.numeric([10, 5]) // => [ 10, 9, 8, 7, 6, 5 ]
// complex range
Range.numeric(["C4", "E4", "Bb3"]) // => [60, 61, 62, 63, 64, 63, 62, 61, 60, 59, 58]
// can be expressed with a string or array

Range.chromatic(list)Array

Create a range of chromatic notes. The altered notes will use flats.

Kind: static method of Range
Returns: Array - an array of note names

| Param | Type | Description | | --- | --- | --- | | list | String | Array | the list of notes or midi note numbers |

Example

Range.chromatic("C2 E2 D2") // => ["C2", "Db2", "D2", "Eb2", "E2", "Eb2", "D2"]
// with sharps
Range.chromatic("C2 C3", true) // => [ "C2", "C#2", "D2", "D#2", "E2", "F2", "F#2", "G2", "G#2", "A2", "A#2", "B2", "C3" ]

Range.fifths(tonic, range)Array

Create a range with a cycle of fifths

Kind: static method of Range
Returns: Array - a range of cycle of fifths starting with the tonic

| Param | Type | Description | | --- | --- | --- | | tonic | String | Pitch | the tonic note or pitch class | | range | Array | String | the range array |

Example

Range.fifths("C", [0, 6]) // => [ "C", "G", "D", "A", "E", "B", "F#" ])

Range.scale(scale, range)Array

Create a scale (pitch class set) Range. Given a scale (a pitch class set) and a range array, it returns a range in notes.

Can be partially applied

Kind: static method of Range
Returns: Array - the scale range, an empty array if not valid source or null if not valid start or end

| Param | Type | Description | | --- | --- | --- | | scale | Array | the scale to use or a function to convert from midi numbers to note names | | range | Array | a list of notes or midi numbers |

Example

Range.scale("C D E F G A B", ["C3", "C2"])
// => [ "C3", "B2", "A2", "G2", "F2", "E2", "D2", "C2" ]
const majorC = Range.scale("C D E F G A B")
majorC(["C3", "C2"]) * // => [ "C3", "B2", "A2", "G2", "F2", "E2", "D2", "C2" ]