Git Product home page Git Product logo

music-chord's Introduction

music-chord

Build Status Code Climate js-standard-style npm version license pitch-array

Music chords made easy:

var chord = require('music-chord')
var M9 = chord('1 3 5 7 9')
M9('D3') // => ['D3', 'F#3', 'A#3', 'C#4', 'E4']
var dom7 = chord('C E G Bb')
dom7('A4') // => ['A4', 'C#5', 'E5', 'G5']

Install

Node

Install via npm: npm i --save music-chord and require it.

Browsers

Currently there's no distribution for browsers, but is planned. You can use browserify, webpack or a similar tool to create one.

Usage

Build chords from intervals

This is the basic usage:

var chord = require('music-chord')
chord('1 3 5 7b 9', 'F2') // => ['F2', 'A2', 'C3', 'Eb3', 'G3']

You can partially apply the function:

var dom79 = chord('1 3 5 7b 9')
dom79('F2') // => ['F2', 'A2', 'C3', 'Eb3', 'G3']

Its important to note that all chord notes are ordered by pitch:

chord('1 3 5 7 2', 'C') // => ['C', 'D', 'E', 'G', 'B']

Build from notes

You can build from notes the same way (again, ordered notes):

var m7b5 = chord('C Eb Gb Bb')
m7b5('D4') // => ['D4', 'F4', 'Ab4', 'C5']
var maj7drop2 = chord('C2 E2 G1 B2')
maj7drop2('C4') // => [ 'G3', 'C4', 'E4', 'B4' ]

Get chord intervals

Set null as tonic to get the chord intervals:

var chord('C E G B', null) // => ['1P', '3M', '5P', '7M']

Dictionaries

You can create a dictionary of chords with the dictionary function:

var dictionary = require('music-chord/dictionary')
var chords = dictionary({ M: 'C E G', m: 'C Eb G'})
chords('M', 'G') // => ['G', 'B', 'D']
chords('m', 'G') // => ['G', 'Bb', 'D']

Use the built-in dictionaries with the fromName:

var fromName = require('music-chord/fromName')
fromName('mMaj7', 'F') // => ['F', 'Ab', 'C', 'E']

As bonus, with fromName function you can place the tonic before the type (with a space if you want to specify the octave):

var fromName = require('music-chord/fromName')
fromName('FmMaj7') // => ['F', 'Ab', 'C', 'E']
fromName('F2 mMaj7') // => ['F2', 'Ab2', 'C3', 'E3']

Chord detection

Cooming soon...

API

add

Add interval to a gamut

Like all the functions from gamut, this works with pitch-array notation format arrays. Probably you will want to decorate this function with gamut.notes or gamut.intervals (see example)

Source:
Example
gamut.add([1, 0, 0], [ [1, 0, 0], [2, 0, 0]]) // => [ [2, 0, 0], [3, 1, 0] ]
var transpose = gamut.notes(gamut.add)
transpose('2M', 'C D E') // => [ 'D', 'E', 'F#' ]
var addIntervals = gamut.intevals(gamut.add)
addIntervals('2M', '1P 2M 3M') // => [ '2M', '3M', '4A' ]

asArray(source) → {Array}

Get an array from a source. The source can be a string separated by spaces, commas or bars (|), an array or an object.

This function does not perform any transformation to the items of the array. This function always return an array, even if its empty

Parameters:
Name Type Description
source String | Array | Object

the source

Source:
Returns:

the source converted to an array

Type
Array
Example
gamut.asArray('c d e') // => [ 'c', 'd', 'e' ]
gamut.asArray('CMaj7 | Dm7 G7') // => [ 'CMaj7', 'Dm7', 'G7' ]
gamut.asArray('1, 2, 3') // => ['1', '2', '3']
gamut.asArray([1, 'a', 3]) // => [1, 'a', 3]
gamut.asArray(object) // => [ object ]
gamut.asArray(null) // => [ ]

chord(source, tonic) → {Array}

Build a chord from a source and a tonic

A source can be a list of intervals or notes. The tonic must be a pitch (with or without octave)

This function is currified, so you can partially apply the function passing one parameter instead of two (see example)

Parameters:
Name Type Description
source Array

the list of intervals or notes

tonic String

the tonic of the chord or null to get the intervals

Source:
Returns:

the chord notes (or intervals if null tonic)

Type
Array
Example
var chord = require('music-chord')
chord('1 3 5 6', 'G') // => ['G', 'B', 'D', 'E']
var maj79 = chord('C E G B D')
maj79('A4') // => ['A4', 'C#5', 'E5', 'G#5', 'B5']

dictionary(chordNames, aliases) → {function}

Create a chord dictionary

Parameters:
Name Type Description
chordNames Hash

a hash that maps names to intervals (or notes)

aliases Hash

(Optional) a hash that maps names to names or null

Source:
Returns:

a function chord(name, tonic)

Type
function
Example
var dictionary = require('music-chord/dictionary')
chords = dictionary({M: 'C E G', m: 'C Eb G'})
chords('m', 'F') // => ['F', 'Ab', 'C']
chords('M', 'A4') // => ['A4', 'C#5', 'E5']

fromName(name, tonic) → {Array}

Build chords by name

The same as chord function but using chord names instead of intervals. The chord name may contain the tonic placed before the type (see example)

Parameters:
Name Type Description
name String

the chord name

tonic String

(Optional) the tonic

Source:
Returns:

an array of notes in ascending order or null

Type
Array
Example
var fromName = require('music-chord/fromName')
fromName('C7b9') // => ['C', 'E', 'G', 'Bb', 'Db']

gamut()

Gamut

Source:

intervals()

Get the gamut as intervals or decorate a function to return intervals

Source:
Example
gamut.intervals('C D E') // => []
var addIntervals = gamut.intervals(gamut.add)
addIntervals('2M', '1P 5P') // => ['2M', '6M']

map(fn, source) → {Array}

Get a gamut mapped to a function

Is important to notice that the function will receive pitches in pitch-array notation format.

This function can be partially applied

Parameters:
Name Type Description
fn function

the function to map the gamut with

source String | Array

the gamut

Source:
Returns:

the mapped gamut

Type
Array
Example
var addOctave = function(p) { return [p[0], p[1], p[2] + 1]}
gamut.map(addOctave, [ [0, 0, 0], [1, 0, 0] ]) // => [ [0, 0, 1], [1, 0, 1]]
var octaveUp = gamut.map(addOctave)
octaveUp([ [0, 0, 0], [1, 0, 0] ]) // => [ [0, 0, 1], [1, 0, 1]]

notes()

Get notes from a gamut, or decorate a function to return notes

Source:
Example
gamut.notes('1P 2M 3M') // => ['C0', 'D0', 'E0']
var transpose = gamut.notes(gamut.add)
transpose('2M', 'C D E') // => [ 'D', 'E', 'F#' ]

parse(source) → {Array}

Convert a list of notes or intervals to pitch-array notation format

Parameters:
Name Type Description
source String | Array

the gamut

Source:
Returns:

the gamut with notes or intervals in pitch-array notation format

Type
Array
Example
gamut.parse('C D E') // => [ [0, 0, null], [1, 0, null], [2, 0, null] ]
gamut.parse('1P 3M 5P') // => [ [0, 0, 0], [2, 0, 0], [4, 0, 0] ]

pitchClass()

Get the pitch classes of a gamut

Source:

set()

Get a set

Source:

sort()

Sort a gamut by frequency

Source:

uniq()

Remove duplicates from a gamut

Source:

generated with docme

License

MIT License

music-chord's People

Contributors

danigb avatar

Watchers

James Cloos avatar Zack avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.