package com.teotigraphix.caustic.sound.midi; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; /** * Enum class providing access to ready made chord degrees based on scale * references. * * @author gmuller */ public enum ChordReference { /** * Scale Degrees {1, 3, 5} Midi Note Numbers {0, 4, 7} */ MAJOR("M"), /** * Scale Degrees {1, b3, 5} Midi Note Numbers {0, 3, 7} */ MINOR("m"), /** * Scale Degrees {1, b3, b5} Midi Note Numbers {0, 3, 6} */ DIMINISHED("dim"), /** * Scale Degrees {1, b3, b5, b7} Midi Note Numbers {0, 3, 6, 9} */ DIMISHED_SEVENTH("dim7"), /** * Scale Degrees {1, b3, b5, 7} Midi Note Numbers {0, 3, 6, 10} */ HALF_DIMINISHED("m7b5"), /** * Scale Degrees {1, 3, #5} Midi Note Numbers {0, 4, 8} */ AUGMENTED("aug"), /** * Scale Degrees {1, 5} Midi Note Numbers {0, 7} */ FIFTH("5"), /** * Scale Degrees {1, 3, 5, b7} Midi Note Numbers {0, 4, 7, 10} */ SEVENTH("7"), /** * Scale Degrees {1, b3, 5, b7} Midi Note Numbers {0, 3, 7, 10} */ MINOR_SEVENTH("m7"), /** * Scale Degrees {1, 3, 5, 7} Midi Note Numbers {0, 4, 7, 11} */ MAJOR_SEVENTH("maj7"), /** * Scale Degrees {1, b3, 5, 7} Midi Note Numbers {0, 3, 7, 11} */ MINOR_MAJOR_SEVENTH("m/maj7"), /** * Scale Degrees {1, 4, 5} Midi Note Numbers {0, 5, 7} */ SUSPENDED_FOURTH("sus4"), /** * Scale Degrees {1, 2, 5} Midi Note Numbers {0, 2, 7} */ SUSPENDED_SECOND("sus2"), /** * Scale Degrees {1, 4, 5, b7} Midi Note Numbers {0, 5, 7, 10} */ SEVENTH_SUSPENDED_FOURTH("7sus4"), /** * Scale Degrees {1, 2, 5, b7} Midi Note Numbers {0, 2, 7, 10} */ SEVENTH_SUSPENDED_SECOND("7sus2"), /** * Scale Degrees {1, 2, 3, 5} Midi Note Numbers {0, 2, 4, 7} */ ADD_TWO("add2"), /** * Scale Degrees {0, 3, 5, 9} Midi Note Numbers {0, 4, 7, 14} */ ADD_NINE("add9"), /** * Scale Degrees {1, 3, 4, 5} Midi Note Numbers {0, 4, 5, 7} */ ADD_FOURTH("add4"), /** * Scale Degrees {1, 3, 5, 6} Midi Note Numbers {0, 4, 7, 9} */ SIXTH("6"), /** * Scale Degrees {1, b3, 5, 6} Midi Note Numbers {0, 3, 7, 9} */ MINOR_SIXTH("m6"), /** * Scale Degrees {1, 3, 5, 6, 9} Midi Note Numbers {0, 4, 7, 9, 14} */ SIX_NINE("6/9"), /** * Scale Degrees {1, 3, 5, b7, 9} Midi Note Numbers {0, 4, 7, 10, 14} */ NINTH("9"), /** * Scale Degrees {1, b3, 5, b7, 9} Midi Note Numbers {0, 3, 7, 10, 14} */ MINOR_NINTH("m9"), /** * Scale Degrees {1, 3, 5, 7, 9} Midi Note Numbers {0, 4, 7, 11, 14} */ MAJOR_NINTH("maj9"), /** * Scale Degrees {1, 3, 5, b7, 9, 11} Midi Note Numbers {0, 4, 7, 10, 14, * 17} */ ELEVENTH("11"), /** * Scale Degrees {1, b3, 5, b7, 9, 11} Midi Note Numbers {0, 3, 7, 10, 14, * 17} */ MINOR_ELEVENTH("m11"), /** * Scale Degrees {1, 3, 5, 7, 9, 11} Midi Note Numbers {0, 4, 7, 11, 14, 17} */ MAJOR_ELEVENTH("maj11"), /** * Scale Degrees {1, 3, 5, b7, 9, 11, 13} Midi Note Numbers {0, 4, 7, 10, * 14, 17, 21} */ THIRTEENTH("13"), /** * Scale Degrees {1, b3, 5, b7, 9, 11, 13} Midi Note Numbers {0, 3, 7, 10, * 14, 17, 21} */ MINOR_THIRTEENTH("m13"), /** * Scale Degrees {1, 3, 5, 7, 9, 11, 13} Midi Note Numbers {0, 4, 7, 11, 14, * 17, 21} */ MAJOR_THIRTEENTH("maj13"), /** * Scale Degrees {1, 3, 5, b7, #9} Midi Note Numbers {0, 4, 7, 10, 15} */ SEVENTH_SHARP_NINE("7#9"), /** * Scale Degrees {1, 3, 5, b7, b9} Midi Note Numbers {0, 4, 7, 10, 13} */ SEVENTH_FLAT_NINE("7b9"), /** * Scale Degrees {1, 3, #5, b7} Midi Note Numbers {0, 4, 8, 10} */ SEVENTH_SHARP_FIFTH("7#5"), /** * Scale Degrees {1, 3, b5, b7} Midi Note Numbers {0, 4, 6, 10} */ SEVENTH_FLAT_FIFTH("7b5"); private static final Map<String, ChordReference> lookup = new HashMap<String, ChordReference>(); static { for (ChordReference s : EnumSet.allOf(ChordReference.class)) lookup.put(s.getCommonName(), s); } private String commonName; private static final int[] MAJOR_CHORD = { 0, 4, 7 }, MINOR_CHORD = { 0, 3, 7 }, DIMINISHED_CHORD = { 0, 3, 6 }, DIMINISHED_SEVENTH_CHORD = { 0, 3, 6, 9 }, HALF_DIMINISHED_SEVENTH_CHORD = { 0, 3, 6, 10 }, AUGMENTED_CHORD = { 0, 4, 8 }, FIFTH_CHORD = { 0, 5 }, SEVENTH_CHORD = { 0, 4, 7, 10 }, MINOR_SEVENTH_CHORD = { 0, 3, 7, 10 }, MAJOR_SEVENTH_CHORD = { 0, 4, 7, 11 }, MINOR_MAJOR_SEVENTH_CHORD = { 0, 3, 7, 11 }, SUSPENDED_FOURTH_CHORD = { 0, 5, 7 }, SUSPENDED_SECOND_CHORD = { 0, 2, 7 }, SEVENTH_SUSPENDED_FOURTH_CHORD = { 0, 5, 7, 10 }, SEVENTH_SUSPENDED_SECOND_CHORD = { 0, 2, 7, 10 }, ADD_TWO_CHORD = { 0, 2, 4, 7 }, ADD_NINE_CHORD = { 0, 4, 7, 14 }, ADD_FOURTH_CHORD = { 0, 4, 5, 7 }, SIXTH_CHORD = { 0, 4, 7, 9 }, MINOR_SIXTH_CHORD = { 0, 3, 7, 9 }, SIX_NINE_CHORD = { 0, 4, 7, 9, 14 }, NINTH_CHORD = { 0, 4, 7, 10, 14 }, MINOR_NINTH_CHORD = { 0, 3, 7, 10, 14 }, MAJOR_NINTH_CHORD = { 0, 4, 7, 11, 14 }, ELEVENTH_CHORD = { 0, 4, 7, 10, 14, 17 }, MINOR_ELEVENTH_CHORD = { 0, 3, 7, 10, 14, 17 }, MAJOR_ELEVENTH_CHORD = { 0, 4, 7, 11, 14, 17 }, THIRTEENTH_CHORD = { 0, 4, 7, 10, 14, 17, 21 }, MINOR_THIRTEENTH_CHORD = { 0, 3, 7, 10, 14, 17, 21 }, MAJOR_THIRTEENTH_CHORD = { 0, 4, 7, 11, 14, 17, 21 }, SEVENTH_SHARP_NINE_CHORD = { 0, 4, 7, 10, 15 }, SEVENTH_FLAT_NINE_CHORD = { 0, 4, 7, 10, 13 }, SEVENTH_SHARP_FIFTH_CHORD = { 0, 4, 8, 10 }, SEVENTH_FLAT_FIFTH_CHORD = { 0, 4, 6, 10 }; ChordReference(String commonName) { this.commonName = commonName; } /** * Provides access to the integer array containing the scale degrees for a * particular chord. For example a Major chord is made up of the root, the * third and the fifth. Taking zero as the root, the third is 5 notes away, * and the the fifth is 7 notes away. The integer array for this chord would * be {0, 5, 7}. * * @see MidiReference#createScale(ScaleReference, NoteReference) * @return int array of chord degrees */ public int[] getDegrees() { switch (this) { case MAJOR: return MAJOR_CHORD; case MINOR: return MINOR_CHORD; case DIMINISHED: return DIMINISHED_CHORD; case DIMISHED_SEVENTH: return DIMINISHED_SEVENTH_CHORD; case HALF_DIMINISHED: return HALF_DIMINISHED_SEVENTH_CHORD; case AUGMENTED: return AUGMENTED_CHORD; case FIFTH: return FIFTH_CHORD; case SEVENTH: return SEVENTH_CHORD; case MINOR_SEVENTH: return MINOR_SEVENTH_CHORD; case MAJOR_SEVENTH: return MAJOR_SEVENTH_CHORD; case MINOR_MAJOR_SEVENTH: return MINOR_MAJOR_SEVENTH_CHORD; case SUSPENDED_FOURTH: return SUSPENDED_FOURTH_CHORD; case SUSPENDED_SECOND: return SUSPENDED_SECOND_CHORD; case SEVENTH_SUSPENDED_FOURTH: return SEVENTH_SUSPENDED_FOURTH_CHORD; case SEVENTH_SUSPENDED_SECOND: return SEVENTH_SUSPENDED_SECOND_CHORD; case ADD_TWO: return ADD_TWO_CHORD; case ADD_NINE: return ADD_NINE_CHORD; case ADD_FOURTH: return ADD_FOURTH_CHORD; case SIXTH: return SIXTH_CHORD; case MINOR_SIXTH: return MINOR_SIXTH_CHORD; case SIX_NINE: return SIX_NINE_CHORD; case NINTH: return NINTH_CHORD; case MINOR_NINTH: return MINOR_NINTH_CHORD; case MAJOR_NINTH: return MAJOR_NINTH_CHORD; case ELEVENTH: return ELEVENTH_CHORD; case MINOR_ELEVENTH: return MINOR_ELEVENTH_CHORD; case MAJOR_ELEVENTH: return MAJOR_ELEVENTH_CHORD; case THIRTEENTH: return THIRTEENTH_CHORD; case MINOR_THIRTEENTH: return MINOR_THIRTEENTH_CHORD; case MAJOR_THIRTEENTH: return MAJOR_THIRTEENTH_CHORD; case SEVENTH_SHARP_NINE: return SEVENTH_SHARP_NINE_CHORD; case SEVENTH_FLAT_NINE: return SEVENTH_FLAT_NINE_CHORD; case SEVENTH_SHARP_FIFTH: return SEVENTH_SHARP_FIFTH_CHORD; case SEVENTH_FLAT_FIFTH: return SEVENTH_FLAT_FIFTH_CHORD; } throw new AssertionError("Unknown Scale: " + this); } /** * Gets the abbreviated name of the chord. For example a Major Thirteenth * chord is abbreviated maj13. * * @return String abbreviation of the chord. */ public String getCommonName() { return commonName; } /** * Reverse lookup of the enum ChordReference by the abbreviation. Passing in * "maj13" will return the MAJOR_THIRTEENTH ChordReference * * @param commonName * @return ChordReference matching the abbreviation passed in */ public static ChordReference get(String commonName) { return lookup.get(commonName); } }