duncanmalashock/elm-music-theory/1.0.0

Music.Pitch

A pitch represents a specific frequency of sound with a letter name, octave, and accidental. E.g. the pitch "B♭4".

type alias Pitch =
Pitch

Helpers

transposeUp : Interval -> Pitch -> Pitch

Transpose a pitch upward by an interval.

transposeUp Interval.perfectFifth c4 == g4
transposeDown : Interval -> Pitch -> Pitch

Transpose a pitch downward by an interval.

transposeDown Interval.perfectFifth c4 == f3
intervalBetween : Pitch -> Pitch -> Interval

Get the interval between two pitches:

intervalBetween c4 g4 == Interval.perfectFifth
areEnharmonicEquivalents : Pitch -> Pitch -> Bool

Check whether two pitches are enharmonic equivalents of each other. Enharmonic equivalents are two pitches with different names but the same sound:

areEnharmonicEquivalents cSharp4 dFlat4 == True
octave : Pitch -> Int

Get the octave of a pitch:

octave c4 == 4

Generating

chromaticRun : Pitch -> Pitch -> List Pitch

Generate a section of the ascending or descending chromatic scale between two pitches:

chromaticRun a4 d5
    == [ a4
       , aSharp4
       , b4
       , c5
       , cSharp5
       , d5
       ]

Ascending runs use sharps; descending runs use flats:

chromaticRun d5 a4
    == [ d5
       , dFlat5
       , c5
       , b4
       , bFlat4
       , a4
       ]

Conversion

semitones : Pitch -> Int

Distance in semitones from C0. Useful for sorting.

semitones c4 == 48
toMIDINoteNumber : Pitch -> Int

Convert a pitch to a MIDI number:

toMIDINoteNumber c4 == 60
toFrequency : Pitch -> Float

Convert a pitch to a frequency in Hertz:

toFrequency c4 == 261.6255653005986
toString : Pitch -> String

A pitch's letter name, accidental, and octave number:

toString cSharp4 == "C♯4"
fromPitchClassInOctave : Int -> PitchClass -> Pitch

Create a pitch from a pitch class and octave number:

fromPitchClassInOctave 4 c == c4

Respelling

Equivalent pitches can be spelled multiple ways. These functions help with respelling pitches for certain circumstances.

normalize : Pitch -> Pitch

Respell a pitch with at most two accidentals:

bTripleSharp4 =
    bSharp4
        |> transposeUp Interval.augmentedUnison
        |> transposeUp Interval.augmentedUnison


normalize bTripleSharp4
    == d5

Pitches 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.

simplify : Pitch -> Pitch

Respell a pitch with as few accidentals as possible:

simplify fFlat4
    == e4

This is helpful in musical idioms like jazz, where simple spellings are preferred.

Constructors

c0 : Pitch
c1 : Pitch
c2 : Pitch
c3 : Pitch
c4 : Pitch
c5 : Pitch
c6 : Pitch
c7 : Pitch
c8 : Pitch
cSharp0 : Pitch
cSharp1 : Pitch
cSharp2 : Pitch
cSharp3 : Pitch
cSharp4 : Pitch
cSharp5 : Pitch
cSharp6 : Pitch
cSharp7 : Pitch
cSharp8 : Pitch
d0 : Pitch
d1 : Pitch
d2 : Pitch
d3 : Pitch
d4 : Pitch
d5 : Pitch
d6 : Pitch
d7 : Pitch
d8 : Pitch
dFlat0 : Pitch
dFlat1 : Pitch
dFlat2 : Pitch
dFlat3 : Pitch
dFlat4 : Pitch
dFlat5 : Pitch
dFlat6 : Pitch
dFlat7 : Pitch
dFlat8 : Pitch
dSharp0 : Pitch
dSharp1 : Pitch
dSharp2 : Pitch
dSharp3 : Pitch
dSharp4 : Pitch
dSharp5 : Pitch
dSharp6 : Pitch
dSharp7 : Pitch
dSharp8 : Pitch
e0 : Pitch
e1 : Pitch
e2 : Pitch
e3 : Pitch
e4 : Pitch
e5 : Pitch
e6 : Pitch
e7 : Pitch
e8 : Pitch
eFlat0 : Pitch
eFlat1 : Pitch
eFlat2 : Pitch
eFlat3 : Pitch
eFlat4 : Pitch
eFlat5 : Pitch
eFlat6 : Pitch
eFlat7 : Pitch
eFlat8 : Pitch
f0 : Pitch
f1 : Pitch
f2 : Pitch
f3 : Pitch
f4 : Pitch
f5 : Pitch
f6 : Pitch
f7 : Pitch
f8 : Pitch
fSharp0 : Pitch
fSharp1 : Pitch
fSharp2 : Pitch
fSharp3 : Pitch
fSharp4 : Pitch
fSharp5 : Pitch
fSharp6 : Pitch
fSharp7 : Pitch
fSharp8 : Pitch
g0 : Pitch
g1 : Pitch
g2 : Pitch
g3 : Pitch
g4 : Pitch
g5 : Pitch
g6 : Pitch
g7 : Pitch
g8 : Pitch
gFlat0 : Pitch
gFlat1 : Pitch
gFlat2 : Pitch
gFlat3 : Pitch
gFlat4 : Pitch
gFlat5 : Pitch
gFlat6 : Pitch
gFlat7 : Pitch
gFlat8 : Pitch
gSharp0 : Pitch
gSharp1 : Pitch
gSharp2 : Pitch
gSharp3 : Pitch
gSharp4 : Pitch
gSharp5 : Pitch
gSharp6 : Pitch
gSharp7 : Pitch
gSharp8 : Pitch
a0 : Pitch
a1 : Pitch
a2 : Pitch
a3 : Pitch
a4 : Pitch
a5 : Pitch
a6 : Pitch
a7 : Pitch
a8 : Pitch
aFlat0 : Pitch
aFlat1 : Pitch
aFlat2 : Pitch
aFlat3 : Pitch
aFlat4 : Pitch
aFlat5 : Pitch
aFlat6 : Pitch
aFlat7 : Pitch
aFlat8 : Pitch
aSharp0 : Pitch
aSharp1 : Pitch
aSharp2 : Pitch
aSharp3 : Pitch
aSharp4 : Pitch
aSharp5 : Pitch
aSharp6 : Pitch
aSharp7 : Pitch
aSharp8 : Pitch
b0 : Pitch
b1 : Pitch
b2 : Pitch
b3 : Pitch
b4 : Pitch
b5 : Pitch
b6 : Pitch
b7 : Pitch
b8 : Pitch
bFlat0 : Pitch
bFlat1 : Pitch
bFlat2 : Pitch
bFlat3 : Pitch
bFlat4 : Pitch
bFlat5 : Pitch
bFlat6 : Pitch
bFlat7 : Pitch
bFlat8 : Pitch

Less common pitches

These are used less frequently in music. Most likely you want a pitch from the previous section.

Enharmonic equivalents of natural notes

cFlat1 : Pitch
cFlat2 : Pitch
cFlat3 : Pitch
cFlat4 : Pitch
cFlat5 : Pitch
cFlat6 : Pitch
cFlat7 : Pitch
cFlat8 : Pitch
eSharp0 : Pitch
eSharp1 : Pitch
eSharp2 : Pitch
eSharp3 : Pitch
eSharp4 : Pitch
eSharp5 : Pitch
eSharp6 : Pitch
eSharp7 : Pitch
eSharp8 : Pitch
fFlat0 : Pitch
fFlat1 : Pitch
fFlat2 : Pitch
fFlat3 : Pitch
fFlat4 : Pitch
fFlat5 : Pitch
fFlat6 : Pitch
fFlat7 : Pitch
fFlat8 : Pitch
bSharp0 : Pitch
bSharp1 : Pitch
bSharp2 : Pitch
bSharp3 : Pitch
bSharp4 : Pitch
bSharp5 : Pitch
bSharp6 : Pitch
bSharp7 : Pitch
bSharp8 : Pitch