A library of functions for analysing and transforming musical information.
Takes an array of note numbers and returns a number from 0-1 that rates the consonance of that group of notes.
// Silence is golden
music.consonance([]) // 1
// A single tone is consonant
music.consonance([80]) // 1
// A major third is less consonant
music.consonance([64, 68]) // 0.5
// C7♭9 is really quite dissonant
music.consonance([60, 61, 64, 67, 70]) // 0.129
Takes an array of note numbers and rates the density of the group of notes between 0 and 1. The more notes there are closer together, the higher the density.
music.density([45, 56]) // 0.1666
music.density([45, 50, 56]) // 0.25
Takes an array of note numbers and returns the difference between the minimum and maximum.
Collapse an array of notes into 1 octave to make a scale.
Returns a [scale, transpose] pair, where scale is an
ascending array of unique numbers starting with 0 and in the range
0-12, and transpose is a number representing the
transposition needed to put it in the key of the notes in array.
Find modes where all the notes in array can be found.
Returns an array of [mode, transpose] pairs, representing all modes
that are supersets of, or an exact match to toScale(array), and
their transpose values.
Takes an array of note numbers and transposes them by n.
Returns a number in the range 0-1 representing the ratio of
note numbers in array2 that are a chromatic half-step away from
note numbers in array1.
// Two of these three notes are a chromatic half-step away
music.chromaticism([61, 65, 68], [60, 64, 70]) // 0.666
Returns a number in the range 0-1 representing the ratio of note
numbers in array2 that can be considered part of a group that has
moved chromatically as a block from note numbers in array1.
// Two of these three notes move in parallel
music.chromaticism([61, 65, 68], [59, 63, 70]) // 0.666
Returns a number in the range 0-1 representing the ratio of note
numbers in array2 that can be considered part of a group that has
moved chromatically as a block from note numbers in array1, where
there is more than one group and they move by different distances.
// All four of these notes belong to a group that moves in parallel,
// with each group moving contrary to the other
music.chromaticism([61, 65, 68, 70], [59, 63, 70, 72]) // 1
Contrary parallelism requires chords of at least four notes. If either array
is less than length 4, contraryParallelism returns 0.