music-chord
October 21, 2015 · View on GitHub
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.notesorgamut.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 sourceString | 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 sourceArray the list of intervals or notes
tonicString the tonic of the chord or null to get the intervals
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 chordNamesHash a hash that maps names to intervals (or notes)
aliasesHash (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
chordfunction but using chord names instead of intervals. The chord name may contain the tonic placed before the type (see example)Parameters:
Name Type Description nameString the chord name
tonicString (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 fnfunction the function to map the gamut with
sourceString | 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 sourceString | 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