[{"name":"Music.Analysis","comment":" [Roman numeral analysis](https://en.wikipedia.org/wiki/Roman_numeral_analysis) describes the relationship of a chord to a key. E.g. E minor is the \"iii\" chord in the key of C major.\n\n@docs Analysis\n\n\n# Analysis\n\n@docs analyze\n\n\n# Converting to chords\n\n@docs toChord, triadsByDefault, seventhsByDefault\n\n\n# Other conversions\n\n@docs toString\n\n\n# Constructors\n\n\n## Diatonic scale degrees\n\n@docs i, ii, iii, iv, v, vi, vii\n\n@docs withChordType\n\n\n## Secondary dominants\n\n[Secondary dominants](https://en.wikipedia.org/wiki/Secondary_chord#Secondary_dominant) are dominant chords of a scale degree other than the tonic, e.g. A is the V/ii in C major.\n\n@docs vOfii, vOfiii, vOfiv, vOfv, vOfvi\n\n\n## Chromatic scale degrees\n\nChromatic scale degrees require a chord type to be specified, since they have no defaults:\n\n@docs iSharp, iiSharp, iiiSharp, ivSharp, vSharp, viSharp, viiSharp\n@docs iFlat, iiFlat, iiiFlat, ivFlat, vFlat, viFlat, viiFlat\n\n","unions":[],"aliases":[{"name":"Analysis","comment":" ","args":[],"type":"Music.Internal.Analysis.Analysis"}],"values":[{"name":"analyze","comment":" Analyze a chord in the context of a given key:\n\n    analyze (Chord.minor PitchClass.e) Key.c == iii\n\n    analyze (Chord.major PitchClass.a) Key.c == vOfii\n\n","type":"Music.Chord.Chord -> Music.Internal.Key.Key -> Music.Analysis.Analysis"},{"name":"i","comment":" ","type":"Music.Analysis.Analysis"},{"name":"iFlat","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"iSharp","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"ii","comment":" ","type":"Music.Analysis.Analysis"},{"name":"iiFlat","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"iiSharp","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"iii","comment":" ","type":"Music.Analysis.Analysis"},{"name":"iiiFlat","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"iiiSharp","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"iv","comment":" ","type":"Music.Analysis.Analysis"},{"name":"ivFlat","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"ivSharp","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"seventhsByDefault","comment":" Use seventh chords when converting, if no chord type is specified:\n\n    toChord seventhsByDefault Key.f iv == Chord.majorSeventh PitchClass.bFlat\n\nSeventh chords are the default for harmonizing the scale in jazz music.\n\n","type":"Music.Internal.Analysis.DefaultChordTypes"},{"name":"toChord","comment":" Convert to a chord in the specified key:\n\n    toChord triadsByDefault Key.f iii == Chord.minor PitchClass.a\n\n","type":"Music.Internal.Analysis.DefaultChordTypes -> Music.Internal.Key.Key -> Music.Analysis.Analysis -> Music.Chord.Chord"},{"name":"toString","comment":" Get the symbol for a Roman numeral analysis:\n\n    toString Key.c iv == \"IV\"\n\n    toString Key.cMinor iv == \"iv\"\n\n    toString Key.c (viiFlat ChordType.majorSeventh) == \"♭VIIM7\"\n\nThe `Key` parameter is used to determine whether to render the symbol in the context of a major or minor key.\n\n","type":"Music.Internal.Key.Key -> Music.Analysis.Analysis -> String.String"},{"name":"triadsByDefault","comment":" Use triads when converting, if no chord type is specified:\n\n    toChord triadsByDefault Key.f iv == Chord.major PitchClass.bFlat\n\nTriads are the default for harmonizing the scale in classical music.\n\n","type":"Music.Internal.Analysis.DefaultChordTypes"},{"name":"v","comment":" ","type":"Music.Analysis.Analysis"},{"name":"vFlat","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"vOfii","comment":" ","type":"Music.Analysis.Analysis"},{"name":"vOfiii","comment":" ","type":"Music.Analysis.Analysis"},{"name":"vOfiv","comment":" ","type":"Music.Analysis.Analysis"},{"name":"vOfv","comment":" ","type":"Music.Analysis.Analysis"},{"name":"vOfvi","comment":" ","type":"Music.Analysis.Analysis"},{"name":"vSharp","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"vi","comment":" ","type":"Music.Analysis.Analysis"},{"name":"viFlat","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"viSharp","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"vii","comment":" ","type":"Music.Analysis.Analysis"},{"name":"viiFlat","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"viiSharp","comment":" ","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis"},{"name":"withChordType","comment":" Diatonic scale degrees have default chords types in major or minor scales. This function lets you use others:\n\n    iii\n        |> withChordType ChordType.majorSeventh\n        |> toString -- \"IIImaj7\"\n\n","type":"Music.ChordType.ChordType -> Music.Analysis.Analysis -> Music.Analysis.Analysis"}],"binops":[]},{"name":"Music.Chord","comment":" A [chord](https://en.wikipedia.org/wiki/Chord_%28music%29) is a set of pitch classes that are meant to be sounded together to create [harmony](https://en.wikipedia.org/wiki/Harmony). E.g. a \"G dominant seventh\" chord.\n\n@docs Chord\n\n\n# Helpers\n\n@docs chordType, root, containsPitchClass, detect\n\n\n# Conversion\n\n@docs toPitchClasses, toString\n\n\n# Voicing chords\n\nA chord is defined by a set of pitch classes. But pitch classes can't be heard; only pitches can be. [\"Voicing\"](https://en.wikipedia.org/wiki/Voicing_%28music%29) a chord is the process of:\n\n1.  choosing some number of its pitch classes, and\n2.  turning them into pitches within specific octaves, so that they can be played or sung.\n\nLearn more about how this works in the [Voicing.ThreePart](Music-Voicing-ThreePart), [Voicing.FourPart](Music-Voicing-FourPart), and [Voicing.FivePart](Music-Voicing-FivePart) modules.\n\n@docs voiceThreeParts, voiceFourParts, voiceFiveParts\n\n\n# Constructors\n\n\n## Triads\n\n@docs major, minor, augmented, diminished, sus2, sus4\n\n\n## Added-tone chords\n\n@docs majorSix, majorSixNine, minorSix, minorSixNine, majorAddNine, minorAddNine\n\n\n## Seventh chords\n\n@docs majorSeventh, majorSeventhSharpEleven, minorSeventh, dominantSeventh, diminishedSeventh, halfDiminished, augmentedDominantSeventh, dominantSeventhSus4, minorMajorSeventh\n\n\n## Chords with extensions\n\n@docs majorNinth, minorNinth, dominantNinth, minorEleventh, dominantEleventh, dominantThirteenth\n\n\n## Altered dominant chords\n\n\n### Seventh\n\n@docs dominantSeventhFlatNine, dominantSeventhSharpNine, dominantSeventhFlatNineSharpNine, dominantSeventhFlatNineSharpEleven, dominantSeventhSharpNineSharpEleven, dominantSeventhSharpEleven, dominantSeventhFlatNineFlatThirteen, dominantSeventhSharpNineFlatThirteen, dominantSeventhSharpElevenFlatThirteen, dominantSeventhFlatThirteen\n\n\n### Ninth\n\n@docs dominantNinthSharpEleven, dominantNinthFlatThirteen, dominantNinthSharpElevenFlatThirteen\n\n\n### Thirteenth\n\n@docs dominantThirteenthFlatNine, dominantThirteenthSharpNine, dominantThirteenthFlatNineSharpNine, dominantThirteenthFlatNineSharpEleven, dominantThirteenthSharpNineSharpEleven, dominantThirteenthSharpEleven\n\n\n# Custom chord types\n\n@docs custom\n\n","unions":[],"aliases":[{"name":"Chord","comment":" ","args":[],"type":"Music.Internal.Chord.Chord"}],"values":[{"name":"augmented","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"augmentedDominantSeventh","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"chordType","comment":" Get a chord's type:\n\n    chordType (dominantSeventh PitchClass.a) == ChordType.dominantSeventh\n\n","type":"Music.Chord.Chord -> Music.Internal.ChordType.ChordType"},{"name":"containsPitchClass","comment":" Determine whether a chord contains a given pitch class:\n\n    containsPitchClass PitchClass.cSharp (major PitchClass.a) == True\n\n","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord -> Basics.Bool"},{"name":"custom","comment":" Create a chord from a custom chord type. For use with [ChordType.custom](Music-ChordType#custom):\n\n    myCustomChordType =\n        ChordType.custom\n            |> ChordType.withMinorThird\n            |> ChordType.withDiminishedFifth\n            |> ChordType.withMinorSeventh\n\n    myCustomChord =\n        |> custom PitchClass.c myCustomChordType\n\n    -- Equivalent to `halfDiminishedSeventh PitchClass.c`\n\nYou can also use `custom` to construct a chord from a chord type, in cases where the chord type may vary:\n\n    custom PitchClass.c ChordType.majorSeventh\n        == Chord.majorSeventh PitchClass.c\n\n","type":"Music.Internal.PitchClass.PitchClass -> Music.Internal.ChordType.ChordType -> Music.Chord.Chord"},{"name":"detect","comment":" Detect chords that contain the given pitch classes:\n\n    detect\n        [ ChordType.majorSix\n        , ChordType.minorSeventh\n        ]\n        [ PitchClass.a\n        , PitchClass.c\n        , PitchClass.e\n        , PitchClass.g\n        ]\n        == [ minorSeventh PitchClass.a\n           , majorSix PitchClass.c\n           ]\n\nPassing in a list of chord types to detect is required, since there exists no exhaustive list of valid chords in tonal music.\n\n","type":"List.List Music.Internal.ChordType.ChordType -> List.List Music.Internal.PitchClass.PitchClass -> List.List Music.Chord.Chord"},{"name":"diminished","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"diminishedSeventh","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantEleventh","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantNinth","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantNinthFlatThirteen","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantNinthSharpEleven","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantNinthSharpElevenFlatThirteen","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventh","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhFlatNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhFlatNineFlatThirteen","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhFlatNineSharpEleven","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhFlatNineSharpNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhFlatThirteen","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhSharpEleven","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhSharpElevenFlatThirteen","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhSharpNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhSharpNineFlatThirteen","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhSharpNineSharpEleven","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantSeventhSus4","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantThirteenth","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantThirteenthFlatNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantThirteenthFlatNineSharpEleven","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantThirteenthFlatNineSharpNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantThirteenthSharpEleven","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantThirteenthSharpNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"dominantThirteenthSharpNineSharpEleven","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"halfDiminished","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"major","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"majorAddNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"majorNinth","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"majorSeventh","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"majorSeventhSharpEleven","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"majorSix","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"majorSixNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"minor","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"minorAddNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"minorEleventh","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"minorMajorSeventh","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"minorNinth","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"minorSeventh","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"minorSix","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"minorSixNine","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"root","comment":" Get a chord's root:\n\n    root (dominantSeventh PitchClass.a) == PitchClass.a\n\n","type":"Music.Chord.Chord -> Music.Internal.PitchClass.PitchClass"},{"name":"sus2","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"sus4","comment":" ","type":"Music.Internal.PitchClass.PitchClass -> Music.Chord.Chord"},{"name":"toPitchClasses","comment":" Get the pitch classes in a chord:\n\n    toPitchClasses (major PitchClass.a)\n        == [ PitchClass.a\n           , PitchClass.cSharp\n           , PitchClass.e\n           ]\n\nNote: for converting a chord to pitches, I recommend looking at the functions in the [Voicing chords](#voicing-chords) section below.\n\n","type":"Music.Chord.Chord -> List.List Music.Internal.PitchClass.PitchClass"},{"name":"toString","comment":" Get the chord symbol for a chord:\n\n    toString (dominantNinth PitchClass.a) == \"A9\"\n\nLooking for more flexibility? Look at [ChordType.classify](Music-ChordType#classify).\n\n","type":"Music.Chord.Chord -> String.String"},{"name":"voiceFiveParts","comment":" ","type":"{ voiceOne : Music.Range.Range, voiceTwo : Music.Range.Range, voiceThree : Music.Range.Range, voiceFour : Music.Range.Range, voiceFive : Music.Range.Range } -> List.List Music.Internal.Voicing.FivePart.VoicingMethod -> Music.Chord.Chord -> List.List Music.Internal.Voicing.FivePart.Voicing"},{"name":"voiceFourParts","comment":" ","type":"{ voiceOne : Music.Range.Range, voiceTwo : Music.Range.Range, voiceThree : Music.Range.Range, voiceFour : Music.Range.Range } -> List.List Music.Internal.Voicing.FourPart.VoicingMethod -> Music.Chord.Chord -> List.List Music.Internal.Voicing.FourPart.Voicing"},{"name":"voiceThreeParts","comment":" ","type":"{ voiceOne : Music.Range.Range, voiceTwo : Music.Range.Range, voiceThree : Music.Range.Range } -> List.List Music.Internal.Voicing.ThreePart.VoicingMethod -> Music.Chord.Chord -> List.List Music.Internal.Voicing.ThreePart.Voicing"}],"binops":[]},{"name":"Music.Chord.Classification","comment":" This module contains a `Classification` type you can use for making custom views of chord symbols.\n\n\n# Overview\n\nIn my implementation of the [ChordType.toString](Music-ChordType#toString) function, I've done my best to cover what I consider the usual cases, using chord symbols that are likely to be recognized by a majority of musicians. If `ChordType.toString` works for your purposes, then you don't need this module.\n\nBut chord symbols vary greatly with musical style, educational background, and personal preference. The choices I've made may not appeal to you!\n\nMaybe, for example, you want to use modern jazz symbols like \"∆7(+11)\" and \"7(+9-13)\". Or maybe you want to write them out in plain English like \"dominant seventh (sharp nine, flat thirteen)\". You may even want to convert to a more complex view than a `String` can express, like [SVG](https://package.elm-lang.org/packages/elm/svg/latest/) or [elm-ui](https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/).\n\nIf any of these is the case, you can use the `Classification` type to write your own custom chord symbol function:\n\n1.  Call [ChordType.classify](Music-ChordType#classify) on a `ChordType` to return an instance of `Classification`.\n2.  Destructure it with a `case` statement and handle each branch to create your custom view.\n\nA good place to start would be to take a look at the [source](https://github.com/duncanmalashock/elm-music-theory/blob/master/src/Music/Internal/ChordType.elm#L444) for `ChordType.toString` to see how I did it.\n\n@docs Classification, Triad, SixthOrSeventh, UnalteredExtension, AlteredExtension\n\n","unions":[{"name":"AlteredExtension","comment":" ","args":[],"cases":[["MinorNinth",[]],["AugmentedNinth",[]],["AugmentedEleventh",[]],["MinorThirteenth",[]]]},{"name":"Classification","comment":" Get an instance of this type by using `ChordType.classify`:\n\n    ChordType.classify ChordType.dominantNinthFlatThirteen\n        == Classification MajorTriad (Just MinorSeventh) Ninth [ MinorThirteenth ]\n\nThis `Classification` type is my best attempt to codify the chord type taxonomy, as I understand it, into a type you can destructure for your own purposes (i.e. custom views of chord symbols).\n\nBe aware that there are a lot of edge cases in the area of chord classification, and this type can represent some combinations that are unusual, and even impractical, but not clearly invalid.\n\nFor instance, I have never seen a \"m6(♯11)\" chord, but I have also never seen a rule that explains why such a chord cannot be made.\n\nUse your judgment as to which of these cases you want to handle, and which you want to ignore. Take a look at the [source](https://github.com/duncanmalashock/elm-music-theory/blob/master/src/Music/Internal/ChordType.elm#L444) for `ChordType.toString` to see how I approached this question.\n\n","args":[],"cases":[["Classification",["Music.Chord.Classification.Triad","Maybe.Maybe Music.Chord.Classification.SixthOrSeventh","Maybe.Maybe Music.Chord.Classification.UnalteredExtension","List.List Music.Chord.Classification.AlteredExtension"]],["Unclassifiable",["List.List Music.Interval.Interval"]]]},{"name":"SixthOrSeventh","comment":" ","args":[],"cases":[["Sixth",[]],["MajorSeventh",[]],["MinorSeventh",[]],["DiminishedSeventh",[]]]},{"name":"Triad","comment":" ","args":[],"cases":[["MajorTriad",[]],["AugmentedTriad",[]],["MinorTriad",[]],["DiminishedTriad",[]],["Sus2Triad",[]],["Sus4Triad",[]]]},{"name":"UnalteredExtension","comment":" ","args":[],"cases":[["Ninth",[]],["Eleventh",[]],["Thirteenth",[]]]}],"aliases":[],"values":[],"binops":[]},{"name":"Music.ChordType","comment":" A [chord type](https://en.wikipedia.org/wiki/Chord_%28music%29#Common_types_of_chords) describes the [factors](https://en.wikipedia.org/wiki/Factor_%28chord%29) contained in a chord, with no specific root pitch class. E.g. a \"dominant seventh\" chord.\n\n@docs ChordType\n\n\n# Chord factors\n\nChord [factors](https://en.wikipedia.org/wiki/Factor_%28chord%29) (such as the \"third\", \"fifth\", etc. of a chord) are represented as `Interval`s.\n\n@docs factors, contains\n\n\n## Categorizing factors\n\nCategorize factors into certain useful data structures. Helpful when creating [custom voicing methods](Music-Voicing-FivePart#custom-voicing-methods).\n\n@docs categorizeFactors, CategorizedFactors\n@docs availableTensions, AvailableTensions\n\n\n# Conversion\n\n@docs toString\n\n\n# Groups\n\nLists of commonly-grouped chord types. Note that these are incomplete, and only represent the chord types contained in this module, since there is no exhaustive list of all valid chord types in tonal music.\n\n@docs all\n@docs triads, sixthAndSeventhChords\n@docs majorChords, minorChords, dominantChords, alteredDominantChords\n\n\n# Constructors\n\n\n## Triads\n\n@docs major, minor, augmented, diminished, sus2, sus4\n\n\n## Added-tone chords\n\n@docs majorSix, majorSixNine, minorSix, minorSixNine, majorAddNine, minorAddNine\n\n\n## Seventh chords\n\n@docs majorSeventh, majorSeventhSharpEleven, minorSeventh, dominantSeventh, diminishedSeventh, halfDiminishedSeventh, augmentedDominantSeventh, dominantSeventhSus4, minorMajorSeventh\n\n\n## Chords with extensions\n\n@docs majorNinth, minorNinth, dominantNinth, minorEleventh, dominantEleventh, dominantThirteenth\n\n\n## Altered dominant chords\n\n\n### Seventh\n\n@docs dominantSeventhFlatNine, dominantSeventhSharpNine, dominantSeventhFlatNineSharpNine, dominantSeventhFlatNineSharpEleven, dominantSeventhSharpNineSharpEleven, dominantSeventhSharpEleven, dominantSeventhFlatNineFlatThirteen, dominantSeventhSharpNineFlatThirteen, dominantSeventhSharpElevenFlatThirteen, dominantSeventhFlatThirteen\n\n\n### Ninth\n\n@docs dominantNinthSharpEleven, dominantNinthFlatThirteen, dominantNinthSharpElevenFlatThirteen\n\n\n### Thirteenth\n\n@docs dominantThirteenthFlatNine, dominantThirteenthSharpNine, dominantThirteenthFlatNineSharpNine, dominantThirteenthFlatNineSharpEleven, dominantThirteenthSharpNineSharpEleven, dominantThirteenthSharpEleven\n\n\n# Custom chord types\n\n@docs custom\n@docs withMajorThird, withMinorThird, withSuspendedSecond, withSuspendedFourth, withFifth, withSharpFifth, withFlatFifth, withSixth, withMajorSeventh, withMinorSeventh, withDiminishedSeventh, withNinth, withSharpNinth, withFlatNinth, withEleventh, withSharpEleventh, withThirteenth, withFlatThirteenth\n\n\n# Custom chord symbols\n\n@docs classify\n\n","unions":[],"aliases":[{"name":"AvailableTensions","comment":" ","args":[],"type":"{ root : { true : Music.Internal.Interval.Interval, substitutes : List.List Music.Internal.Interval.Interval }, third : { true : Music.Internal.Interval.Interval, substitutes : List.List Music.Internal.Interval.Interval }, fifth : { true : Music.Internal.Interval.Interval, substitutes : List.List Music.Internal.Interval.Interval }, seventh : { true : Music.Internal.Interval.Interval, substitutes : List.List Music.Internal.Interval.Interval } }"},{"name":"CategorizedFactors","comment":" ","args":[],"type":"{ third : Music.Internal.Interval.Interval, fifth : Music.Internal.Interval.Interval, sixthOrSeventh : Maybe.Maybe Music.Internal.Interval.Interval, ninth : List.List Music.Internal.Interval.Interval, eleventh : Maybe.Maybe Music.Internal.Interval.Interval, thirteenth : Maybe.Maybe Music.Internal.Interval.Interval }"},{"name":"ChordType","comment":" ","args":[],"type":"Music.Internal.ChordType.ChordType"}],"values":[{"name":"all","comment":" All the chord types listed in this module.\n","type":"List.List Music.ChordType.ChordType"},{"name":"alteredDominantChords","comment":" All chord types with a dominant quality that also have [altered extensions](https://en.wikipedia.org/wiki/Altered_chord).\n","type":"List.List Music.ChordType.ChordType"},{"name":"augmented","comment":" ","type":"Music.ChordType.ChordType"},{"name":"augmentedDominantSeventh","comment":" ","type":"Music.ChordType.ChordType"},{"name":"availableTensions","comment":" Organize the factors in a chord type into their jazz-theory category and their possible substitutes, often known referred to as \"available tensions\".\n\n    availableTensions majorSeventh =\n        { root =\n            { true = Interval.perfectUnison\n            , substitutes = [ Interval.majorSecond ]\n            }\n        , third =\n            { true = Interval.majorThird\n            , substitutes = []\n            }\n        , fifth =\n            { true = Interval.perfectFifth\n            , substitutes = []\n            }\n        , seventh =\n            { true = Interval.majorSeventh\n            , substitutes = []\n            }\n        }\n\n","type":"Music.ChordType.ChordType -> Maybe.Maybe Music.ChordType.AvailableTensions"},{"name":"categorizeFactors","comment":" Categorize the factors in a chord type:\n\n    categorizeFactors minorSix\n        == { third = Interval.minorThird\n           , fifth = Interval.perfectFifth\n           , sixthOrSeventh = Just Interval.majorSixth\n           , ninth = []\n           , eleventh = Nothing\n           , thirteenth = Nothing\n           }\n\n","type":"Music.ChordType.ChordType -> Maybe.Maybe Music.ChordType.CategorizedFactors"},{"name":"classify","comment":" Get a chord type's classification:\n\n    classify dominantNinthFlatThirteen\n        == Classification MajorTriad (Just MinorSeventh) Ninth [ MinorThirteenth ]\n\nYou can read more about how to use the `Classification` type in the [Chord.Classification](Music-Chord-Classification) module.\n\n","type":"Music.ChordType.ChordType -> Music.Chord.Classification.Classification"},{"name":"contains","comment":" Determine whether a chord type contains a given factor:\n\n    contains Interval.diminishedFifth halfDiminishedSeventh == True\n\n","type":"Music.Internal.Interval.Interval -> Music.Internal.ChordType.ChordType -> Basics.Bool"},{"name":"custom","comment":" Define a custom chord type. Start with `custom` and apply the chord factor functions below:\n\n    custom\n        |> withMinorThird\n        |> withDiminishedFifth\n        |> withMinorSeventh\n    -- equivalent to `halfDiminishedSeventh`\n\nNote: because there is no unified model for naming any given chord, your custom chord may not work with the [toString](Music-ChordType#toString) function in this module.\n\n","type":"Music.ChordType.ChordType"},{"name":"diminished","comment":" ","type":"Music.ChordType.ChordType"},{"name":"diminishedSeventh","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantChords","comment":" All chord types with a dominant quality.\n","type":"List.List Music.ChordType.ChordType"},{"name":"dominantEleventh","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantNinth","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantNinthFlatThirteen","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantNinthSharpEleven","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantNinthSharpElevenFlatThirteen","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventh","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhFlatNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhFlatNineFlatThirteen","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhFlatNineSharpEleven","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhFlatNineSharpNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhFlatThirteen","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhSharpEleven","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhSharpElevenFlatThirteen","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhSharpNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhSharpNineFlatThirteen","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhSharpNineSharpEleven","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantSeventhSus4","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantThirteenth","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantThirteenthFlatNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantThirteenthFlatNineSharpEleven","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantThirteenthFlatNineSharpNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantThirteenthSharpEleven","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantThirteenthSharpNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"dominantThirteenthSharpNineSharpEleven","comment":" ","type":"Music.ChordType.ChordType"},{"name":"factors","comment":" Get the factors contained in a chord type:\n\n    factors minor\n        == [ Interval.perfectUnison\n           , Interval.minorThird\n           , Interval.perfectFifth\n           ]\n\n","type":"Music.ChordType.ChordType -> List.List Music.Internal.Interval.Interval"},{"name":"halfDiminishedSeventh","comment":" ","type":"Music.ChordType.ChordType"},{"name":"major","comment":" ","type":"Music.ChordType.ChordType"},{"name":"majorAddNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"majorChords","comment":" All chord types with a major quality.\n","type":"List.List Music.ChordType.ChordType"},{"name":"majorNinth","comment":" ","type":"Music.ChordType.ChordType"},{"name":"majorSeventh","comment":" ","type":"Music.ChordType.ChordType"},{"name":"majorSeventhSharpEleven","comment":" ","type":"Music.ChordType.ChordType"},{"name":"majorSix","comment":" ","type":"Music.ChordType.ChordType"},{"name":"majorSixNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"minor","comment":" ","type":"Music.ChordType.ChordType"},{"name":"minorAddNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"minorChords","comment":" All chord types with a minor quality.\n","type":"List.List Music.ChordType.ChordType"},{"name":"minorEleventh","comment":" ","type":"Music.ChordType.ChordType"},{"name":"minorMajorSeventh","comment":" ","type":"Music.ChordType.ChordType"},{"name":"minorNinth","comment":" ","type":"Music.ChordType.ChordType"},{"name":"minorSeventh","comment":" ","type":"Music.ChordType.ChordType"},{"name":"minorSix","comment":" ","type":"Music.ChordType.ChordType"},{"name":"minorSixNine","comment":" ","type":"Music.ChordType.ChordType"},{"name":"sixthAndSeventhChords","comment":" All chord types with a sixth or seventh added to a triad.\n","type":"List.List Music.ChordType.ChordType"},{"name":"sus2","comment":" ","type":"Music.ChordType.ChordType"},{"name":"sus4","comment":" ","type":"Music.ChordType.ChordType"},{"name":"toString","comment":" Get the chord symbol for a chord type:\n\n    toString majorSeventh == \"M7\"\n\nWant more control over chord symbols? See the [classify](Music-ChordType#classify) function.\n\n","type":"Music.ChordType.ChordType -> String.String"},{"name":"triads","comment":" All chord types with only a root, third (or suspension), and fifth.\n","type":"List.List Music.ChordType.ChordType"},{"name":"withDiminishedSeventh","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withEleventh","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withFifth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withFlatFifth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withFlatNinth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withFlatThirteenth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withMajorSeventh","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withMajorThird","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withMinorSeventh","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withMinorThird","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withNinth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withSharpEleventh","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withSharpFifth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withSharpNinth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withSixth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withSuspendedFourth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withSuspendedSecond","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"},{"name":"withThirteenth","comment":" ","type":"Music.ChordType.ChordType -> Music.ChordType.ChordType"}],"binops":[]},{"name":"Music.Interval","comment":" An [interval](https://en.wikipedia.org/wiki/Interval_%28music%29) is a measure of the distance between two pitches. E.g. a \"perfect fifth\".\n\n@docs Interval\n\n@docs betweenPitches\n\n\n# Comparison\n\n@docs isEqualTo, isGreaterThan, isLessThan\n\n\n# Operations\n\n@docs add, subtract, simplify, addOctave\n\n\n# Direction\n\nIntervals have direction: a perfect fifth up is different from a perfect fifth down.\n\n@docs reverse, isUp, isDown\n\n\n# Conversion\n\n@docs semitones, toString\n\n\n# Ranges\n\n@docs Range, range\n\n\n# Constructors\n\n\n## Simple intervals\n\n\n### Diatonic\n\n@docs perfectUnison, minorSecond, majorSecond, minorThird, majorThird, perfectFourth, perfectFifth, minorSixth, majorSixth, minorSeventh, majorSeventh, perfectOctave\n\n\n### Chromatic\n\n@docs augmentedUnison, augmentedSecond, augmentedThird, augmentedFourth, augmentedFifth, augmentedSixth, augmentedSeventh\n@docs diminishedSecond, diminishedThird, diminishedFourth, diminishedFifth, diminishedSixth, diminishedSeventh, diminishedOctave\n\n\n## Compound intervals\n\nNote: This module includes constructors for compound intervals up to the thirteenth, which is the highest interval found in standard chords in tonal music. If you need larger compound intervals, take a look at the [add](#add) or [addOctave](#addOctave) helper functions in this module.\n\n\n### Diatonic\n\n@docs minorNinth, majorNinth, minorTenth, majorTenth, perfectEleventh, perfectTwelfth, minorThirteenth, majorThirteenth\n\n\n### Chromatic\n\n@docs augmentedOctave, augmentedNinth, augmentedEleventh, augmentedTwelfth\n@docs diminishedTwelfth\n\n","unions":[],"aliases":[{"name":"Interval","comment":" ","args":[],"type":"Music.Internal.Interval.Interval"},{"name":"Range","comment":" ","args":[],"type":"{ min : Music.Internal.Interval.Interval, max : Music.Internal.Interval.Interval }"}],"values":[{"name":"add","comment":" Add two intervals together:\n\n    add majorSecond majorThird == augmentedFourth\n\n","type":"Music.Interval.Interval -> Music.Interval.Interval -> Music.Interval.Interval"},{"name":"addOctave","comment":" Add an octave to an interval:\n\n    addOctave majorSecond == majorNinth\n\n","type":"Music.Interval.Interval -> Music.Interval.Interval"},{"name":"augmentedEleventh","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedFifth","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedFourth","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedNinth","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedOctave","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedSecond","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedSeventh","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedSixth","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedThird","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedTwelfth","comment":" ","type":"Music.Interval.Interval"},{"name":"augmentedUnison","comment":" ","type":"Music.Interval.Interval"},{"name":"betweenPitches","comment":" Get the interval between two pitches:\n\n    betweenPitches Pitch.c4 Pitch.g4 == perfectFifth\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Internal.Pitch.Pitch -> Music.Interval.Interval"},{"name":"diminishedFifth","comment":" ","type":"Music.Interval.Interval"},{"name":"diminishedFourth","comment":" ","type":"Music.Interval.Interval"},{"name":"diminishedOctave","comment":" ","type":"Music.Interval.Interval"},{"name":"diminishedSecond","comment":" ","type":"Music.Interval.Interval"},{"name":"diminishedSeventh","comment":" ","type":"Music.Interval.Interval"},{"name":"diminishedSixth","comment":" ","type":"Music.Interval.Interval"},{"name":"diminishedThird","comment":" ","type":"Music.Interval.Interval"},{"name":"diminishedTwelfth","comment":" ","type":"Music.Interval.Interval"},{"name":"isDown","comment":" Find out whether an interval is in the \"down\" direction:\n\n    isDown (reverse majorThird) == True\n\n","type":"Music.Interval.Interval -> Basics.Bool"},{"name":"isEqualTo","comment":" Check whether two intervals are equivalent:\n\n    isEqualTo augmentedFourth diminishedFifth == True\n\n","type":"Music.Interval.Interval -> Music.Interval.Interval -> Basics.Bool"},{"name":"isGreaterThan","comment":" Check whether the distance of one interval is greater than another:\n\n    isGreaterThan perfectFifth perfectUnison == True\n\n","type":"Music.Interval.Interval -> Music.Interval.Interval -> Basics.Bool"},{"name":"isLessThan","comment":" Check whether the distance of one interval is less than another:\n\n    isLessThan perfectFifth perfectUnison == False\n\n","type":"Music.Interval.Interval -> Music.Interval.Interval -> Basics.Bool"},{"name":"isUp","comment":" Find out whether an interval is in the \"up\" direction:\n\n    isUp majorThird == True\n\n","type":"Music.Interval.Interval -> Basics.Bool"},{"name":"majorNinth","comment":" ","type":"Music.Interval.Interval"},{"name":"majorSecond","comment":" ","type":"Music.Interval.Interval"},{"name":"majorSeventh","comment":" ","type":"Music.Interval.Interval"},{"name":"majorSixth","comment":" ","type":"Music.Interval.Interval"},{"name":"majorTenth","comment":" ","type":"Music.Interval.Interval"},{"name":"majorThird","comment":" ","type":"Music.Interval.Interval"},{"name":"majorThirteenth","comment":" ","type":"Music.Interval.Interval"},{"name":"minorNinth","comment":" ","type":"Music.Interval.Interval"},{"name":"minorSecond","comment":" ","type":"Music.Interval.Interval"},{"name":"minorSeventh","comment":" ","type":"Music.Interval.Interval"},{"name":"minorSixth","comment":" ","type":"Music.Interval.Interval"},{"name":"minorTenth","comment":" ","type":"Music.Interval.Interval"},{"name":"minorThird","comment":" ","type":"Music.Interval.Interval"},{"name":"minorThirteenth","comment":" ","type":"Music.Interval.Interval"},{"name":"perfectEleventh","comment":" ","type":"Music.Interval.Interval"},{"name":"perfectFifth","comment":" ","type":"Music.Interval.Interval"},{"name":"perfectFourth","comment":" ","type":"Music.Interval.Interval"},{"name":"perfectOctave","comment":" ","type":"Music.Interval.Interval"},{"name":"perfectTwelfth","comment":" ","type":"Music.Interval.Interval"},{"name":"perfectUnison","comment":" ","type":"Music.Interval.Interval"},{"name":"range","comment":" Create a range of intervals:\n\n    range perfectUnison perfectFifth\n        == { min = perfectUnison\n           , max = perfectFifth\n           }\n\n","type":"Music.Interval.Interval -> Music.Interval.Interval -> Music.Interval.Range"},{"name":"reverse","comment":" Reverse the direction of an interval\n","type":"Music.Interval.Interval -> Music.Interval.Interval"},{"name":"semitones","comment":" Get the number of [semitones](https://en.wikipedia.org/wiki/Semitone) an interval spans:\n\n    semitones majorThird == 4\n\n","type":"Music.Interval.Interval -> Basics.Int"},{"name":"simplify","comment":" Convert any interval to its [simple](https://en.wikipedia.org/wiki/Interval_%28music%29#Simple_and_compound) form. A simple interval is one that spans an octave or less.\n\n    simplify majorThirteenth == majorSixth\n\n","type":"Music.Interval.Interval -> Music.Interval.Interval"},{"name":"subtract","comment":" Subtract two intervals:\n\n    subtract majorSecond minorThird == minorSecond\n\n","type":"Music.Interval.Interval -> Music.Interval.Interval -> Music.Interval.Interval"},{"name":"toString","comment":" Get the [short name](https://en.wikipedia.org/wiki/Interval_%28music%29#Alternative_interval_naming_conventions) of an interval:\n\n    toString perfectFifth == \"P5\"\n\nIntervals in the \"down\" direction are shown with a negative sign:\n\n    toString (reverse perfectFifth) == \"-P5\"\n\n","type":"Music.Interval.Interval -> String.String"}],"binops":[]},{"name":"Music.Key","comment":" A [key](https://en.wikipedia.org/wiki/Key_%28music%29) defines a relationship between a set of pitch classes in a composition. E.g. the \"key of D major\".\n\n@docs Key\n\n\n# Helpers\n\n@docs tonic, scale, isMajor, isMinor, signature\n\n\n# Related keys\n\n@docs relative, parallel\n\n\n# Conversion\n\n@docs toString\n\n\n# Constructors\n\n\n## Major keys\n\n@docs c, f, bFlat, eFlat, aFlat, dFlat, gFlat\n@docs g, d, a, e, b, fSharp\n\n\n## Minor keys\n\n@docs aMinor, dMinor, gMinor, cMinor, fMinor, bFlatMinor, eFlatMinor\n@docs eMinor, bMinor, fSharpMinor, cSharpMinor, gSharpMinor\n\n","unions":[],"aliases":[{"name":"Key","comment":" ","args":[],"type":"Music.Internal.Key.Key"}],"values":[{"name":"a","comment":" ","type":"Music.Key.Key"},{"name":"aFlat","comment":" ","type":"Music.Key.Key"},{"name":"aMinor","comment":" ","type":"Music.Key.Key"},{"name":"b","comment":" ","type":"Music.Key.Key"},{"name":"bFlat","comment":" ","type":"Music.Key.Key"},{"name":"bFlatMinor","comment":" ","type":"Music.Key.Key"},{"name":"bMinor","comment":" ","type":"Music.Key.Key"},{"name":"c","comment":" ","type":"Music.Key.Key"},{"name":"cMinor","comment":" ","type":"Music.Key.Key"},{"name":"cSharpMinor","comment":" ","type":"Music.Key.Key"},{"name":"d","comment":" ","type":"Music.Key.Key"},{"name":"dFlat","comment":" ","type":"Music.Key.Key"},{"name":"dMinor","comment":" ","type":"Music.Key.Key"},{"name":"e","comment":" ","type":"Music.Key.Key"},{"name":"eFlat","comment":" ","type":"Music.Key.Key"},{"name":"eFlatMinor","comment":" ","type":"Music.Key.Key"},{"name":"eMinor","comment":" ","type":"Music.Key.Key"},{"name":"f","comment":" ","type":"Music.Key.Key"},{"name":"fMinor","comment":" ","type":"Music.Key.Key"},{"name":"fSharp","comment":" ","type":"Music.Key.Key"},{"name":"fSharpMinor","comment":" ","type":"Music.Key.Key"},{"name":"g","comment":" ","type":"Music.Key.Key"},{"name":"gFlat","comment":" ","type":"Music.Key.Key"},{"name":"gMinor","comment":" ","type":"Music.Key.Key"},{"name":"gSharpMinor","comment":" ","type":"Music.Key.Key"},{"name":"isMajor","comment":" Check whether a key is major:\n\n    isMajor bFlat == True\n\n","type":"Music.Key.Key -> Basics.Bool"},{"name":"isMinor","comment":" Check whether a key is minor:\n\n    isMinor cSharpMinor == True\n\n","type":"Music.Key.Key -> Basics.Bool"},{"name":"parallel","comment":" Get the [parallel minor or parallel major](https://en.wikipedia.org/wiki/Parallel_key) of a key:\n\n    parallel f == fMinor\n\n    parallel cSharpMinor == cSharp\n\n","type":"Music.Key.Key -> Music.Key.Key"},{"name":"relative","comment":" Get the [relative minor or relative major](https://en.wikipedia.org/wiki/Relative_key) of a key:\n\n    relative f == dMinor\n\n    relative cSharpMinor == e\n\n","type":"Music.Key.Key -> Music.Key.Key"},{"name":"scale","comment":" Get the scale for a key:\n\n    scale aFlat == Scale.major PitchClass.aFlat\n\n","type":"Music.Key.Key -> Music.Internal.Scale.Scale"},{"name":"signature","comment":" Get the [key signature](https://en.wikipedia.org/wiki/Key_signature) for a key as a list of the pitch classes that are sharpened or flattened:\n\n    signature bFlat == [ PitchClass.bFlat, PitchClass.eFlat ]\n\n","type":"Music.Key.Key -> List.List Music.PitchClass.PitchClass"},{"name":"toString","comment":" Get the name of a key:\n\n    toString eFlat == \"E♭\"\n\n    toString aMinor == \"Am\"\n\n","type":"Music.Key.Key -> String.String"},{"name":"tonic","comment":" Get the tonic pitch class for a key:\n\n    tonic gMinor == PitchClass.g\n\n","type":"Music.Key.Key -> Music.PitchClass.PitchClass"}],"binops":[]},{"name":"Music.Pitch","comment":" A [pitch](https://en.wikipedia.org/wiki/Pitch_%28music%29) represents a specific frequency of sound with a letter name, octave, and accidental. E.g. the pitch \"B♭4\".\n\n@docs Pitch\n\n\n# Helpers\n\n@docs transposeUp, transposeDown, intervalBetween, areEnharmonicEquivalents, octave\n\n\n# Generating\n\n@docs chromaticRun\n\n\n# Conversion\n\n@docs semitones, toMIDINoteNumber, toFrequency, toString, fromPitchClassInOctave\n\n\n# Respelling\n\nEquivalent pitches can be [spelled](https://en.wikipedia.org/wiki/Enharmonic) multiple ways. These functions help with respelling pitches for certain circumstances.\n\n@docs normalize, simplify\n\n\n# Constructors\n\n@docs c0, c1, c2, c3, c4, c5, c6, c7, c8\n@docs cSharp0, cSharp1, cSharp2, cSharp3, cSharp4, cSharp5, cSharp6, cSharp7, cSharp8\n@docs d0, d1, d2, d3, d4, d5, d6, d7, d8\n@docs dFlat0, dFlat1, dFlat2, dFlat3, dFlat4, dFlat5, dFlat6, dFlat7, dFlat8\n@docs dSharp0, dSharp1, dSharp2, dSharp3, dSharp4, dSharp5, dSharp6, dSharp7, dSharp8\n@docs e0, e1, e2, e3, e4, e5, e6, e7, e8\n@docs eFlat0, eFlat1, eFlat2, eFlat3, eFlat4, eFlat5, eFlat6, eFlat7, eFlat8\n@docs f0, f1, f2, f3, f4, f5, f6, f7, f8\n@docs fSharp0, fSharp1, fSharp2, fSharp3, fSharp4, fSharp5, fSharp6, fSharp7, fSharp8\n@docs g0, g1, g2, g3, g4, g5, g6, g7, g8\n@docs gFlat0, gFlat1, gFlat2, gFlat3, gFlat4, gFlat5, gFlat6, gFlat7, gFlat8\n@docs gSharp0, gSharp1, gSharp2, gSharp3, gSharp4, gSharp5, gSharp6, gSharp7, gSharp8\n@docs a0, a1, a2, a3, a4, a5, a6, a7, a8\n@docs aFlat0, aFlat1, aFlat2, aFlat3, aFlat4, aFlat5, aFlat6, aFlat7, aFlat8\n@docs aSharp0, aSharp1, aSharp2, aSharp3, aSharp4, aSharp5, aSharp6, aSharp7, aSharp8\n@docs b0, b1, b2, b3, b4, b5, b6, b7, b8\n@docs bFlat0, bFlat1, bFlat2, bFlat3, bFlat4, bFlat5, bFlat6, bFlat7, bFlat8\n\n\n# Less common pitches\n\nThese are used less frequently in music. Most likely you want a pitch from the previous section.\n\n\n## Enharmonic equivalents of natural notes\n\n@docs cFlat1, cFlat2, cFlat3, cFlat4, cFlat5, cFlat6, cFlat7, cFlat8\n@docs eSharp0, eSharp1, eSharp2, eSharp3, eSharp4, eSharp5, eSharp6, eSharp7, eSharp8\n@docs fFlat0, fFlat1, fFlat2, fFlat3, fFlat4, fFlat5, fFlat6, fFlat7, fFlat8\n@docs bSharp0, bSharp1, bSharp2, bSharp3, bSharp4, bSharp5, bSharp6, bSharp7, bSharp8\n\n","unions":[],"aliases":[{"name":"Pitch","comment":" ","args":[],"type":"Music.Internal.Pitch.Pitch"}],"values":[{"name":"a0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"a1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"a2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"a3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"a4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"a5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"a6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"a7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"a8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aFlat0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aFlat1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aFlat2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aFlat3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aFlat4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aFlat5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aFlat6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aFlat7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aFlat8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aSharp0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aSharp1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aSharp2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aSharp3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aSharp4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aSharp5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aSharp6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aSharp7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"aSharp8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"areEnharmonicEquivalents","comment":" Check whether two pitches are enharmonic equivalents of each other. [Enharmonic equivalents](https://en.wikipedia.org/wiki/Enharmonic) are two pitches with different names but the same sound:\n\n    areEnharmonicEquivalents cSharp4 dFlat4 == True\n\n","type":"Music.Pitch.Pitch -> Music.Pitch.Pitch -> Basics.Bool"},{"name":"b0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"b1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"b2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"b3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"b4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"b5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"b6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"b7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"b8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bFlat0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bFlat1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bFlat2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bFlat3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bFlat4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bFlat5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bFlat6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bFlat7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bFlat8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bSharp0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bSharp1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bSharp2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bSharp3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bSharp4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bSharp5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bSharp6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bSharp7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"bSharp8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"c0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"c1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"c2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"c3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"c4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"c5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"c6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"c7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"c8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cFlat1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cFlat2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cFlat3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cFlat4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cFlat5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cFlat6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cFlat7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cFlat8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cSharp0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cSharp1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cSharp2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cSharp3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cSharp4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cSharp5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cSharp6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cSharp7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"cSharp8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"chromaticRun","comment":" Generate a section of the ascending or descending [chromatic scale](https://en.wikipedia.org/wiki/Chromatic_scale) between two pitches:\n\n    chromaticRun a4 d5\n        == [ a4\n           , aSharp4\n           , b4\n           , c5\n           , cSharp5\n           , d5\n           ]\n\nAscending runs use sharps; descending runs use flats:\n\n    chromaticRun d5 a4\n        == [ d5\n           , dFlat5\n           , c5\n           , b4\n           , bFlat4\n           , a4\n           ]\n\n","type":"Music.Pitch.Pitch -> Music.Pitch.Pitch -> List.List Music.Pitch.Pitch"},{"name":"d0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"d1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"d2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"d3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"d4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"d5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"d6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"d7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"d8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dFlat0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dFlat1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dFlat2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dFlat3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dFlat4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dFlat5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dFlat6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dFlat7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dFlat8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dSharp0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dSharp1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dSharp2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dSharp3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dSharp4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dSharp5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dSharp6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dSharp7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"dSharp8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"e0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"e1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"e2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"e3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"e4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"e5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"e6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"e7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"e8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eFlat0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eFlat1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eFlat2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eFlat3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eFlat4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eFlat5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eFlat6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eFlat7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eFlat8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eSharp0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eSharp1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eSharp2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eSharp3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eSharp4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eSharp5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eSharp6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eSharp7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"eSharp8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"f0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"f1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"f2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"f3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"f4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"f5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"f6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"f7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"f8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fFlat0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fFlat1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fFlat2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fFlat3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fFlat4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fFlat5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fFlat6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fFlat7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fFlat8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fSharp0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fSharp1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fSharp2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fSharp3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fSharp4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fSharp5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fSharp6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fSharp7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fSharp8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"fromPitchClassInOctave","comment":" Create a pitch from a pitch class and octave number:\n\n    fromPitchClassInOctave 4 c == c4\n\n","type":"Basics.Int -> Music.Internal.PitchClass.PitchClass -> Music.Pitch.Pitch"},{"name":"g0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"g1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"g2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"g3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"g4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"g5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"g6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"g7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"g8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gFlat0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gFlat1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gFlat2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gFlat3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gFlat4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gFlat5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gFlat6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gFlat7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gFlat8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gSharp0","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gSharp1","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gSharp2","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gSharp3","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gSharp4","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gSharp5","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gSharp6","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gSharp7","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"gSharp8","comment":" ","type":"Music.Internal.Pitch.Pitch"},{"name":"intervalBetween","comment":" Get the interval between two pitches:\n\n    intervalBetween c4 g4 == Interval.perfectFifth\n\n","type":"Music.Pitch.Pitch -> Music.Pitch.Pitch -> Music.Internal.Interval.Interval"},{"name":"normalize","comment":" Respell a pitch with at most two accidentals:\n\n    bTripleSharp4 =\n        bSharp4\n            |> transposeUp Interval.augmentedUnison\n            |> transposeUp Interval.augmentedUnison\n\n    normalize bTripleSharp4\n        == d5\n\nPitches with three or more accidentals are theoretically possible, but extremely unlikely in practice; most notation software will not support them. This function is a helpful pre-export step if you plan to use pitch data with software in which three or more accidentals are not representable.\n\n","type":"Music.Pitch.Pitch -> Music.Pitch.Pitch"},{"name":"octave","comment":" Get the octave of a pitch:\n\n    octave c4 == 4\n\n","type":"Music.Pitch.Pitch -> Basics.Int"},{"name":"semitones","comment":" Distance in semitones from C0. Useful for sorting.\n\n    semitones c4 == 48\n\n","type":"Music.Pitch.Pitch -> Basics.Int"},{"name":"simplify","comment":" Respell a pitch with as few accidentals as possible:\n\n    simplify fFlat4\n        == e4\n\nThis is helpful in musical idioms like jazz, where simple spellings are preferred.\n\n","type":"Music.Pitch.Pitch -> Music.Pitch.Pitch"},{"name":"toFrequency","comment":" Convert a pitch to a frequency in [Hertz](https://en.wikipedia.org/wiki/Hertz):\n\n    toFrequency c4 == 261.6255653005986\n\n","type":"Music.Pitch.Pitch -> Basics.Float"},{"name":"toMIDINoteNumber","comment":" Convert a pitch to a [MIDI](https://en.wikipedia.org/wiki/MIDI#Messages) number:\n\n    toMIDINoteNumber c4 == 60\n\n","type":"Music.Pitch.Pitch -> Basics.Int"},{"name":"toString","comment":" A pitch's letter name, accidental, and octave number:\n\n    toString cSharp4 == \"C♯4\"\n\n","type":"Music.Pitch.Pitch -> String.String"},{"name":"transposeDown","comment":" [Transpose](https://en.wikipedia.org/wiki/Transposition_%28music%29) a pitch downward by an interval.\n\n    transposeDown Interval.perfectFifth c4 == f3\n\n","type":"Music.Internal.Interval.Interval -> Music.Pitch.Pitch -> Music.Pitch.Pitch"},{"name":"transposeUp","comment":" [Transpose](https://en.wikipedia.org/wiki/Transposition_%28music%29) a pitch upward by an interval.\n\n    transposeUp Interval.perfectFifth c4 == g4\n\n","type":"Music.Internal.Interval.Interval -> Music.Pitch.Pitch -> Music.Pitch.Pitch"}],"binops":[]},{"name":"Music.PitchClass","comment":" A [pitch class](https://en.wikipedia.org/wiki/Pitch_class) is like a pitch, but with no octave specified. E.g. the pitch class \"B♭\".\n\n@docs PitchClass\n\n\n# Helpers\n\n@docs fromPitch, areEnharmonicEquivalents, letter, Letter, accidentals\n\n\n# Conversion\n\n@docs toString\n\n\n# Constructors\n\n@docs c, cSharp, d, dSharp, dFlat, e, eFlat, f, fSharp, g, gSharp, gFlat, a, aSharp, aFlat, b, bFlat\n\n\n# Less common pitch classes\n\nThese are used less frequently in music. Most likely you want a pitch from the previous section.\n\n\n## Enharmonic equivalents of natural notes\n\n@docs cFlat, eSharp, fFlat, bSharp\n\n\n## Pitch classes with [double accidentals](https://en.wikipedia.org/wiki/Accidental_%28music%29#Double_accidentals)\n\n@docs cDoubleSharp, cDoubleFlat, dDoubleSharp, dDoubleFlat, eDoubleSharp, eDoubleFlat, fDoubleSharp, fDoubleFlat, gDoubleSharp, gDoubleFlat, aDoubleSharp, aDoubleFlat, bDoubleSharp, bDoubleFlat\n\n","unions":[{"name":"Letter","comment":" ","args":[],"cases":[["A",[]],["B",[]],["C",[]],["D",[]],["E",[]],["F",[]],["G",[]]]}],"aliases":[{"name":"PitchClass","comment":" ","args":[],"type":"Music.Internal.PitchClass.PitchClass"}],"values":[{"name":"a","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"aDoubleFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"aDoubleSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"aFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"aSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"accidentals","comment":" Get the [accidentals](https://en.wikipedia.org/wiki/Accidental_%28music%29) of a pitch class.\n\nSharps are positive:\n\n    accidentals fSharp =\n        1\n\nFlats are negative:\n\n    accidentals aFlat =\n        -1\n\nNaturals are zero:\n\n    accidentals c =\n        0\n\n","type":"Music.PitchClass.PitchClass -> Basics.Int"},{"name":"areEnharmonicEquivalents","comment":" Check whether two pitch classes are enharmonic equivalents of each other. [Enharmonic equivalents](https://en.wikipedia.org/wiki/Enharmonic) are two pitch classes with different names but the same sound:\n\n    areEnharmonicEquivalents cFlat b == True\n\n","type":"Music.PitchClass.PitchClass -> Music.PitchClass.PitchClass -> Basics.Bool"},{"name":"b","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"bDoubleFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"bDoubleSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"bFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"bSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"c","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"cDoubleFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"cDoubleSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"cFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"cSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"d","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"dDoubleFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"dDoubleSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"dFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"dSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"e","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"eDoubleFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"eDoubleSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"eFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"eSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"f","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"fDoubleFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"fDoubleSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"fFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"fSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"fromPitch","comment":" Convert a `Pitch` to a `PitchClass`.\n\n    fromPitch Pitch.c4 == c\n\n","type":"Music.Internal.Pitch.Pitch -> Music.PitchClass.PitchClass"},{"name":"g","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"gDoubleFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"gDoubleSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"gFlat","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"gSharp","comment":" ","type":"Music.PitchClass.PitchClass"},{"name":"letter","comment":" Get the letter name of a pitch class:\n\n    letter fSharp =\n        F\n\n","type":"Music.PitchClass.PitchClass -> Music.PitchClass.Letter"},{"name":"toString","comment":" Get a pitch class's letter name and accidental:\n\n    toString bFlat == \"B♭\"\n\n","type":"Music.PitchClass.PitchClass -> String.String"}],"binops":[]},{"name":"Music.Range","comment":" A range, like a range of numbers, represents an upper and lower boundary and all the pitches in between. E.g. \"C4–C6.\"\n\n@docs Range\n\n\n# Constructor\n\n@docs range\n\n\n# Helpers\n\n@docs isWithin, min, max\n\n\n# Common instrument ranges\n\nAll instrument ranges here are defined in [concert pitch](https://en.wikipedia.org/wiki/Concert_pitch).\n\n\n## Vocal ranges\n\n@docs sopranoVoice, altoVoice, tenorVoice, bassVoice\n\n\n## Stringed instruments\n\n@docs violin, viola, cello, contrabass\n\n\n## Reed instruments\n\n@docs bassoon, clarinet, oboe\n\n\n## Wind instruments\n\n@docs flute, piccolo\n\n\n## Brass instruments\n\n@docs tuba, frenchHorn, trombone, trumpet\n\n\n## Saxophones\n\n@docs altoSax, baritoneSax, tenorSax\n\n\n## Pitched percussion\n\n@docs marimba, vibraphone, glockenspiel, xylophone\n\n","unions":[],"aliases":[{"name":"Range","comment":" ","args":[],"type":"Music.Internal.Pitch.Range"}],"values":[{"name":"altoSax","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"altoVoice","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"baritoneSax","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"bassVoice","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"bassoon","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"cello","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"clarinet","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"contrabass","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"flute","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"frenchHorn","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"glockenspiel","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"isWithin","comment":" Find out whether a pitch lies within a range, inclusive of its boundaries.\n\n    isWithin (range Pitch.c4 Pitch.c6) Pitch.c5 == True\n\n","type":"Music.Range.Range -> Music.Internal.Pitch.Pitch -> Basics.Bool"},{"name":"marimba","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"max","comment":" Get the upper boundary of a range:\n\n    max sopranoVoice == Pitch.c6\n\n","type":"Music.Range.Range -> Music.Internal.Pitch.Pitch"},{"name":"min","comment":" Get the lower boundary of a range:\n\n    min sopranoVoice == Pitch.c4\n\n","type":"Music.Range.Range -> Music.Internal.Pitch.Pitch"},{"name":"oboe","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"piccolo","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"range","comment":" Construct a range:\n\n    range Pitch.c4 Pitch.c6\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Internal.Pitch.Pitch -> Music.Range.Range"},{"name":"sopranoVoice","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"tenorSax","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"tenorVoice","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"trombone","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"trumpet","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"tuba","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"vibraphone","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"viola","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"violin","comment":" ","type":"Music.Internal.Pitch.Range"},{"name":"xylophone","comment":" ","type":"Music.Internal.Pitch.Range"}],"binops":[]},{"name":"Music.Scale","comment":" A [scale](https://en.wikipedia.org/wiki/Scale_%28music%29) is a set of pitch classes in a certain order. E.g. the \"C major scale.\"\n\n@docs Scale\n\n\n# Helpers\n\n@docs root, scaleType, toList, containsPitchClass, containsChord, allChords, degree, mode\n\n\n# Constructors\n\n@docs major, minor\n\n\n## Modes of the major scale\n\n@docs ionian, dorian, phrygian, lydian, mixolydian, aeolian, locrian\n\n\n## Modes of the melodic minor scale\n\n@docs melodicMinor, dorianFlat2, lydianAugmented, acoustic, majorMinor, minorLocrian, superlocrian\n\n\n## Modes of the harmonic minor scale\n\n@docs harmonicMinor, locrianNatural6, majorAugmented, lydianDiminished, phrygianDominant, aeolianHarmonic, ultralocrian\n\n\n## Symmetrical scales\n\n@docs diminishedWholeToneHalfTone, diminishedHalfToneWholeTone, wholeTone\n\n\n## Pentatonic scales\n\n@docs majorPentatonic, minorPentatonic\n\n\n# Custom scales\n\n@docs custom\n\n","unions":[],"aliases":[{"name":"Scale","comment":" ","args":[],"type":"Music.Internal.Scale.Scale"}],"values":[{"name":"acoustic","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"aeolian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"aeolianHarmonic","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"allChords","comment":" Get all chords contained in a scale, choosing from a list of chord types to detect:\n\n    allChords [ ChordType.minorSeventh ] (major PitchClass.c)\n        == [ Chord.minorSeventh PitchClass.d\n           , Chord.minorSeventh PitchClass.e\n           , Chord.minorSeventh PitchClass.a\n           ]\n\n","type":"List.List Music.ChordType.ChordType -> Music.Internal.Scale.Scale -> List.List Music.Internal.Chord.Chord"},{"name":"containsChord","comment":" Find out whether a scale contains a given chord:\n\n    containsChord (Chord.majorSeventhSharpEleven PitchClass.f)\n        (major PitchClass.c)\n        == True\n\n","type":"Music.Internal.Chord.Chord -> Music.Internal.Scale.Scale -> Basics.Bool"},{"name":"containsPitchClass","comment":" Find out whether a scale contains a given pitch class:\n\n    containsPitchClass PitchClass.f\n        { ignoreSpelling = False }\n        (major PitchClass.c)\n        == True\n\nSet the `ignoreSpelling` flag to allow enharmonic equivalents. This returns `True` because G♭ is not in C Lydian, but F♯ (an equivalent) is:\n\n    containsPitchClass PitchClass.gFlat\n        { ignoreSpelling = True }\n        (lydian PitchClass.c)\n        == True\n\n","type":"Music.PitchClass.PitchClass -> { ignoreSpelling : Basics.Bool } -> Music.Scale.Scale -> Basics.Bool"},{"name":"custom","comment":" Create a scale from a custom scale type. For use with [ScaleType.customPentatonic](Music-ScaleType#customPentatonic), [ScaleType.customHexatonic](Music-ScaleType#customHexatonic), [ScaleType.customHeptatonic](Music-ScaleType#customHeptatonic), and [ScaleType.customOctatonic](Music-ScaleType#customOctatonic):\n\n    myCustomScaleType =\n        customPentatonic\n            { rootToSecond = Interval.minorThird\n            , rootToThird = Interval.perfectFourth\n            , rootToFourth = Interval.perfectFifth\n            , rootToFifth = Interval.minorSeventh\n            }\n\n    myCustomScale =\n        |> custom PitchClass.c myCustomScaleType\n\n    -- Equivalent to `minorPentatonic PitchClass.c`\n\n","type":"Music.PitchClass.PitchClass -> Music.Internal.ScaleType.ScaleType -> Music.Scale.Scale"},{"name":"degree","comment":" Get a degree of the scale:\n\n    degree 3 (major PitchClass.c) == PitchClass.e\n\nNote: like many numbers in music theory, degrees are 1-based; `2` means the second degree of the scale. 0 and negative integers are ignored.\n\n","type":"Basics.Int -> Music.Scale.Scale -> Music.PitchClass.PitchClass"},{"name":"diminishedHalfToneWholeTone","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"diminishedWholeToneHalfTone","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"dorian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"dorianFlat2","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"harmonicMinor","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"ionian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"locrian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"locrianNatural6","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"lydian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"lydianAugmented","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"lydianDiminished","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"major","comment":" Same as `ionian`\n","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"majorAugmented","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"majorMinor","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"majorPentatonic","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"melodicMinor","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"minor","comment":" Also known as the \"natural minor\" scale. Same as `aeolian`\n","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"minorLocrian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"minorPentatonic","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"mixolydian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"mode","comment":" Get a [mode](https://en.wikipedia.org/wiki/Mode_%28music%29#Modern_modes) of a scale by shifting the order of its pitch classes. For example, E Phrygian is the third mode of the C major scale:\n\n    mode 3 (major PitchClass.c) == phrygian PitchClass.e\n\nNote: 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.\n\n","type":"Basics.Int -> Music.Scale.Scale -> Music.Scale.Scale"},{"name":"phrygian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"phrygianDominant","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"root","comment":" Get the root pitch class of a scale:\n\n    root (major PitchClass.eFlat) == PitchClass.eFlat\n\n","type":"Music.Scale.Scale -> Music.PitchClass.PitchClass"},{"name":"scaleType","comment":" Get the scale type for a scale:\n\n    scaleType (lydian PitchClass.c) == ScaleType.lydian\n\n","type":"Music.Scale.Scale -> Music.Internal.ScaleType.ScaleType"},{"name":"superlocrian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"toList","comment":" Get the pitch classes contained in the scale:\n\n    toList (major PitchClass.f)\n        == [ PitchClass.f\n           , PitchClass.g\n           , PitchClass.a\n           , PitchClass.bFlat\n           , PitchClass.c\n           , PitchClass.d\n           , PitchClass.e\n           ]\n\n","type":"Music.Scale.Scale -> List.List Music.PitchClass.PitchClass"},{"name":"ultralocrian","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"},{"name":"wholeTone","comment":" ","type":"Music.PitchClass.PitchClass -> Music.Scale.Scale"}],"binops":[]},{"name":"Music.ScaleType","comment":" A scale type describes the intervals contained in a [scale](https://en.wikipedia.org/wiki/Scale_%28music%29), with no specific root pitch class. E.g. the \"major scale.\"\n\n@docs ScaleType\n\n\n# Helpers\n\n@docs mode\n\n\n# Conversion\n\n@docs toList\n\n\n# Constructors\n\n@docs major, minor\n\n\n## Modes of the major scale\n\n@docs ionian, dorian, phrygian, lydian, mixolydian, aeolian, locrian\n\n\n## Modes of the melodic minor scale\n\n@docs melodicMinor, dorianFlat2, lydianAugmented, acoustic, majorMinor, minorLocrian, superlocrian\n\n\n## Modes of the harmonic minor scale\n\n@docs harmonicMinor, locrianNatural6, majorAugmented, lydianDiminished, phrygianDominant, aeolianHarmonic, ultralocrian\n\n\n## Symmetrical scales\n\n@docs diminishedWholeToneHalfTone, diminishedHalfToneWholeTone, wholeTone\n\n\n## Pentatonic scales\n\n@docs majorPentatonic, minorPentatonic\n\n\n# Custom scale types\n\n@docs customPentatonic, customHexatonic, customHeptatonic, customOctatonic\n\n","unions":[],"aliases":[{"name":"ScaleType","comment":" ","args":[],"type":"Music.Internal.ScaleType.ScaleType"}],"values":[{"name":"acoustic","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"aeolian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"aeolianHarmonic","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"customHeptatonic","comment":" Define a custom scale type with 7 degrees:\n\n    customHeptatonic\n        { rootToSecond = Interval.majorSecond\n        , rootToThird = Interval.minorThird\n        , rootToFourth = Interval.perfectFourth\n        , rootToFifth = Interval.perfectFifth\n        , rootToSixth = Interval.majorSixth\n        , rootToSeventh = Interval.minorSeventh\n        }\n        == dorian\n\n","type":"{ rootToSecond : Music.Internal.Interval.Interval, rootToThird : Music.Internal.Interval.Interval, rootToFourth : Music.Internal.Interval.Interval, rootToFifth : Music.Internal.Interval.Interval, rootToSixth : Music.Internal.Interval.Interval, rootToSeventh : Music.Internal.Interval.Interval } -> Music.ScaleType.ScaleType"},{"name":"customHexatonic","comment":" Define a custom scale type with 6 degrees:\n\n    customHexatonic\n        { rootToSecond = Interval.majorSecond\n        , rootToThird = Interval.majorThird\n        , rootToFourth = Interval.augmentedFourth\n        , rootToFifth = Interval.minorSixth\n        , rootToSixth = Interval.minorSeventh\n        }\n        == wholeTone\n\n","type":"{ rootToSecond : Music.Internal.Interval.Interval, rootToThird : Music.Internal.Interval.Interval, rootToFourth : Music.Internal.Interval.Interval, rootToFifth : Music.Internal.Interval.Interval, rootToSixth : Music.Internal.Interval.Interval } -> Music.ScaleType.ScaleType"},{"name":"customOctatonic","comment":" Define a custom scale type with 8 degrees:\n\n    customOctatonic\n        { rootToSecond = Interval.majorSecond\n        , rootToThird = Interval.minorThird\n        , rootToFourth = Interval.perfectFourth\n        , rootToFifth = Interval.diminishedFifth\n        , rootToSixth = Interval.minorSixth\n        , rootToSeventh = Interval.majorSixth\n        , rootToEighth = Interval.majorSeventh\n        }\n        == diminishedWholeToneHalfTone\n\n","type":"{ rootToSecond : Music.Internal.Interval.Interval, rootToThird : Music.Internal.Interval.Interval, rootToFourth : Music.Internal.Interval.Interval, rootToFifth : Music.Internal.Interval.Interval, rootToSixth : Music.Internal.Interval.Interval, rootToSeventh : Music.Internal.Interval.Interval, rootToEighth : Music.Internal.Interval.Interval } -> Music.ScaleType.ScaleType"},{"name":"customPentatonic","comment":" Define a custom scale type with 5 degrees:\n\n    customPentatonic\n        { rootToSecond = Interval.minorThird\n        , rootToThird = Interval.perfectFourth\n        , rootToFourth = Interval.perfectFifth\n        , rootToFifth = Interval.minorSeventh\n        }\n        == minorPentatonic\n\n","type":"{ rootToSecond : Music.Internal.Interval.Interval, rootToThird : Music.Internal.Interval.Interval, rootToFourth : Music.Internal.Interval.Interval, rootToFifth : Music.Internal.Interval.Interval } -> Music.ScaleType.ScaleType"},{"name":"diminishedHalfToneWholeTone","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"diminishedWholeToneHalfTone","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"dorian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"dorianFlat2","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"harmonicMinor","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"ionian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"locrian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"locrianNatural6","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"lydian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"lydianAugmented","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"lydianDiminished","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"major","comment":" Same as `ionian`\n","type":"Music.ScaleType.ScaleType"},{"name":"majorAugmented","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"majorMinor","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"majorPentatonic","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"melodicMinor","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"minor","comment":" Also known as the \"natural minor\" scale. Same as `aeolian`\n","type":"Music.ScaleType.ScaleType"},{"name":"minorLocrian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"minorPentatonic","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"mixolydian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"mode","comment":" Get a [mode](https://en.wikipedia.org/wiki/Mode_%28music%29#Modern_modes) of a scale type by shifting the order of its intervals. For example, the Phrygian mode is the third mode of the major scale:\n\n    mode 3 major == phrygian\n\nNote: 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.\n\n","type":"Basics.Int -> Music.ScaleType.ScaleType -> Music.ScaleType.ScaleType"},{"name":"phrygian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"phrygianDominant","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"superlocrian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"toList","comment":" Get the intervals contained in the scale type:\n\n    toList major\n        == [ Interval.perfectUnison\n           , Interval.majorSecond\n           , Interval.majorThird\n           , Interval.perfectFourth\n           , Interval.perfectFifth\n           , Interval.majorSixth\n           , Interval.majorSeventh\n           ]\n\n","type":"Music.ScaleType.ScaleType -> List.List Music.Internal.Interval.Interval"},{"name":"ultralocrian","comment":" ","type":"Music.ScaleType.ScaleType"},{"name":"wholeTone","comment":" ","type":"Music.ScaleType.ScaleType"}],"binops":[]},{"name":"Music.Voicing.FivePart","comment":" A chord voicing is an instance of a `Chord` that can be played or sung.\n\n@docs Voicing\n\n\n# Generating voicings\n\nThis package's recommended way of creating five-part `Voicing`s is to use the [Chord.voiceFiveParts](Music-Chord#voicing-chords) function along with `VoicingMethod`s like the ones in this module:\n\n    Chord.voiceFiveParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.tenorVoice\n        , voiceFive = Range.bassVoice\n        }\n        [ basic ]\n        (Chord.majorSeventh PitchClass.c)\n\nIn this example, we pass the following to `voiceFiveParts`:\n\n1.  The `Range`s of the instruments involved\n2.  A list of `VoicingMethod`s to be used\n3.  The chord to voice\n\nThis uses the characteristics of the `VoicingMethod` to return a `List` of all possible `Voicing`s.\n\nFrom here, you may choose from this list based on some criteria:\n\n    myGeneratedVoicings\n        |> List.filter\n            (\\voicing ->\n                containsPitchInVoiceOne Pitch.e5 voicing\n                    && (span voicing >= Interval.perfectOctave)\n            )\n        |> List.sortWith (centerOrder Pitch.g4)\n        |> List.head\n\nThis does the following:\n\n1.  Filters the list to only include `Voicing`s which have E5 in the top voice, and have a span of at least an octave from bottom to top voice\n2.  Sorts the list so that the `Voicing`s which are centered around the pitch G4 are at the beginning\n3.  Takes the first item in the remaining list\n\nThese sorting and filtering processes allow you to account for considerations like [voice leading](https://en.wikipedia.org/wiki/Voice_leading), or the harmonization of a melody. You'll find comparison functions in this module for doing that.\n\n\n# Constructing a single voicing\n\nThere are cases where you may want to create a specific voicing you have in mind:\n\n@docs voicing\n\n\n# Helpers\n\n@docs chord, span, center\n\n\n# Voices\n\n@docs voiceOne, voiceTwo, voiceThree, voiceFour, voiceFive\n@docs containsPitch, containsPitchInVoiceOne, containsPitchInVoiceTwo, containsPitchInVoiceThree, containsPitchInVoiceFour, containsPitchInVoiceFive\n\n\n# Comparing voicings\n\n\n## Common tones\n\n@docs commonTones\n\n\n## Direction\n\n@docs usesContraryMotion, containsParallelFifths, containsParallelOctaves\n\n\n## Distance\n\n@docs totalSemitoneDistance, semitoneDistanceVoiceOne, semitoneDistanceVoiceTwo, semitoneDistanceVoiceThree, semitoneDistanceVoiceFour, semitoneDistanceVoiceFive\n\n\n# Low interval limits\n\n@docs isWithinLowIntervalLimits\n\n\n# Sorting voicings\n\n@docs sortWeighted, orderWeighted\n@docs centerOrder, commonTonesOrder, contraryMotionOrder, totalSemitoneDistanceOrder, semitoneDistanceVoiceOneOrder, semitoneDistanceVoiceTwoOrder, semitoneDistanceVoiceThreeOrder, semitoneDistanceVoiceFourOrder, semitoneDistanceVoiceFiveOrder\n\n\n# Conversion\n\n@docs Pitches, toPitches, toPitchList, toString\n\n\n## Intervals\n\n@docs Intervals, toIntervals, toIntervalList\n\n\n# Voicing methods\n\n\n## Basic\n\n@docs basic\n\n\n## Jazz\n\nThese methods were adapted from [Jazz Arranging Techniques](http://lindsayjazz.com/jazz-arranging-techniques/) by Gary Lindsay.\n\nNotes:\n\n  - Jazz voicing methods can involve substitutions within families of related chords, so don't be surprised when you see voicings that include a pitch class that isn't strictly in the chord you specified.\n  - Not all chords are compatible with these methods; in those cases this function will return an empty list.\n\n@docs close, drop2, drop3, drop2and4, spread\n\n\n## Custom voicing methods\n\nVoicing methods are a deep and nuanced topic, that I hope to make approachable. I've modeled this API with three main concepts of chord voicing in mind:\n\n  - **Spacing**: how close together or far apart can each voice be from its neighbor?\n  - **Placement**: which factors from the chord can be used in which places?\n  - **Uniqueness**: can certain factors be repeated, or must they be used only once?\n\nHere are the steps in building a voicing method:\n\n\n### Categorize the factors in the chord\n\nSince chords can vary, use some method of categorizing the factors of a chord into groups that you can guarantee are present. Examples of this type of categorization function are `Chord.categorizeFactors` and `Chord.availableTensions`.\n\n\n### Specify the placement and uniqueness of factors\n\nSelect factors using the `with...` functions in this section.\n\n\n### Finish and specify spacing limits\n\nUse the `placeSelectedFactors` function, passing a `SpacingLimits`.\n\nExample:\n\n    myCustomVoicingMethod : VoicingMethod\n    myCustomVoicingMethod =\n        custom\n            ChordType.categorizeFactors\n            (\\factors ->\n                selectFactors\n                    |> withFactorFrom\n                        (List.concat\n                            [ [ factors.third ]\n                            , factors.ninth\n                            ]\n                        )\n                    |> withFactorFrom\n                        (List.filterMap identity\n                            [ Just Interval.perfectUnison\n                            , factors.sixthOrSeventh\n                            ]\n                        )\n                    |> withFactor factors.fifth\n                    |> withFactor factors.third\n                    |> withFactor Interval.perfectUnison\n                    |> placeSelectedFactors spacingLimits\n            )\n\n    spacingLimits =\n        { twoToOne =\n            Interval.range\n                Interval.augmentedUnison\n                Interval.perfectOctave\n        , threeToTwo =\n            Interval.range\n                Interval.augmentedUnison\n                Interval.perfectOctave\n        , fourToThree =\n            Interval.range\n                Interval.augmentedUnison\n                Interval.perfectOctave\n        , fiveToFour =\n            Interval.range\n                Interval.augmentedUnison\n                Interval.perfectOctave\n        }\n\n@docs VoicingMethod\n@docs SpacingLimits\n@docs method\n@docs selectFactors, withFactor, withUniqueFactor, withFactorFrom, withUniqueFactorFrom, withTwoFactorsFrom, withUniqueTwoFactorsFrom, withThreeFactorsFrom, withUniqueThreeFactorsFrom\n@docs placeSelectedFactors\n@docs combineVoicingMethods\n\n","unions":[],"aliases":[{"name":"Intervals","comment":" ","args":[],"type":"{ fiveToOne : Music.Internal.Interval.Interval, fiveToTwo : Music.Internal.Interval.Interval, fiveToThree : Music.Internal.Interval.Interval, fiveToFour : Music.Internal.Interval.Interval, fourToOne : Music.Internal.Interval.Interval, fourToTwo : Music.Internal.Interval.Interval, fourToThree : Music.Internal.Interval.Interval, threeToOne : Music.Internal.Interval.Interval, threeToTwo : Music.Internal.Interval.Interval, twoToOne : Music.Internal.Interval.Interval }"},{"name":"Pitches","comment":" The pitches contained in a voicing.\n\nThese are in order from highest (`voiceOne`) to lowest (`voiceFive`), the way you might read them on a staff.\n\n","args":[],"type":"{ voiceOne : Music.Internal.Pitch.Pitch, voiceTwo : Music.Internal.Pitch.Pitch, voiceThree : Music.Internal.Pitch.Pitch, voiceFour : Music.Internal.Pitch.Pitch, voiceFive : Music.Internal.Pitch.Pitch }"},{"name":"SpacingLimits","comment":" ","args":[],"type":"{ twoToOne : Music.Internal.Interval.Range, threeToTwo : Music.Internal.Interval.Range, fourToThree : Music.Internal.Interval.Range, fiveToFour : Music.Internal.Interval.Range }"},{"name":"Voicing","comment":" ","args":[],"type":"Music.Internal.Voicing.FivePart.Voicing"},{"name":"VoicingMethod","comment":" ","args":[],"type":"Music.Internal.Voicing.FivePart.VoicingMethod"}],"values":[{"name":"basic","comment":" A basic textbook method for voicing a chord in root position:\n\n    Chord.voiceFiveParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.tenorVoice\n        , voiceFive = Range.bassVoice\n        }\n        [ basic ]\n        (Chord.major PitchClass.c)\n        |> List.map toString\n        == [ \"E4, C4, G3, E3, C3\"\n           , \"E5, C5, G4, E4, C4\"\n           ]\n\n","type":"Music.Voicing.FivePart.VoicingMethod"},{"name":"center","comment":" Get the midpoint between the highest and lowest voices in semitones:\n\n    center myVoicing\n        == Pitch.semitones Pitch.fSharp3\n\n","type":"Music.Voicing.FivePart.Voicing -> Basics.Int"},{"name":"centerOrder","comment":" Compare voicings by how far their centers are from a goal pitch:\n\n    myVoicingList\n        |> List.sortWith (centerOrder Pitch.g4)\n\nUseful for finding voicings that are centered around a particular pitch.\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"chord","comment":" Get the chord being voiced:\n\n    chord myVoicing == Chord.majorSixNine PitchClass.c\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Internal.Chord.Chord"},{"name":"close","comment":" Voice a chord using the \"four-way close, double lead\" method:\n\n    Chord.voiceFiveParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.tenorVoice\n        , voiceFive = Range.bassVoice\n        }\n        [ close ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"C4, B3, G3, E3, C3\"\n           , -- 79 others...\n           ]\n\nThis is a \"close\" voicing, where all voices are distributed close together.\n\n","type":"Music.Voicing.FivePart.VoicingMethod"},{"name":"combineVoicingMethods","comment":" Combine multiple `VoicingMethod`s together:\n\n    myComboVoicingMethod =\n        combineVoicingMethods [ voicingMethodOne, voicingMethodTwo, voicingMethodThree ]\n\nThis is useful if you want to define multiple `VoicingMethod`s that act as a group (e.g. inversions or similar methods that use different chord factors).\n\n","type":"List.List Music.Voicing.FivePart.VoicingMethod -> Music.Voicing.FivePart.VoicingMethod"},{"name":"commonTones","comment":" Get all pitches in common between two voicings:\n\n    commonTones bFlatVoicing bDimVoicing\n        == [ Pitch.d4\n           , Pitch.f4\n           ]\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> List.List Music.Internal.Pitch.Pitch"},{"name":"commonTonesOrder","comment":" Compare voicings by how many pitches they have in common with a previous voicing:\n\n    myVoicingList\n        |> List.sortWith (commonTonesOrder previousVoicing)\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"containsParallelFifths","comment":" Find out whether any two moving voices maintain a perfect fifth interval between them. Identifying [parallel fifths and octaves](https://en.wikipedia.org/wiki/Consecutive_fifths) is important in the study of [counterpoint](https://en.wikipedia.org/wiki/Counterpoint).\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"containsParallelOctaves","comment":" Find out whether any two moving voices maintain a perfect octave interval between them.\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"containsPitch","comment":" Find out whether a voicing contains a specific pitch:\n\n     containsPitch Pitch.d5 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceFive","comment":" Find out whether a voicing has a specific pitch in the fifth voice:\n\n     containsPitchInVoiceFive Pitch.c4 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceFour","comment":" Find out whether a voicing has a specific pitch in the fourth voice:\n\n     containsPitchInVoiceFour Pitch.e4 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceOne","comment":" Find out whether a voicing has a specific pitch in the first voice:\n\n     containsPitchInVoiceOne Pitch.d5 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceThree","comment":" Find out whether a voicing has a specific pitch in the third voice:\n\n     containsPitchInVoiceThree Pitch.g4 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceTwo","comment":" Find out whether a voicing has a specific pitch in the second voice:\n\n     containsPitchInVoiceTwo Pitch.a4 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"contraryMotionOrder","comment":" Compare voicings by whether they use contrary motion from a previous voicing:\n\n    myVoicingList\n        |> List.sortWith (contraryMotionOrder previousVoicing)\n\n\"Contrary motion\" here is in respect to the top and bottom voices.\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"drop2","comment":" Voice a chord using the \"four-way drop-2, double lead\" method:\n\n    Chord.voiceFiveParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.tenorVoice\n        , voiceFive = Range.bassVoice\n        }\n        [ drop2 ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"B4, E4, C4, G3, B2\"\n           , -- 87 others...\n           ]\n\nA semi-open voicing, similar to \"close\", but with the second voice dropped an octave.\n\n","type":"Music.Voicing.FivePart.VoicingMethod"},{"name":"drop2and4","comment":" Voice a chord using the \"four-way drop-2-and-4, double lead\" method:\n\n    Chord.voiceFiveParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.tenorVoice\n        , voiceFive = Range.bassVoice\n        }\n        [ drop2and4 ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"B4, E4, G3, C3, B2\"\n           , -- 71 others...\n           ]\n\nAn open voicing, with the second and fourth voices dropped an octave.\n\n","type":"Music.Voicing.FivePart.VoicingMethod"},{"name":"drop3","comment":" Voice a chord using the \"four-way drop-3, double lead\" method:\n\n    Chord.voiceFiveParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.tenorVoice\n        , voiceFive = Range.bassVoice\n        }\n        [ drop3 ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"B4, G4, C4, E3, B2\"\n           , -- 71 others...\n           ]\n\nA semi-open voicing, similar to \"close\", but with the third voice dropped an octave.\n\n","type":"Music.Voicing.FivePart.VoicingMethod"},{"name":"isWithinLowIntervalLimits","comment":" A low interval limit is the lowest pitch at which the character of an interval cannot be heard clearly. I have heard this explained in terms of the [harmonic series](https://en.wikipedia.org/wiki/Harmonic_series_%28music%29), but it seems to be taught as more of a [guideline for arrangers](https://www.berklee.edu/core/glossary.html#:~:text=Low%20Interval%20Limit%20%2D%20The%20lowest,within%20a%20normal%20harmonic%20context.) than a physical absolute.\n","type":"Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"method","comment":" Begin a custom voicing method:\n\n    method Chord.categorizeFactors\n        (\\categorized ->\n            ...\n        )\n\n","type":"(Music.Internal.ChordType.ChordType -> Maybe.Maybe categorized) -> (categorized -> List.List Music.Internal.Voicing.FivePart.VoicingClass) -> Music.Voicing.FivePart.VoicingMethod"},{"name":"orderWeighted","comment":" Combine multiple ordering functions:\n\n    orderWeighted\n        [ ( totalSemitoneDistanceOrder previousVoicing, 10.0 )\n        , ( contraryMotionOrder previousVoicing, 5.0 )\n        , ( commonTonesOrder previousVoicing, 2.0 )\n        ]\n        |> List.orderWith\n\n","type":"List.List ( Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order, Basics.Float ) -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"placeSelectedFactors","comment":" Finish selecting factors for a voicing method and place them according to the spacing limits.\n","type":"Music.Voicing.FivePart.SpacingLimits -> Music.Internal.VoicingClass.VoicingClassBuilder Music.Internal.Voicing.FivePart.VoicingClass -> List.List Music.Internal.Voicing.FivePart.VoicingClass"},{"name":"selectFactors","comment":" Begin selecting factors for a voicing method.\n","type":"Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Voicing.FivePart.VoicingClass)"},{"name":"semitoneDistanceVoiceFive","comment":" Given two voicings, find out how far in semitones the fifth (bottom) voice moves.\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceFiveOrder","comment":" Compare voicings by absolute difference in semitones in voice five:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceFiveOrder previousVoicing)\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"semitoneDistanceVoiceFour","comment":" Given two voicings, find out how far in semitones the fourth voice moves.\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceFourOrder","comment":" Compare voicings by absolute difference in semitones in voice four:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceFourOrder previousVoicing)\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"semitoneDistanceVoiceOne","comment":" Given two voicings, find out how far in semitones the first (top) voice moves.\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceOneOrder","comment":" Compare voicings by absolute difference in semitones in voice one:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceOneOrder previousVoicing)\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"semitoneDistanceVoiceThree","comment":" Given two voicings, find out how far in semitones the third voice moves.\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceThreeOrder","comment":" Compare voicings by absolute difference in semitones in voice three:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceThreeOrder previousVoicing)\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"semitoneDistanceVoiceTwo","comment":" Given two voicings, find out how far in semitones the second voice moves.\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceTwoOrder","comment":" Compare voicings by absolute difference in semitones in voice two:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceTwoOrder previousVoicing)\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"sortWeighted","comment":" Sort by multiple ordering functions:\n\n    sortWeighted\n        [ ( totalSemitoneDistanceOrder previousVoicing, 10.0 )\n        , ( contraryMotionOrder previousVoicing, 5.0 )\n        , ( commonTonesOrder previousVoicing, 2.0 )\n        ]\n        voicingList\n\n","type":"List.List ( Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order, Basics.Float ) -> List.List Music.Voicing.FivePart.Voicing -> List.List Music.Voicing.FivePart.Voicing"},{"name":"span","comment":" Get the interval from the lowest to the highest pitch in the voicing:\n\n     span myVoicing == Interval.minorSeventh\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Internal.Interval.Interval"},{"name":"spread","comment":" Voice a chord using the \"five-way spread\" method.\n\n    Chord.voiceFiveParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.tenorVoice\n        , voiceFive = Range.bassVoice\n        }\n        [ spread ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"D5, G4, E4, B3, C3\"\n           , -- 40 others...\n           ]\n\nAnother open voicing method, with the root of the chord on the bottom for a dramatic effect.\n\n","type":"Music.Voicing.FivePart.VoicingMethod"},{"name":"toIntervalList","comment":" Get all intervals between each pitch in a voicing as a `List`:\n\n    toIntervalList myVoicing\n        == [ Interval.minorThird\n           , Interval.majorThird\n           , Interval.majorThird\n           , Interval.majorThird\n           , Interval.perfectFourth\n           , Interval.perfectFifth\n           , Interval.minorSixth\n           , Interval.majorSixth\n           , Interval.perfectOctave\n           , Interval.perfectOctave\n           ]\n\n","type":"Music.Voicing.FivePart.Voicing -> List.List Music.Internal.Interval.Interval"},{"name":"toIntervals","comment":" Get all intervals between each pitch in a voicing:\n\n    toIntervals myVoicing\n        == { fiveToOne = Interval.majorThird\n           , fiveToTwo = Interval.perfectOctave\n           , fiveToThree = Interval.perfectFifth\n           , fiveToFour = Interval.majorThird\n           , fourToOne = Interval.perfectOctave\n           , fourToTwo = Interval.minorSixth\n           , fourToThree = Interval.minorThird\n           , threeToOne = Interval.majorSixth\n           , threeToTwo = Interval.perfectFourth\n           , twoToOne = Interval.majorThird\n           }\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Intervals"},{"name":"toPitchList","comment":" Get all pitches contained in a voicing, as a `List`:\n\n    toPitchList myVoicing\n        == [ Pitch.d5\n           , Pitch.a4\n           , Pitch.g4\n           , Pitch.e4\n           , Pitch.c4\n           ]\n\n","type":"Music.Voicing.FivePart.Voicing -> List.List Music.Internal.Pitch.Pitch"},{"name":"toPitches","comment":" Get all pitches contained in a voicing:\n\n    toPitches myVoicing\n        == { voiceOne = Pitch.d5\n           , voiceTwo = Pitch.a4\n           , voiceThree = Pitch.g4\n           , voiceFour = Pitch.e4\n           , voiceFive = Pitch.c4\n           }\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Pitches"},{"name":"toString","comment":" Get all pitches contained in a voicing, as a stringified list:\n\n    toPitchList myVoicing\n        == \"D5, A4, G4, E4, C4\"\n\n","type":"Music.Voicing.FivePart.Voicing -> String.String"},{"name":"totalSemitoneDistance","comment":" Given two voicings, find out how far in semitones all voices move.\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Int"},{"name":"totalSemitoneDistanceOrder","comment":" Compare voicings by absolute difference in semitones from a previous voicing:\n\n    myVoicingList\n        |> List.sortWith (totalSemitoneDistanceOrder previousVoicing)\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Order"},{"name":"usesContraryMotion","comment":" Find out whether the first and fifth voices move in opposite directions (known as [contrary motion](https://en.wikipedia.org/wiki/Contrapuntal_motion#Contrary_motion)).\n","type":"Music.Voicing.FivePart.Voicing -> Music.Voicing.FivePart.Voicing -> Basics.Bool"},{"name":"voiceFive","comment":" Get the fifth (lowest) pitch of the voicing:\n\n    voiceFive myVoicing == Pitch.c4\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voiceFour","comment":" Get the fourth pitch of the voicing:\n\n    voiceFour myVoicing == Pitch.e4\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voiceOne","comment":" Get the first (highest) pitch of the voicing:\n\n    voiceOne myVoicing == Pitch.d5\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voiceThree","comment":" Get the third pitch of the voicing:\n\n    voiceThree myVoicing == Pitch.g4\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voiceTwo","comment":" Get the second pitch of the voicing:\n\n    voiceTwo myVoicing == Pitch.a4\n\n","type":"Music.Voicing.FivePart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voicing","comment":" Create a voicing from pitches and a chord:\n\n    voicing\n        { voiceOne = Pitch.c5\n        , voiceTwo = Pitch.a4\n        , voiceThree = Pitch.g4\n        , voiceFour = Pitch.e4\n        , voiceFive = Pitch.c4\n        }\n        (Chord.majorSix PitchClass.c)\n        == Ok Voicing ...\n\nIf the pitches given do not match the chord, this function will return `Err` with the erroneous pitch classes:\n\n    voicing\n        { voiceOne = Pitch.c5\n        , voiceTwo = Pitch.d4\n        , voiceThree = Pitch.g4\n        , voiceFour = Pitch.e4\n        , voiceFive = Pitch.c4\n        }\n        (Chord.majorSix PitchClass.c)\n        == Err [ PitchClass.d ]\n\n","type":"Music.Voicing.FivePart.Pitches -> Music.Internal.Chord.Chord -> Result.Result (List.List Music.PitchClass.PitchClass) Music.Voicing.FivePart.Voicing"},{"name":"withFactor","comment":" Select a chord factor for use in a voice.\n","type":"Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withFactorFrom","comment":" Select a factor from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withThreeFactorsFrom","comment":" Select three factors from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withTwoFactorsFrom","comment":" Select two factors from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueFactor","comment":" Select a factor that has not yet been used.\n","type":"Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueFactorFrom","comment":" Select a factor that has not yet been used, from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueThreeFactorsFrom","comment":" Select two factors that have not yet been used, from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueTwoFactorsFrom","comment":" Select two factors that have not yet been used, from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"}],"binops":[]},{"name":"Music.Voicing.FourPart","comment":" A chord voicing is an instance of a `Chord` that can be played or sung.\n\n@docs Voicing\n\n\n# Generating voicings\n\nThis package's recommended way of creating four-part `Voicing`s is to use the [Chord.voiceFourParts](Music-Chord#voicing-chords) function along with `VoicingMethod`s like the ones in this module:\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ basic ]\n        (Chord.majorSeventh PitchClass.c)\n\nIn this example, we pass the following to `voiceFourParts`:\n\n1.  The `Range`s of the instruments involved\n2.  A list of `VoicingMethod`s to be used\n3.  The chord to voice\n\nThis uses the characteristics of the `VoicingMethod` to return a `List` of all possible `Voicing`s.\n\nFrom here, you may choose from this list based on some criteria:\n\n    myGeneratedVoicings\n        |> List.filter\n            (\\voicing ->\n                containsPitchInVoiceOne Pitch.e5 voicing\n                    && (span voicing >= Interval.perfectOctave)\n            )\n        |> List.sortWith (centerOrder Pitch.g4)\n        |> List.head\n\nThis does the following:\n\n1.  Filters the list to only include `Voicing`s which have E5 in the top voice, and have a span of at least an octave from bottom to top voice\n2.  Sorts the list so that the `Voicing`s which are centered around the pitch G4 are at the beginning\n3.  Takes the first item in the remaining list\n\nThese sorting and filtering processes allow you to account for considerations like [voice leading](https://en.wikipedia.org/wiki/Voice_leading), or the harmonization of a melody. You'll find comparison functions in this module for doing that.\n\n\n# Constructing a single voicing\n\nThere are cases where you may want to create a specific voicing you have in mind:\n\n@docs voicing\n\n\n# Helpers\n\n@docs chord, span, center\n\n\n# Voices\n\n@docs voiceOne, voiceTwo, voiceThree, voiceFour\n@docs containsPitch, containsPitchInVoiceOne, containsPitchInVoiceTwo, containsPitchInVoiceThree, containsPitchInVoiceFour\n\n\n# Comparing voicings\n\n\n## Common tones\n\n@docs commonTones\n\n\n## Direction\n\n@docs usesContraryMotion, containsParallelFifths, containsParallelOctaves\n\n\n## Distance\n\n@docs totalSemitoneDistance, semitoneDistanceVoiceOne, semitoneDistanceVoiceTwo, semitoneDistanceVoiceThree, semitoneDistanceVoiceFour\n\n\n# Low interval limits\n\n@docs isWithinLowIntervalLimits\n\n\n# Sorting voicings\n\n@docs sortWeighted, orderWeighted\n@docs centerOrder, commonTonesOrder, contraryMotionOrder, totalSemitoneDistanceOrder, semitoneDistanceVoiceOneOrder, semitoneDistanceVoiceTwoOrder, semitoneDistanceVoiceThreeOrder, semitoneDistanceVoiceFourOrder\n\n\n# Conversion\n\n@docs Pitches, toPitches, toPitchList, toString\n\n\n## Intervals\n\n@docs Intervals, toIntervals, toIntervalList\n\n\n# Voicing methods\n\n\n## Basic\n\n@docs basic\n\n\n## Jazz\n\nThese methods were adapted from [Jazz Arranging Techniques](http://lindsayjazz.com/jazz-arranging-techniques/) by Gary Lindsay.\n\nNotes:\n\n  - Jazz voicing methods can involve substitutions within families of related chords, so don't be surprised when you see voicings that include a pitch class that isn't strictly in the chord you specified.\n  - Not all chords are compatible with these methods; in those cases this function will return an empty list.\n\n@docs close, drop2, drop3, drop2and4, spread\n\n\n## Classical\n\nNote: these classical methods were developed before jazz harmony, and so chord extensions and added tones will not be included.\n\n@docs rootPosition, firstInversion, secondInversion, thirdInversion\n\n\n## Custom voicing methods\n\nVoicing methods are a deep and nuanced topic, that I hope to make approachable. I've modeled this API with three main concepts of chord voicing in mind:\n\n  - **Spacing**: how close together or far apart can each voice be from its neighbor?\n  - **Placement**: which factors from the chord can be used in which places?\n  - **Uniqueness**: can certain factors be repeated, or must they be used only once?\n\nHere are the steps in building a voicing method:\n\n\n### Categorize the factors in the chord\n\nSince chords can vary, use some method of categorizing the factors of a chord into groups that you can guarantee are present. Examples of this type of categorization function are `Chord.categorizeFactors` and `Chord.availableTensions`.\n\n\n### Specify the placement and uniqueness of factors\n\nSelect factors using the `with...` functions in this section.\n\n\n### Finish and specify spacing limits\n\nUse the `placeSelectedFactors` function, passing a `SpacingLimits`.\n\nExample:\n\n    myCustomVoicingMethod : VoicingMethod\n    myCustomVoicingMethod =\n        custom\n            ChordType.categorizeFactors\n            (\\factors ->\n                selectFactors\n                    |> withFactorFrom\n                        (List.filterMap identity\n                            [ Just Interval.perfectUnison\n                            , factors.sixthOrSeventh\n                            ]\n                        )\n                    |> withFactor factors.fifth\n                    |> withFactor factors.third\n                    |> withFactor Interval.perfectUnison\n                    |> placeSelectedFactors spacingLimits\n            )\n\n    spacingLimits =\n        { twoToOne =\n            Interval.range\n                Interval.augmentedUnison\n                Interval.perfectOctave\n        , threeToTwo =\n            Interval.range\n                Interval.augmentedUnison\n                Interval.perfectOctave\n        , fourToThree =\n            Interval.range\n                Interval.augmentedUnison\n                Interval.perfectOctave\n        }\n\n@docs VoicingMethod\n@docs SpacingLimits\n@docs method\n@docs selectFactors, withFactor, withUniqueFactor, withFactorFrom, withUniqueFactorFrom, withTwoFactorsFrom, withUniqueTwoFactorsFrom, withThreeFactorsFrom, withUniqueThreeFactorsFrom\n@docs placeSelectedFactors\n@docs combineVoicingMethods\n\n","unions":[],"aliases":[{"name":"Intervals","comment":" ","args":[],"type":"{ fourToOne : Music.Internal.Interval.Interval, fourToTwo : Music.Internal.Interval.Interval, fourToThree : Music.Internal.Interval.Interval, threeToOne : Music.Internal.Interval.Interval, threeToTwo : Music.Internal.Interval.Interval, twoToOne : Music.Internal.Interval.Interval }"},{"name":"Pitches","comment":" The pitches contained in a voicing.\n\nThese are in order from highest (`voiceOne`) to lowest (`voiceFour`), the way you might read them on a staff.\n\n","args":[],"type":"{ voiceOne : Music.Internal.Pitch.Pitch, voiceTwo : Music.Internal.Pitch.Pitch, voiceThree : Music.Internal.Pitch.Pitch, voiceFour : Music.Internal.Pitch.Pitch }"},{"name":"SpacingLimits","comment":" ","args":[],"type":"{ twoToOne : Music.Internal.Interval.Range, threeToTwo : Music.Internal.Interval.Range, fourToThree : Music.Internal.Interval.Range }"},{"name":"Voicing","comment":" ","args":[],"type":"Music.Internal.Voicing.FourPart.Voicing"},{"name":"VoicingMethod","comment":" ","args":[],"type":"Music.Internal.Voicing.FourPart.VoicingMethod"}],"values":[{"name":"basic","comment":" A basic textbook method for voicing a chord in root position:\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ basic ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"B4, G4, E4, C4\"\n           , -- 2 others...\n           ]\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"center","comment":" Get the midpoint between the highest and lowest voices in semitones:\n\n    center myVoicing\n        == Pitch.semitones Pitch.fSharp3\n\n","type":"Music.Voicing.FourPart.Voicing -> Basics.Int"},{"name":"centerOrder","comment":" Compare voicings by how far their centers are from a goal pitch:\n\n    myVoicingList\n        |> List.sortWith (centerOrder Pitch.g4)\n\nUseful for finding voicings that are centered around a particular pitch.\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order"},{"name":"chord","comment":" Get the chord being voiced:\n\n    chord myVoicing == Chord.majorSixNine PitchClass.c\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Internal.Chord.Chord"},{"name":"close","comment":" Voice a chord using the \"four-way close\" method:\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ close ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"C4, B3, G3, E3\"\n           , -- 39 others...\n           ]\n\nThis method voices all four notes \"closely\" within the span of an octave.\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"combineVoicingMethods","comment":" Combine multiple `VoicingMethod`s together:\n\n    myComboVoicingMethod =\n        combineVoicingMethods [ voicingMethodOne, voicingMethodTwo, voicingMethodThree ]\n\nThis is useful if you want to define multiple `VoicingMethod`s that act as a group (e.g. inversions or similar methods that use different chord factors).\n\n","type":"List.List Music.Voicing.FourPart.VoicingMethod -> Music.Voicing.FourPart.VoicingMethod"},{"name":"commonTones","comment":" Get all pitches in common between two voicings:\n\n    commonTones bFlatVoicing bDimVoicing\n        == [ Pitch.d4\n           , Pitch.f4\n           ]\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> List.List Music.Internal.Pitch.Pitch"},{"name":"commonTonesOrder","comment":" Compare voicings by how many pitches they have in common with a previous voicing:\n\n    myVoicingList\n        |> List.sortWith (commonTonesOrder previousVoicing)\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order"},{"name":"containsParallelFifths","comment":" Find out whether any two moving voices maintain a perfect fifth interval between them. Identifying [parallel fifths and octaves](https://en.wikipedia.org/wiki/Consecutive_fifths) is important in the study of [counterpoint](https://en.wikipedia.org/wiki/Counterpoint).\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Bool"},{"name":"containsParallelOctaves","comment":" Find out whether any two moving voices maintain a perfect octave interval between them.\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Bool"},{"name":"containsPitch","comment":" Find out whether a voicing contains a specific pitch:\n\n     containsPitch Pitch.d5 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FourPart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceFour","comment":" Find out whether a voicing has a specific pitch in the fourth voice:\n\n     containsPitchInVoiceFour Pitch.e4 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FourPart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceOne","comment":" Find out whether a voicing has a specific pitch in the first voice:\n\n     containsPitchInVoiceOne Pitch.d5 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FourPart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceThree","comment":" Find out whether a voicing has a specific pitch in the third voice:\n\n     containsPitchInVoiceThree Pitch.g4 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FourPart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceTwo","comment":" Find out whether a voicing has a specific pitch in the second voice:\n\n     containsPitchInVoiceTwo Pitch.a4 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.FourPart.Voicing -> Basics.Bool"},{"name":"contraryMotionOrder","comment":" Compare voicings by whether they use contrary motion from a previous voicing:\n\n    myVoicingList\n        |> List.sortWith (contraryMotionOrder previousVoicing)\n\n\"Contrary motion\" here is in respect to the top and bottom voices.\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order"},{"name":"drop2","comment":" Voice a chord using the \"four-way drop-2\" method:\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ drop2 ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"C4, G3, E3, B2\"\n           , -- 55 others...\n           ]\n\nThis method is the same as four-way close, but with the second pitch from the top dropped by an octave for a wider, semi-open sound.\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"drop2and4","comment":" Voice a chord using the \"four-way drop-2-and-4\" method:\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ drop2and4 ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"G4, C4, E3, B2\"\n           , -- 55 others...\n           ]\n\nA double drop voicing, with the second and fourth pitches from the top dropped for a wide, open sound.\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"drop3","comment":" Voice a chord using the \"four-way drop-3\" method:\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ drop3 ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"C4, G3, E3, B2\"\n           , -- 55 others...\n           ]\n\nSame as drop-2, but with the third pitch from the top dropped instead of the second.\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"firstInversion","comment":" Voice a chord in \"first inversion\":\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ firstInversion ]\n        (Chord.major PitchClass.c)\n        |> List.map toString\n        == [ \"C6, C5, G4, E3\"\n           , -- 32 others...\n           ]\n\nA first inversion voicing is any voicing where the third of the chord is in the lowest voice.\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"isWithinLowIntervalLimits","comment":" A low interval limit is the lowest pitch at which the character of an interval cannot be heard clearly. I have heard this explained in terms of the [harmonic series](https://en.wikipedia.org/wiki/Harmonic_series_%28music%29), but it seems to be taught as more of a [guideline for arrangers](https://www.berklee.edu/core/glossary.html#:~:text=Low%20Interval%20Limit%20%2D%20The%20lowest,within%20a%20normal%20harmonic%20context.) than a physical absolute.\n","type":"Music.Voicing.FourPart.Voicing -> Basics.Bool"},{"name":"method","comment":" Begin a custom voicing method:\n\n    method Chord.categorizeFactors\n        (\\categorized ->\n            ...\n        )\n\n","type":"(Music.Internal.ChordType.ChordType -> Maybe.Maybe categorized) -> (categorized -> List.List Music.Internal.Voicing.FourPart.VoicingClass) -> Music.Voicing.FourPart.VoicingMethod"},{"name":"orderWeighted","comment":" Combine multiple ordering functions:\n\n    orderWeighted\n        [ ( totalSemitoneDistanceOrder previousVoicing, 10.0 )\n        , ( contraryMotionOrder previousVoicing, 5.0 )\n        , ( commonTonesOrder previousVoicing, 2.0 )\n        ]\n        |> List.orderWith\n\n","type":"List.List ( Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order, Basics.Float ) -> Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order"},{"name":"placeSelectedFactors","comment":" Finish selecting factors for a voicing method and place them according to the spacing limits.\n","type":"Music.Voicing.FourPart.SpacingLimits -> Music.Internal.VoicingClass.VoicingClassBuilder Music.Internal.Voicing.FourPart.VoicingClass -> List.List Music.Internal.Voicing.FourPart.VoicingClass"},{"name":"rootPosition","comment":" Voice a chord in \"root position\":\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ rootPosition ]\n        (Chord.major PitchClass.c)\n        |> List.map toString\n        == [ \"G4, E4, G3, C3\"\n           , -- 30 others...\n           ]\n\nA root position voicing is any voicing where the root is in the lowest voice.\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"secondInversion","comment":" Voice a chord in \"second inversion\":\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ secondInversion ]\n        (Chord.major PitchClass.c)\n        |> List.map toString\n        == [ \"E4, G3, C3, G2\"\n           , -- 32 others...\n           ]\n\nA second inversion voicing is any voicing where the fifth of the chord is in the lowest voice.\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"selectFactors","comment":" Begin selecting factors for a voicing method.\n","type":"Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Voicing.FourPart.VoicingClass)"},{"name":"semitoneDistanceVoiceFour","comment":" Given two voicings, find out how far in semitones the fourth (bottom) voice moves.\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceFourOrder","comment":" Compare voicings by absolute difference in semitones in voice four:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceFourOrder previousVoicing)\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order"},{"name":"semitoneDistanceVoiceOne","comment":" Given two voicings, find out how far in semitones the first (top) voice moves.\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceOneOrder","comment":" Compare voicings by absolute difference in semitones in voice one:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceOneOrder previousVoicing)\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order"},{"name":"semitoneDistanceVoiceThree","comment":" Given two voicings, find out how far in semitones the third voice moves.\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceThreeOrder","comment":" Compare voicings by absolute difference in semitones in voice three:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceThreeOrder previousVoicing)\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order"},{"name":"semitoneDistanceVoiceTwo","comment":" Given two voicings, find out how far in semitones the second voice moves.\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceTwoOrder","comment":" Compare voicings by absolute difference in semitones in voice two:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceTwoOrder previousVoicing)\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order"},{"name":"sortWeighted","comment":" Sort by multiple ordering functions:\n\n    sortWeighted\n        [ ( totalSemitoneDistanceOrder previousVoicing, 10.0 )\n        , ( contraryMotionOrder previousVoicing, 5.0 )\n        , ( commonTonesOrder previousVoicing, 2.0 )\n        ]\n        voicingList\n\n","type":"List.List ( Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order, Basics.Float ) -> List.List Music.Voicing.FourPart.Voicing -> List.List Music.Voicing.FourPart.Voicing"},{"name":"span","comment":" Get the interval from the lowest to the highest pitch in the voicing:\n\n     span myVoicing == Interval.minorSeventh\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Internal.Interval.Interval"},{"name":"spread","comment":" Voice a chord using the \"four-way spread\" method:\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ spread ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"C4, B3, E3, G2\"\n           , -- 22 others...\n           ]\n\nAnother open voicing method, with the root of the chord on the bottom for a dramatic effect.\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"thirdInversion","comment":" Voice a chord in \"third inversion\":\n\n    Chord.voiceFourParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        , voiceFour = Range.bassVoice\n        }\n        [ thirdInversion ]\n        (Chord.dominantSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"E4, C4, C3, B♭2\"\n           , -- 32 others...\n           ]\n\nA third inversion voicing is any voicing where the seventh of the chord is in the lowest voice.\n\nNote: this will return an empty list when used with triad chord types like major and minor, because a seventh must be included.\n\n","type":"Music.Voicing.FourPart.VoicingMethod"},{"name":"toIntervalList","comment":" Get all intervals between each pitch in a voicing as a `List`:\n\n    toIntervalList myVoicing\n        == [ Interval.majorSecond\n           , Interval.majorSecond\n           , Interval.majorThird\n           , Interval.perfectFourth\n           , Interval.perfectFifth\n           , Interval.majorSixth\n           ]\n\n","type":"Music.Voicing.FourPart.Voicing -> List.List Music.Internal.Interval.Interval"},{"name":"toIntervals","comment":" Get all intervals between each pitch in a voicing:\n\n    toIntervals myVoicing\n        == { fourToOne = Interval.majorSixth\n           , fourToTwo = Interval.majorSecond\n           , fourToThree = Interval.majorThird\n           , threeToOne = Interval.perfectFifth\n           , threeToTwo = Interval.majorSecond\n           , twoToOne = Interval.perfectFourth\n           }\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Intervals"},{"name":"toPitchList","comment":" Get all pitches contained in a voicing, as a `List`:\n\n    toPitchList myVoicing\n        == [ Pitch.d5\n           , Pitch.a4\n           , Pitch.g4\n           , Pitch.e4\n           ]\n\n","type":"Music.Voicing.FourPart.Voicing -> List.List Music.Internal.Pitch.Pitch"},{"name":"toPitches","comment":" Get all pitches contained in a voicing:\n\n    toPitches myVoicing\n        == { voiceOne = Pitch.d5\n           , voiceTwo = Pitch.a4\n           , voiceThree = Pitch.g4\n           , voiceFour = Pitch.e4\n           }\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Pitches"},{"name":"toString","comment":" Get all pitches contained in a voicing, as a stringified list:\n\n    toPitchList myVoicing\n        == \"D5, A4, G4, E4\"\n\n","type":"Music.Voicing.FourPart.Voicing -> String.String"},{"name":"totalSemitoneDistance","comment":" Given two voicings, find out how far in semitones all voices move.\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Int"},{"name":"totalSemitoneDistanceOrder","comment":" Compare voicings by absolute difference in semitones from a previous voicing:\n\n    myVoicingList\n        |> List.sortWith (totalSemitoneDistanceOrder previousVoicing)\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Order"},{"name":"usesContraryMotion","comment":" Find out whether the first and fourth voices move in opposite directions (known as [contrary motion](https://en.wikipedia.org/wiki/Contrapuntal_motion#Contrary_motion)).\n","type":"Music.Voicing.FourPart.Voicing -> Music.Voicing.FourPart.Voicing -> Basics.Bool"},{"name":"voiceFour","comment":" Get the fourth (lowest) pitch of the voicing:\n\n    voiceFour myVoicing == Pitch.e4\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voiceOne","comment":" Get the first (highest) pitch of the voicing:\n\n    voiceOne myVoicing == Pitch.d5\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voiceThree","comment":" Get the third pitch of the voicing:\n\n    voiceThree myVoicing == Pitch.g4\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voiceTwo","comment":" Get the second pitch of the voicing:\n\n    voiceTwo myVoicing == Pitch.a4\n\n","type":"Music.Voicing.FourPart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voicing","comment":" Create a voicing from pitches and a chord:\n\n    voicing\n        { voiceOne = Pitch.c5\n        , voiceTwo = Pitch.a4\n        , voiceThree = Pitch.g4\n        , voiceFour = Pitch.e4\n        }\n        (Chord.majorSix PitchClass.c)\n        == Ok Voicing ...\n\nIf the pitches given do not match the chord, this function will return `Err` with the erroneous pitch classes:\n\n    voicing\n        { voiceOne = Pitch.c5\n        , voiceTwo = Pitch.d4\n        , voiceThree = Pitch.g4\n        , voiceFour = Pitch.e4\n        }\n        (Chord.majorSix PitchClass.c)\n        == Err [ PitchClass.d ]\n\n","type":"Music.Voicing.FourPart.Pitches -> Music.Internal.Chord.Chord -> Result.Result (List.List Music.PitchClass.PitchClass) Music.Voicing.FourPart.Voicing"},{"name":"withFactor","comment":" Select a chord factor for use in a voice.\n","type":"Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withFactorFrom","comment":" Select a factor from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withThreeFactorsFrom","comment":" Select three factors from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withTwoFactorsFrom","comment":" Select two factors from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueFactor","comment":" Select a factor that has not yet been used.\n","type":"Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueFactorFrom","comment":" Select a factor that has not yet been used, from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueThreeFactorsFrom","comment":" Select two factors that have not yet been used, from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueTwoFactorsFrom","comment":" Select two factors that have not yet been used, from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"}],"binops":[]},{"name":"Music.Voicing.ThreePart","comment":" A chord voicing is an instance of a `Chord` that can be played or sung.\n\n@docs Voicing\n\n\n# Generating voicings\n\nThis package's recommended way of creating three-part `Voicing`s is to use the [Chord.voiceThreeParts](Music-Chord#voicing-chords) function along with `VoicingMethod`s like the ones in this module:\n\n    Chord.voiceThreeParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        }\n        [ basic ]\n        (Chord.majorSeventh PitchClass.c)\n\nIn this example, we pass the following to `voiceThreeParts`:\n\n1.  The `Range`s of the instruments involved\n2.  A list of `VoicingMethod`s to be used\n3.  The chord to voice\n\nThis uses the characteristics of the `VoicingMethod` to return a `List` of all possible `Voicing`s.\n\nFrom here, you may choose from this list based on some criteria:\n\n    myGeneratedVoicings\n        |> List.filter\n            (\\voicing ->\n                containsPitchInVoiceOne Pitch.e5 voicing\n                    && (span voicing >= Interval.perfectOctave)\n            )\n        |> List.sortWith (centerOrder Pitch.g4)\n        |> List.head\n\nThis does the following:\n\n1.  Filters the list to only include `Voicing`s which have E5 in the top voice, and have a span of at least an octave from bottom to top voice\n2.  Sorts the list so that the `Voicing`s which are centered around the pitch G4 are at the beginning\n3.  Takes the first item in the remaining list\n\nThese sorting and filtering processes allow you to account for considerations like [voice leading](https://en.wikipedia.org/wiki/Voice_leading), or the harmonization of a melody. You'll find comparison functions in this module for doing that.\n\n\n# Constructing a single voicing\n\nThere are cases where you may want to create a specific voicing you have in mind:\n\n@docs voicing\n\n\n# Helpers\n\n@docs chord, span, center\n\n\n# Voices\n\n@docs voiceOne, voiceTwo, voiceThree\n@docs containsPitch, containsPitchInVoiceOne, containsPitchInVoiceTwo, containsPitchInVoiceThree\n\n\n# Comparing voicings\n\n\n## Common tones\n\n@docs commonTones\n\n\n## Direction\n\n@docs usesContraryMotion, containsParallelFifths, containsParallelOctaves\n\n\n## Distance\n\n@docs totalSemitoneDistance, semitoneDistanceVoiceOne, semitoneDistanceVoiceTwo, semitoneDistanceVoiceThree\n\n\n# Low interval limits\n\n@docs isWithinLowIntervalLimits\n\n\n# Sorting voicings\n\n@docs sortWeighted, orderWeighted\n@docs centerOrder, commonTonesOrder, contraryMotionOrder, totalSemitoneDistanceOrder, semitoneDistanceVoiceOneOrder, semitoneDistanceVoiceTwoOrder, semitoneDistanceVoiceThreeOrder\n\n\n# Conversion\n\n@docs Pitches, toPitches, toPitchList, toString\n\n\n## Intervals\n\n@docs Intervals, toIntervals, toIntervalList\n\n\n# Voicing methods\n\n\n## Basic\n\n@docs basic\n\n\n## Jazz\n\n@docs shell\n\n\n## Custom voicing methods\n\nVoicing methods are a deep and nuanced topic, that I hope to make approachable. I've modeled this API with three main concepts of chord voicing in mind:\n\n  - **Spacing**: how close together or far apart can each voice be from its neighbor?\n  - **Placement**: which factors from the chord can be used in which places?\n  - **Uniqueness**: can certain factors be repeated, or must they be used only once?\n\nHere are the steps in building a voicing method:\n\n\n### Categorize the factors in the chord\n\nSince chords can vary, use some method of categorizing the factors of a chord into groups that you can guarantee are present. Examples of this type of categorization function are `Chord.categorizeFactors` and `Chord.availableTensions`.\n\n\n### Specify the placement and uniqueness of factors\n\nSelect factors using the `with...` functions in this section.\n\n\n### Finish and specify spacing limits\n\nUse the `placeSelectedFactors` function, passing a `SpacingLimits`.\n\nExample:\n\n    myCustomVoicingMethod : VoicingMethod\n    myCustomVoicingMethod =\n        custom\n            ChordType.categorizeFactors\n            (\\factors ->\n                selectFactors\n                    |> withFactor factors.fifth\n                    |> withFactor factors.third\n                    |> withFactor Interval.perfectUnison\n                    |> placeSelectedFactors spacingLimits\n            )\n\n    spacingLimits =\n        { twoToOne =\n            Interval.range\n                Interval.augmentedUnison\n                Interval.perfectOctave\n        , threeToTwo =\n            Interval.range\n                Interval.augmentedUnison\n                Interval.perfectOctave\n        }\n\n@docs VoicingMethod\n@docs SpacingLimits\n@docs method\n@docs selectFactors, withFactor, withUniqueFactor, withFactorFrom, withUniqueFactorFrom, withTwoFactorsFrom, withUniqueTwoFactorsFrom, withThreeFactorsFrom, withUniqueThreeFactorsFrom\n@docs placeSelectedFactors\n@docs combineVoicingMethods\n\n","unions":[],"aliases":[{"name":"Intervals","comment":" ","args":[],"type":"{ threeToOne : Music.Internal.Interval.Interval, threeToTwo : Music.Internal.Interval.Interval, twoToOne : Music.Internal.Interval.Interval }"},{"name":"Pitches","comment":" The pitches contained in a voicing.\n\nThese are in order from highest (`voiceOne`) to lowest (`voiceThree`), the way you might read them on a staff.\n\n","args":[],"type":"{ voiceOne : Music.Internal.Pitch.Pitch, voiceTwo : Music.Internal.Pitch.Pitch, voiceThree : Music.Internal.Pitch.Pitch }"},{"name":"SpacingLimits","comment":" ","args":[],"type":"{ twoToOne : Music.Internal.Interval.Range, threeToTwo : Music.Internal.Interval.Range }"},{"name":"Voicing","comment":" ","args":[],"type":"Music.Internal.Voicing.ThreePart.Voicing"},{"name":"VoicingMethod","comment":" ","args":[],"type":"Music.Internal.Voicing.ThreePart.VoicingMethod"}],"values":[{"name":"basic","comment":" A basic textbook method for voicing a chord in root position:\n\n    Chord.voiceThreeParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        }\n        [ basic ]\n        (Chord.major PitchClass.c)\n        |> List.map toString\n        == [ \"G3, E3, C3\"\n           , \"G4, E4, C4\"\n           ]\n\n","type":"Music.Voicing.ThreePart.VoicingMethod"},{"name":"center","comment":" Get the midpoint between the highest and lowest voices in semitones:\n\n    center myVoicing\n        == Pitch.semitones Pitch.fSharp3\n\n","type":"Music.Voicing.ThreePart.Voicing -> Basics.Int"},{"name":"centerOrder","comment":" Compare voicings by how far their centers are from a goal pitch:\n\n    myVoicingList\n        |> List.sortWith (centerOrder Pitch.g4)\n\nUseful for finding voicings that are centered around a particular pitch.\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order"},{"name":"chord","comment":" Get the chord being voiced:\n\n    chord myVoicing == Chord.majorSixNine PitchClass.c\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Internal.Chord.Chord"},{"name":"combineVoicingMethods","comment":" Combine multiple `VoicingMethod`s together:\n\n    myComboVoicingMethod =\n        combineVoicingMethods [ voicingMethodOne, voicingMethodTwo, voicingMethodThree ]\n\nThis is useful if you want to define multiple `VoicingMethod`s that act as a group (e.g. inversions or similar methods that use different chord factors).\n\n","type":"List.List Music.Voicing.ThreePart.VoicingMethod -> Music.Voicing.ThreePart.VoicingMethod"},{"name":"commonTones","comment":" Get all pitches in common between two voicings:\n\n    commonTones bFlatVoicing bDimVoicing\n        == [ Pitch.d4\n           , Pitch.f4\n           ]\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> List.List Music.Internal.Pitch.Pitch"},{"name":"commonTonesOrder","comment":" Compare voicings by how many pitches they have in common with a previous voicing:\n\n    myVoicingList\n        |> List.sortWith (commonTonesOrder previousVoicing)\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order"},{"name":"containsParallelFifths","comment":" Find out whether any two moving voices maintain a perfect fifth interval between them. Identifying [parallel fifths and octaves](https://en.wikipedia.org/wiki/Consecutive_fifths) is important in the study of [counterpoint](https://en.wikipedia.org/wiki/Counterpoint).\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Bool"},{"name":"containsParallelOctaves","comment":" Find out whether any two moving voices maintain a perfect octave interval between them.\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Bool"},{"name":"containsPitch","comment":" Find out whether a voicing contains a specific pitch:\n\n     containsPitch Pitch.d5 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.ThreePart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceOne","comment":" Find out whether a voicing has a specific pitch in the first voice:\n\n     containsPitchInVoiceOne Pitch.d5 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.ThreePart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceThree","comment":" Find out whether a voicing has a specific pitch in the third voice:\n\n     containsPitchInVoiceThree Pitch.g4 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.ThreePart.Voicing -> Basics.Bool"},{"name":"containsPitchInVoiceTwo","comment":" Find out whether a voicing has a specific pitch in the second voice:\n\n     containsPitchInVoiceTwo Pitch.a4 myVoicing == True\n\n","type":"Music.Internal.Pitch.Pitch -> Music.Voicing.ThreePart.Voicing -> Basics.Bool"},{"name":"contraryMotionOrder","comment":" Compare voicings by whether they use contrary motion from a previous voicing:\n\n    myVoicingList\n        |> List.sortWith (contraryMotionOrder previousVoicing)\n\n\"Contrary motion\" here is in respect to the top and bottom voices.\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order"},{"name":"isWithinLowIntervalLimits","comment":" A low interval limit is the lowest pitch at which the character of an interval cannot be heard clearly. I have heard this explained in terms of the [harmonic series](https://en.wikipedia.org/wiki/Harmonic_series_%28music%29), but it seems to be taught as more of a [guideline for arrangers](https://www.berklee.edu/core/glossary.html#:~:text=Low%20Interval%20Limit%20%2D%20The%20lowest,within%20a%20normal%20harmonic%20context.) than a physical absolute.\n","type":"Music.Voicing.ThreePart.Voicing -> Basics.Bool"},{"name":"method","comment":" Begin a custom voicing method:\n\n    method Chord.categorizeFactors\n        (\\categorized ->\n            ...\n        )\n\n","type":"(Music.Internal.ChordType.ChordType -> Maybe.Maybe categorized) -> (categorized -> List.List Music.Internal.Voicing.ThreePart.VoicingClass) -> Music.Voicing.ThreePart.VoicingMethod"},{"name":"orderWeighted","comment":" Combine multiple ordering functions:\n\n    orderWeighted\n        [ ( totalSemitoneDistanceOrder previousVoicing, 10.0 )\n        , ( contraryMotionOrder previousVoicing, 5.0 )\n        , ( commonTonesOrder previousVoicing, 2.0 )\n        ]\n        |> List.orderWith\n\n","type":"List.List ( Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order, Basics.Float ) -> Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order"},{"name":"placeSelectedFactors","comment":" Finish selecting factors for a voicing method and place them according to the spacing limits.\n","type":"Music.Voicing.ThreePart.SpacingLimits -> Music.Internal.VoicingClass.VoicingClassBuilder Music.Internal.Voicing.ThreePart.VoicingClass -> List.List Music.Internal.Voicing.ThreePart.VoicingClass"},{"name":"selectFactors","comment":" Begin selecting factors for a voicing method.\n","type":"Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Voicing.ThreePart.VoicingClass)"},{"name":"semitoneDistanceVoiceOne","comment":" Given two voicings, find out how far in semitones the first (top) voice moves.\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceOneOrder","comment":" Compare voicings by absolute difference in semitones in voice one:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceOneOrder previousVoicing)\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order"},{"name":"semitoneDistanceVoiceThree","comment":" Given two voicings, find out how far in semitones the third voice moves.\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceThreeOrder","comment":" Compare voicings by absolute difference in semitones in voice three:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceThreeOrder previousVoicing)\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order"},{"name":"semitoneDistanceVoiceTwo","comment":" Given two voicings, find out how far in semitones the second voice moves.\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Int"},{"name":"semitoneDistanceVoiceTwoOrder","comment":" Compare voicings by absolute difference in semitones in voice two:\n\n    myVoicingList\n        |> List.sortWith (semitoneDistanceVoiceTwoOrder previousVoicing)\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order"},{"name":"shell","comment":" Voice a chord with the \"shell\" method:\n\n    Chord.voiceThreeParts\n        { voiceOne = Range.sopranoVoice\n        , voiceTwo = Range.altoVoice\n        , voiceThree = Range.tenorVoice\n        }\n        [ shell ]\n        (Chord.majorSeventh PitchClass.c)\n        |> List.map toString\n        == [ \"E4, B3, C3\"\n           , -- 3 others...\n           ]\n\nPopularized by Bud Powell and Thelonious Monk, \"shell\" voicings include the essential pitches in jazz chords, and are useful for minimalistic accompaniment.\n\n","type":"Music.Voicing.ThreePart.VoicingMethod"},{"name":"sortWeighted","comment":" Sort by multiple ordering functions:\n\n    sortWeighted\n        [ ( totalSemitoneDistanceOrder previousVoicing, 10.0 )\n        , ( contraryMotionOrder previousVoicing, 5.0 )\n        , ( commonTonesOrder previousVoicing, 2.0 )\n        ]\n        voicingList\n\n","type":"List.List ( Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order, Basics.Float ) -> List.List Music.Voicing.ThreePart.Voicing -> List.List Music.Voicing.ThreePart.Voicing"},{"name":"span","comment":" Get the interval from the lowest to the highest pitch in the voicing:\n\n     span myVoicing == Interval.minorSeventh\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Internal.Interval.Interval"},{"name":"toIntervalList","comment":" Get all intervals between each pitch in a voicing as a `List`:\n\n    toIntervalList myVoicing\n        == [ Interval.majorThird\n           , Interval.perfectFourth\n           , Interval.majorSixth\n           ]\n\n","type":"Music.Voicing.ThreePart.Voicing -> List.List Music.Internal.Interval.Interval"},{"name":"toIntervals","comment":" Get all intervals between each pitch in a voicing:\n\n    toIntervals myVoicing\n        == { threeToOne = Interval.majorSixth\n           , threeToTwo = Interval.perfectFourth\n           , twoToOne = Interval.majorThird\n           }\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Intervals"},{"name":"toPitchList","comment":" Get all pitches contained in a voicing, as a `List`:\n\n    toPitchList myVoicing\n        == [ Pitch.d5\n           , Pitch.a4\n           , Pitch.g4\n           ]\n\n","type":"Music.Voicing.ThreePart.Voicing -> List.List Music.Internal.Pitch.Pitch"},{"name":"toPitches","comment":" Get all pitches contained in a voicing:\n\n    toPitches myVoicing\n        == { voiceOne = Pitch.d5\n           , voiceTwo = Pitch.a4\n           , voiceThree = Pitch.g4\n           }\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Pitches"},{"name":"toString","comment":" Get all pitches contained in a voicing, as a stringified list:\n\n    toPitchList myVoicing\n        == \"D5, A4, G4, E4, C4\"\n\n","type":"Music.Voicing.ThreePart.Voicing -> String.String"},{"name":"totalSemitoneDistance","comment":" Given two voicings, find out how far in semitones all voices move.\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Int"},{"name":"totalSemitoneDistanceOrder","comment":" Compare voicings by absolute difference in semitones from a previous voicing:\n\n    myVoicingList\n        |> List.sortWith (totalSemitoneDistanceOrder previousVoicing)\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Order"},{"name":"usesContraryMotion","comment":" Find out whether the first and third voices move in opposite directions (known as [contrary motion](https://en.wikipedia.org/wiki/Contrapuntal_motion#Contrary_motion)).\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Voicing.ThreePart.Voicing -> Basics.Bool"},{"name":"voiceOne","comment":" Get the first (highest) pitch of the voicing:\n\n    voiceOne myVoicing == Pitch.d5\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voiceThree","comment":" Get the third (lowest) pitch of the voicing:\n\n    voiceThree myVoicing == Pitch.g4\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voiceTwo","comment":" Get the second pitch of the voicing:\n\n    voiceTwo myVoicing == Pitch.a4\n\n","type":"Music.Voicing.ThreePart.Voicing -> Music.Internal.Pitch.Pitch"},{"name":"voicing","comment":" Create a voicing from pitches and a chord:\n\n    voicing\n        { voiceOne = Pitch.g4\n        , voiceTwo = Pitch.e4\n        , voiceThree = Pitch.c4\n        }\n        (Chord.majorSix PitchClass.c)\n        == Ok Voicing ...\n\nIf the pitches given do not match the chord, this function will return `Err` with the erroneous pitch classes:\n\n    voicing\n        { voiceOne = Pitch.g4\n        , voiceTwo = Pitch.d4\n        , voiceThree = Pitch.c4\n        }\n        (Chord.majorSix PitchClass.c)\n        == Err [ PitchClass.d ]\n\n","type":"Music.Voicing.ThreePart.Pitches -> Music.Internal.Chord.Chord -> Result.Result (List.List Music.PitchClass.PitchClass) Music.Voicing.ThreePart.Voicing"},{"name":"withFactor","comment":" Select a chord factor for use in a voice.\n","type":"Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withFactorFrom","comment":" Select a factor from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withThreeFactorsFrom","comment":" Select three factors from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withTwoFactorsFrom","comment":" Select two factors from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueFactor","comment":" Select a factor that has not yet been used.\n","type":"Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueFactorFrom","comment":" Select a factor that has not yet been used, from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueThreeFactorsFrom","comment":" Select two factors that have not yet been used, from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"},{"name":"withUniqueTwoFactorsFrom","comment":" Select two factors that have not yet been used, from a list of options.\n","type":"List.List Music.Internal.Interval.Interval -> Music.Internal.VoicingClass.VoicingClassBuilder (Music.Internal.Interval.Interval -> Music.Internal.Interval.Interval -> a) -> Music.Internal.VoicingClass.VoicingClassBuilder a"}],"binops":[]}]