const Scale = require('../model/scale');
const SCALE_TYPES = {
CHROMATIC: [1,1,1,1,1,1,1,1,1,1,1,1],
// 8 pitches per octave:
OCTATONIC: [2,1,2,1,2,1,2,1],
OCTATONIC2: [1,2,1,2,1,2,1,2],
BEBOP_DOMINANT: [2,2,1,2,2,1,1,1],
BEBOP_DORIAN: [2,1,1,1,2,2,1,2],
BEBOP_HARMONIC_MINOR: [2,1,2,2,1,2,1,1],
BEBOP_MAJOR: [2,2,1,2,1,1,2,1],
BEBOP_MELODIC_MINOR: [2,1,2,2,1,1,2,1],
// 7 pitches per octave / diatonic scales:
IONIAN: [2,2,1,2,2,2,1],
DORIAN: [2,1,2,2,2,1,2],
PHRYGIAN: [1,2,2,2,1,2,2],
LYDIAN: [2,2,2,1,2,2,1],
MIXOLYDIAN: [2,2,1,2,2,1,2],
AEOLIAN: [2,1,2,2,1,2,2],
LOCRIAN: [1,2,2,1,2,2,2],
// 7 pitches per octave / other:
ACOUSTIC: [2,2,2,1,2,1,2],
ALTERED: [1,2,1,2,2,2,2],
BYZANTINE: [1,3,1,2,1,3,1],
ENIGMATIC: [1,3,2,2,2,1,1],
FREYGISH: [1,3,1,2,1,2,2],
HALF_DIMINISHED: [2,1,2,1,2,2,2],
HARMONIC_MINOR: [2,1,2,2,1,3,1],
HARMONIC_MAJOR: [2,2,1,2,1,3,1],
HUNGARIAN: [2,1,3,1,1,2,2],
HUNGARIAN_MINOR: [2,1,3,1,1,3,1],
LOCRIAN_MAJOR: [2,2,1,1,2,2,2],
LYDIAN_AUGMENTED: [2,2,2,2,1,2,1],
MELODIC_MINOR: [2,1,2,2,2,2,1],
NEAPOLITAN_MAJOR: [1,2,2,2,2,2,1],
NEAPOLITAN_MINOR: [1,2,2,2,1,3,1],
PELOG: [1,2,3,1,1,2,2],
PERSIAN: [1,3,1,1,2,3,1],
PHRYGIAN_DOMINANT: [1,3,1,2,1,2,2],
UKRAINIAN_DORIAN: [2,1,3,1,2,1,2],
// 6 pitches per octave:
AUGMENTED: [3,1,3,1,3,1],
BLUES: [3,2,1,1,3,2],
OF_HARMONICS: [3,1,1,2,2,3],
PROMETHEUS: [2,2,2,3,1,2],
TRITONE: [1,3,2,1,3,2],
WHOLE_TONE: [2,2,2,2,2,2],
// 5 pitches per octave:
PENTATONIC_MAJOR: [2,2,3,2,3],
PENTATONIC_MINOR: [3,2,2,3,2],
EGYPTIAN: [2,3,2,3,2],
HIRAJOSHI: [4,2,1,4,1],
INSEN: [1,4,2,3,2],
IWATO: [1,4,1,4,2],
MAN_GONG: [3,2,3,2,2],
SAKURA: [1,4,2,1,4],
SLENDRO: [2,3,2,2,3],
};
SCALE_TYPES.MAJOR = SCALE_TYPES.IONIAN;
SCALE_TYPES.MINOR = SCALE_TYPES.NATURAL_MINOR = SCALE_TYPES.AEOLIAN;
/**
* Built-in scales
*/
const SCALES = {};
Object.keys(SCALE_TYPES).forEach(type => {
SCALES[type] = (root) => new Scale(SCALE_TYPES[type], root);
});
module.exports = Object.freeze(SCALES);