mikehadlow / gtr-cof

Interactive music theory dashboard for guitarists. http://guitardashboard.com/
MIT License
327 stars 66 forks source link

add and edit scale #44

Open sugizo opened 3 years ago

sugizo commented 3 years ago

music-module.ts edit

add

let majorPentatonicModes: Mode[] = [
    { name: 'Major Pentatonic', index: 0 },
    { name: 'Egyptian', index: 2 },
    { name: 'Blues Minor', index: 4 },
    { name: 'Blues Major', index: 7 },
    { name: 'Minor Pentatonic', index: 9 },
];

let hirajoshiModes: Mode[] = [
    { name: 'Hirajoshi', index: 0 },
    { name: 'Iwato', index: 6 },
    { name: 'In', index: 11 },
];

let majorHexatonicModes: Mode[] = [
    { name: 'Major Hexatonic', index: 0 },
    { name: 'Minor Hexatonic', index: 2 },
];

let diatonicModes: Mode[] = [
    { name: 'Major / Ionian', index: 0 },
    { name: 'Dorian', index: 2 },
    { name: 'Phrygian', index: 4 },
    { name: 'Lydian', index: 5 },
    { name: 'Mixolydian', index: 7 },
    { name: 'N Minor / Aeolian', index: 9 },
    { name: 'Locrian', index: 11 },
];

let doubleHarmonicMajorModes: Mode[] = [
    { name: 'Double Harmonic Major', index: 0 },
    { name: 'Lydian ♯2 ♯6', index: 1 },
    { name: 'Ultraphrygian', index: 4 },
    { name: 'Hungarian / Gypsy Minor', index: 5 },
    { name: 'Oriental', index: 7 },
    { name: 'Ionian ♯2 ♯5', index: 8 },
    { name: 'Locrian ♭♭3  ♭♭7', index: 11 },
];

let harmonicMajorModes: Mode[] = [
    { name: 'Harmonic Major', index: 0 },
    { name: 'Dorian ♭5', index: 2 },
    { name: 'Phrygian ♭4', index: 4 },
    { name: 'Lydian ♭3', index: 5 },
    { name: 'Mixolydian ♭2', index: 7 },
    { name: 'Lydian Augmented #2', index: 8 },
    { name: 'Locrian ♭♭7', index: 11 },
];

let harmonicMinorModes: Mode[] = [
    { name: 'Harmonic Minor', index: 0 },
    { name: 'Locrian ♯6', index: 2 },
    { name: 'Ionian ♯5', index: 3 },
    { name: 'Dorian ♯4', index: 5 },
    { name: 'Phrygian Dominant', index: 7 },
    { name: 'Lydian ♯2', index: 8 },
    { name: 'Superlocrian', index: 11 },
];

let ascendingMelodicMinorModes: Mode[] = [
    { name: 'Ascending Melodic Minor', index: 0 },
    { name: 'Assyrian', index: 2 },
    { name: 'Lydian Augmented', index: 3 },
    { name: 'Lydian Dominant', index: 5 },
    { name: 'Mixolydian ♭6', index: 7 },
    { name: 'Locrian ♮2', index: 9 },
    { name: 'Altered scale', index: 11 },
];

let diminishedModes: Mode[] = [
    { name: 'Whole Half Diminished', index: 0 },
    { name: 'Half Whole Diminished', index: 2 },
];

let majorBebopModes: Mode[] = [
    { name: 'Major Bebop', index: 0 },
    { name: 'Harmonic Minor Bebop', index: 9 },
];

let dominantBebopModes: Mode[] = [
    { name: 'Dominant Bebop', index: 0 },
    { name: 'Locrian Bebop', index: 4 },
    { name: 'Dorian Bebop', index: 7 },
];

export let scaleFamily: ScaleFamily[] = [
    { name: "Major Pentatonic", intervals: new mod.Mod([true, false, true, false, true, false, false, true, false, true, false, false]), modes: majorPentatonicModes, defaultModeIndex: 0 },
    { name: "Hirajoshi", intervals: new mod.Mod([true, false, false, false, true, false, true, true, false, false, false, true]), modes: hirajoshiModes, defaultModeIndex: 0 },
    { name: "Major Hexatonic", intervals: new mod.Mod([true, false, true, false, true, true, false, true, false, true, false, false]), modes: majorHexatonicModes, defaultModeIndex: 0 },
    { name: "Augmented", intervals: new mod.Mod([true, false, false, true, true, false, false, true, true, false, false, true]), modes: [{ name: 'Augmented', index: 0}], defaultModeIndex: 0 },
    { name: "Blues", intervals: new mod.Mod([true, false, false, true, false, true, true, true, false, false, true, false]), modes: [{ name: 'Blues', index: 0}], defaultModeIndex: 0 },
    { name: "Prometheus", intervals: new mod.Mod([true, false, true, false, true, false, true, false, false, true, true, false]), modes: [{ name: 'Prometheus', index: 0}], defaultModeIndex: 0 },
    { name: "TriTone", intervals: new mod.Mod([true, true, false, false, true, false, true, true, false, false, true, false]), modes: [{ name: 'TriTone', index: 0}], defaultModeIndex: 0 },
    { name: "Whole Tone", intervals: new mod.Mod([true, false, true, false, true, false, true, false, true, false, true, false]), modes: [{ name: 'Whole Tone', index: 0}], defaultModeIndex: 0 },
    { name: "Diatonic", intervals: new mod.Mod([true, false, true, false, true, true, false, true, false, true, false, true]), modes: diatonicModes, defaultModeIndex: 0 },
    { name: "Double Harmonic Major", intervals: new mod.Mod([true, true, false, false, true, true, false, true, true, false, false, true]), modes: doubleHarmonicMajorModes, defaultModeIndex: 0 },
    { name: "Harmonic Major", intervals: new mod.Mod([true, false, true, false, true, true, false, true, true, false, false, true]), modes: harmonicMajorModes, defaultModeIndex: 0 },
    { name: "Harmonic Minor", intervals: new mod.Mod([true, false, true, true, false, true, false, true, true, false, false, true]), modes: harmonicMinorModes, defaultModeIndex: 0 },
    { name: "Ascending Melodic Minor", intervals: new mod.Mod([true, false, true, true, false, true, false, true, false, true, false, true]), modes: ascendingMelodicMinorModes, defaultModeIndex: 0 },
    { name: "Diminished", intervals: new mod.Mod([true, false, true, true, false, true, true, false, true, true, false, true]), modes: diminishedModes, defaultModeIndex: 0 },
    { name: "Major Bebop", intervals: new mod.Mod([true, false, true, false, true, true, false, true, true, true, false, true]), modes: majorBebopModes, defaultModeIndex: 0 },
    { name: "Dominant Bebop", intervals: new mod.Mod([true, false, true, false, true, true, false, true, false, true, true, true]), modes: dominantBebopModes, defaultModeIndex: 0 },
    { name: "Melodic Minor Bebop", intervals: new mod.Mod([true, false, true, true, false, true, false, true, true, true, false, true]), modes: [{ name: 'Melodic Minor Bebop', index: 0}], defaultModeIndex: 0 },
    { name: "Phrygian Dominant Bebop", intervals: new mod.Mod([true, true, false, false, true, true, false, true, true, false, true, true]), modes: [{ name: 'Phrygian Dominant Bebop', index: 0}], defaultModeIndex: 0 },
];

thanks

mikehadlow commented 3 years ago

Thanks, this is excellent, I'll add all these.

mikehadlow commented 3 years ago

Question about this: "the sequence of diatonic scale, because the 1st index on diatonic scale should goes to major scale / ionian mode" So, one of the really nice things I've learnt from making guitar dashboard is the 'harmonic progress' of the diatonic modes. I put them in the order: Lydian - Major - Mixolydian - Dorian - N Minor - Phrygian - Locrian because it shows the progression from more major modes to more minor modes. Each step requires the change of just one interval, and this is beautifully displayed on the circle of fifths as the highlighted notes moves counter clockwise. We'd lose that by ordering the modes in 'starting note order'. (although I now realise that I haven't followed this principle for the other modes). What do you think?

sugizo commented 3 years ago

when people learn the scale usually put the root note e.g. c major scale consist of c-d-e-f-g-a-b d dorian consist of d-e-f-g-a-b-c e phrygian consist of e-f-g-a-b-c-d f lydian consist of f-g-a-b-c-d-e g mixolydian consist of g-a-b-c-d-e-f a aeolian consist of a-b-c-d-e-f-g b locrian consist of b-c-d-e-f-g-a

for the same reason want to revise my previous proposal change from

let hirajoshiModes: Mode[] = [
    { name: 'Hirajoshi', index: 0 },
    { name: 'Iwato', index: 6 },
    { name: 'In', index: 11 },
];

    { name: "hirajoshi", intervals: new mod.Mod([true, false, false, false, true, false, true, true, false, false, false, true]), modes: hirajoshiModes, defaultModeIndex: 0 },

into

let inModes: Mode[] = [
    { name: 'In', index: 0 },
    { name: 'Hirajoshi', index: 1 },
    { name: 'Iwato', index: 7 },
];

    { name: "In", intervals: new mod.Mod([true, true, false, false, false, true, false, true, true, false, false, false]), modes: inModes, defaultModeIndex: 0 },

in mode consist of e-f-a-b-c hirajoshi mode consist of f-a-b-c-e iwato mode consist of b-c-e-f-a

ref https://en.wikipedia.org/wiki/List_of_musical_scales_and_modes

thanks

mikehadlow commented 3 years ago

OK, I think both approaches are valid then: either modes ordered by ascending root note, or by fifths (as the diatonic modes are currently). I might add an option here.

sugizo commented 3 years ago

base on wiki link above add some scale

    let neapolitanMinorModes: Mode[] = [
        { name: 'Neapolitan Minor', index: 0 },
        { name: 'Gypsy', index: 5 },
    ];

        { name: "Insen", intervals: new mod.Mod([true, true, false, false, false, true, false, true, false, false, true, false]), modes: [{ name: 'Insen', index: 0}], defaultModeIndex: 0 },
        { name: "Neapolitan Minor", intervals: new mod.Mod([true, true, false, true, false, true, false, true, true, false, false, true]), modes: neapolitanMinorModes, defaultModeIndex: 0 },
        { name: "Neapolitan Major", intervals: new mod.Mod([true, true, false, true, false, true, false, true, false, true, false, true]), modes: [{ name: 'Neapolitan Major', index: 0}], defaultModeIndex: 0 },
        { name: "Flamenco", intervals: new mod.Mod([true, true, false, false, true, true, false, true, true, false, false, true]), modes: [{ name: 'Flamenco', index: 0}], defaultModeIndex: 0 },
        { name: "Persian", intervals: new mod.Mod([true, true, false, false, true, true, true, false, true, false, false, true]), modes: [{ name: 'Persian', index: 0}], defaultModeIndex: 0 },
        { name: "Enigmatic", intervals: new mod.Mod([true, true, false, false, true, false, true, false, true, false, true, true]), modes: [{ name: 'Enigmatic', index: 0}], defaultModeIndex: 0 },
        { name: "Hungarian Major", intervals: new mod.Mod([true, false, false, true, true, false, true, true, false, true, true, false]), modes: [{ name: 'Hungarian Major', index: 0}], defaultModeIndex: 0 },
        { name: "Ukrainian Dorian", intervals: new mod.Mod([true, false, true, true, false, false, true, true, false, true, true, false]), modes: [{ name: 'Ukrainian Dorian', index: 0}], defaultModeIndex: 0 },
        { name: "Major Locrian", intervals: new mod.Mod([true, false, true, false, true, true, true, false, true, false, true, false]), modes: [{ name: 'Major Locrian', index: 0}], defaultModeIndex: 0 },

thanks

sugizo commented 3 years ago

./src/music-module.ts

    let bluesHexatonicModes: Mode[] = [
        { name: 'Blues Major Hexatonic', index: 0 },
        { name: 'Blues Minor Hexatonic', index: 9 },
    ];

        { name: "Blues Major Hexatonic", intervals: new mod.Mod([true, false, true, true, true, false, false, true, false, true, false, false]), modes: bluesHexatonicModes, defaultModeIndex: 0 },

ref https://en.wikipedia.org/wiki/Blues_scale#Hexatonic

thanks