duncanmalashock / elm-music-theory / Music.Scale

A scale is a set of pitch classes in a certain order. E.g. the "C major scale."


type alias Scale =
Music.Internal.Scale.Scale

Helpers

root : Scale -> Music.PitchClass.PitchClass

Get the root pitch class of a scale:

root (major PitchClass.eFlat) == PitchClass.eFlat

scaleType : Scale -> Music.Internal.ScaleType.ScaleType

Get the scale type for a scale:

scaleType (lydian PitchClass.c) == ScaleType.lydian

toList : Scale -> List Music.PitchClass.PitchClass

Get the pitch classes contained in the scale:

toList (major PitchClass.f)
    == [ PitchClass.f
       , PitchClass.g
       , PitchClass.a
       , PitchClass.bFlat
       , PitchClass.c
       , PitchClass.d
       , PitchClass.e
       ]

containsPitchClass : Music.PitchClass.PitchClass -> { ignoreSpelling : Basics.Bool } -> Scale -> Basics.Bool

Find out whether a scale contains a given pitch class:

containsPitchClass PitchClass.f
    { ignoreSpelling = False }
    (major PitchClass.c)
    == True

Set the ignoreSpelling flag to allow enharmonic equivalents. This returns True because G♭ is not in C Lydian, but F♯ (an equivalent) is:

containsPitchClass PitchClass.gFlat
    { ignoreSpelling = True }
    (lydian PitchClass.c)
    == True

containsChord : Music.Internal.Chord.Chord -> Music.Internal.Scale.Scale -> Basics.Bool

Find out whether a scale contains a given chord:

containsChord (Chord.majorSeventhSharpEleven PitchClass.f)
    (major PitchClass.c)
    == True

allChords : List Music.ChordType.ChordType -> Music.Internal.Scale.Scale -> List Music.Internal.Chord.Chord

Get all chords contained in a scale, choosing from a list of chord types to detect:

allChords [ ChordType.minorSeventh ] (major PitchClass.c)
    == [ Chord.minorSeventh PitchClass.d
       , Chord.minorSeventh PitchClass.e
       , Chord.minorSeventh PitchClass.a
       ]

degree : Basics.Int -> Scale -> Music.PitchClass.PitchClass

Get a degree of the scale:

degree 3 (major PitchClass.c) == PitchClass.e

Note: like many numbers in music theory, degrees are 1-based; 2 means the second degree of the scale. 0 and negative integers are ignored.

mode : Basics.Int -> Scale -> Scale

Get a mode of a scale by shifting the order of its pitch classes. For example, E Phrygian is the third mode of the C major scale:

mode 3 (major PitchClass.c) == phrygian PitchClass.e

Note: like many numbers in music theory, modes are 1-based; 2 means the second mode of the scale type. 0 and negative integers are ignored.

Constructors

major : Music.PitchClass.PitchClass -> Scale

Same as ionian

minor : Music.PitchClass.PitchClass -> Scale

Also known as the "natural minor" scale. Same as aeolian

Modes of the major scale

ionian : Music.PitchClass.PitchClass -> Scale

dorian : Music.PitchClass.PitchClass -> Scale

phrygian : Music.PitchClass.PitchClass -> Scale

lydian : Music.PitchClass.PitchClass -> Scale

mixolydian : Music.PitchClass.PitchClass -> Scale

aeolian : Music.PitchClass.PitchClass -> Scale

locrian : Music.PitchClass.PitchClass -> Scale

Modes of the melodic minor scale

melodicMinor : Music.PitchClass.PitchClass -> Scale

dorianFlat2 : Music.PitchClass.PitchClass -> Scale

lydianAugmented : Music.PitchClass.PitchClass -> Scale

acoustic : Music.PitchClass.PitchClass -> Scale

majorMinor : Music.PitchClass.PitchClass -> Scale

minorLocrian : Music.PitchClass.PitchClass -> Scale

superlocrian : Music.PitchClass.PitchClass -> Scale

Modes of the harmonic minor scale

harmonicMinor : Music.PitchClass.PitchClass -> Scale

locrianNatural6 : Music.PitchClass.PitchClass -> Scale

majorAugmented : Music.PitchClass.PitchClass -> Scale

lydianDiminished : Music.PitchClass.PitchClass -> Scale

phrygianDominant : Music.PitchClass.PitchClass -> Scale

aeolianHarmonic : Music.PitchClass.PitchClass -> Scale

ultralocrian : Music.PitchClass.PitchClass -> Scale

Symmetrical scales

diminishedWholeToneHalfTone : Music.PitchClass.PitchClass -> Scale

diminishedHalfToneWholeTone : Music.PitchClass.PitchClass -> Scale

wholeTone : Music.PitchClass.PitchClass -> Scale

Pentatonic scales

majorPentatonic : Music.PitchClass.PitchClass -> Scale

minorPentatonic : Music.PitchClass.PitchClass -> Scale

Custom scales

custom : Music.PitchClass.PitchClass -> Music.Internal.ScaleType.ScaleType -> Scale

Create a scale from a custom scale type. For use with ScaleType.customPentatonic, ScaleType.customHexatonic, ScaleType.customHeptatonic, and ScaleType.customOctatonic:

myCustomScaleType =
    customPentatonic
        { rootToSecond = Interval.minorThird
        , rootToThird = Interval.perfectFourth
        , rootToFourth = Interval.perfectFifth
        , rootToFifth = Interval.minorSeventh
        }

myCustomScale =
    |> custom PitchClass.c myCustomScaleType

-- Equivalent to `minorPentatonic PitchClass.c`