duncanmalashock / elm-music-theory / 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 =
Music.Internal.Pitch.Pitch

Helpers

transposeUp : Music.Internal.Interval.Interval -> Pitch -> Pitch

Transpose a pitch upward by an interval.

transposeUp Interval.perfectFifth c4 == g4

transposeDown : Music.Internal.Interval.Interval -> Pitch -> Pitch

Transpose a pitch downward by an interval.

transposeDown Interval.perfectFifth c4 == f3

intervalBetween : Pitch -> Pitch -> Music.Internal.Interval.Interval

Get the interval between two pitches:

intervalBetween c4 g4 == Interval.perfectFifth

areEnharmonicEquivalents : Pitch -> Pitch -> Basics.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 -> Basics.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 -> Basics.Int

Distance in semitones from C0. Useful for sorting.

semitones c4 == 48

toMIDINoteNumber : Pitch -> Basics.Int

Convert a pitch to a MIDI number:

toMIDINoteNumber c4 == 60

toFrequency : Pitch -> Basics.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 : Basics.Int -> Music.Internal.PitchClass.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 : Music.Internal.Pitch.Pitch

c1 : Music.Internal.Pitch.Pitch

c2 : Music.Internal.Pitch.Pitch

c3 : Music.Internal.Pitch.Pitch

c4 : Music.Internal.Pitch.Pitch

c5 : Music.Internal.Pitch.Pitch

c6 : Music.Internal.Pitch.Pitch

c7 : Music.Internal.Pitch.Pitch

c8 : Music.Internal.Pitch.Pitch

cSharp0 : Music.Internal.Pitch.Pitch

cSharp1 : Music.Internal.Pitch.Pitch

cSharp2 : Music.Internal.Pitch.Pitch

cSharp3 : Music.Internal.Pitch.Pitch

cSharp4 : Music.Internal.Pitch.Pitch

cSharp5 : Music.Internal.Pitch.Pitch

cSharp6 : Music.Internal.Pitch.Pitch

cSharp7 : Music.Internal.Pitch.Pitch

cSharp8 : Music.Internal.Pitch.Pitch

d0 : Music.Internal.Pitch.Pitch

d1 : Music.Internal.Pitch.Pitch

d2 : Music.Internal.Pitch.Pitch

d3 : Music.Internal.Pitch.Pitch

d4 : Music.Internal.Pitch.Pitch

d5 : Music.Internal.Pitch.Pitch

d6 : Music.Internal.Pitch.Pitch

d7 : Music.Internal.Pitch.Pitch

d8 : Music.Internal.Pitch.Pitch

dFlat0 : Music.Internal.Pitch.Pitch

dFlat1 : Music.Internal.Pitch.Pitch

dFlat2 : Music.Internal.Pitch.Pitch

dFlat3 : Music.Internal.Pitch.Pitch

dFlat4 : Music.Internal.Pitch.Pitch

dFlat5 : Music.Internal.Pitch.Pitch

dFlat6 : Music.Internal.Pitch.Pitch

dFlat7 : Music.Internal.Pitch.Pitch

dFlat8 : Music.Internal.Pitch.Pitch

dSharp0 : Music.Internal.Pitch.Pitch

dSharp1 : Music.Internal.Pitch.Pitch

dSharp2 : Music.Internal.Pitch.Pitch

dSharp3 : Music.Internal.Pitch.Pitch

dSharp4 : Music.Internal.Pitch.Pitch

dSharp5 : Music.Internal.Pitch.Pitch

dSharp6 : Music.Internal.Pitch.Pitch

dSharp7 : Music.Internal.Pitch.Pitch

dSharp8 : Music.Internal.Pitch.Pitch

e0 : Music.Internal.Pitch.Pitch

e1 : Music.Internal.Pitch.Pitch

e2 : Music.Internal.Pitch.Pitch

e3 : Music.Internal.Pitch.Pitch

e4 : Music.Internal.Pitch.Pitch

e5 : Music.Internal.Pitch.Pitch

e6 : Music.Internal.Pitch.Pitch

e7 : Music.Internal.Pitch.Pitch

e8 : Music.Internal.Pitch.Pitch

eFlat0 : Music.Internal.Pitch.Pitch

eFlat1 : Music.Internal.Pitch.Pitch

eFlat2 : Music.Internal.Pitch.Pitch

eFlat3 : Music.Internal.Pitch.Pitch

eFlat4 : Music.Internal.Pitch.Pitch

eFlat5 : Music.Internal.Pitch.Pitch

eFlat6 : Music.Internal.Pitch.Pitch

eFlat7 : Music.Internal.Pitch.Pitch

eFlat8 : Music.Internal.Pitch.Pitch

f0 : Music.Internal.Pitch.Pitch

f1 : Music.Internal.Pitch.Pitch

f2 : Music.Internal.Pitch.Pitch

f3 : Music.Internal.Pitch.Pitch

f4 : Music.Internal.Pitch.Pitch

f5 : Music.Internal.Pitch.Pitch

f6 : Music.Internal.Pitch.Pitch

f7 : Music.Internal.Pitch.Pitch

f8 : Music.Internal.Pitch.Pitch

fSharp0 : Music.Internal.Pitch.Pitch

fSharp1 : Music.Internal.Pitch.Pitch

fSharp2 : Music.Internal.Pitch.Pitch

fSharp3 : Music.Internal.Pitch.Pitch

fSharp4 : Music.Internal.Pitch.Pitch

fSharp5 : Music.Internal.Pitch.Pitch

fSharp6 : Music.Internal.Pitch.Pitch

fSharp7 : Music.Internal.Pitch.Pitch

fSharp8 : Music.Internal.Pitch.Pitch

g0 : Music.Internal.Pitch.Pitch

g1 : Music.Internal.Pitch.Pitch

g2 : Music.Internal.Pitch.Pitch

g3 : Music.Internal.Pitch.Pitch

g4 : Music.Internal.Pitch.Pitch

g5 : Music.Internal.Pitch.Pitch

g6 : Music.Internal.Pitch.Pitch

g7 : Music.Internal.Pitch.Pitch

g8 : Music.Internal.Pitch.Pitch

gFlat0 : Music.Internal.Pitch.Pitch

gFlat1 : Music.Internal.Pitch.Pitch

gFlat2 : Music.Internal.Pitch.Pitch

gFlat3 : Music.Internal.Pitch.Pitch

gFlat4 : Music.Internal.Pitch.Pitch

gFlat5 : Music.Internal.Pitch.Pitch

gFlat6 : Music.Internal.Pitch.Pitch

gFlat7 : Music.Internal.Pitch.Pitch

gFlat8 : Music.Internal.Pitch.Pitch

gSharp0 : Music.Internal.Pitch.Pitch

gSharp1 : Music.Internal.Pitch.Pitch

gSharp2 : Music.Internal.Pitch.Pitch

gSharp3 : Music.Internal.Pitch.Pitch

gSharp4 : Music.Internal.Pitch.Pitch

gSharp5 : Music.Internal.Pitch.Pitch

gSharp6 : Music.Internal.Pitch.Pitch

gSharp7 : Music.Internal.Pitch.Pitch

gSharp8 : Music.Internal.Pitch.Pitch

a0 : Music.Internal.Pitch.Pitch

a1 : Music.Internal.Pitch.Pitch

a2 : Music.Internal.Pitch.Pitch

a3 : Music.Internal.Pitch.Pitch

a4 : Music.Internal.Pitch.Pitch

a5 : Music.Internal.Pitch.Pitch

a6 : Music.Internal.Pitch.Pitch

a7 : Music.Internal.Pitch.Pitch

a8 : Music.Internal.Pitch.Pitch

aFlat0 : Music.Internal.Pitch.Pitch

aFlat1 : Music.Internal.Pitch.Pitch

aFlat2 : Music.Internal.Pitch.Pitch

aFlat3 : Music.Internal.Pitch.Pitch

aFlat4 : Music.Internal.Pitch.Pitch

aFlat5 : Music.Internal.Pitch.Pitch

aFlat6 : Music.Internal.Pitch.Pitch

aFlat7 : Music.Internal.Pitch.Pitch

aFlat8 : Music.Internal.Pitch.Pitch

aSharp0 : Music.Internal.Pitch.Pitch

aSharp1 : Music.Internal.Pitch.Pitch

aSharp2 : Music.Internal.Pitch.Pitch

aSharp3 : Music.Internal.Pitch.Pitch

aSharp4 : Music.Internal.Pitch.Pitch

aSharp5 : Music.Internal.Pitch.Pitch

aSharp6 : Music.Internal.Pitch.Pitch

aSharp7 : Music.Internal.Pitch.Pitch

aSharp8 : Music.Internal.Pitch.Pitch

b0 : Music.Internal.Pitch.Pitch

b1 : Music.Internal.Pitch.Pitch

b2 : Music.Internal.Pitch.Pitch

b3 : Music.Internal.Pitch.Pitch

b4 : Music.Internal.Pitch.Pitch

b5 : Music.Internal.Pitch.Pitch

b6 : Music.Internal.Pitch.Pitch

b7 : Music.Internal.Pitch.Pitch

b8 : Music.Internal.Pitch.Pitch

bFlat0 : Music.Internal.Pitch.Pitch

bFlat1 : Music.Internal.Pitch.Pitch

bFlat2 : Music.Internal.Pitch.Pitch

bFlat3 : Music.Internal.Pitch.Pitch

bFlat4 : Music.Internal.Pitch.Pitch

bFlat5 : Music.Internal.Pitch.Pitch

bFlat6 : Music.Internal.Pitch.Pitch

bFlat7 : Music.Internal.Pitch.Pitch

bFlat8 : Music.Internal.Pitch.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 : Music.Internal.Pitch.Pitch

cFlat2 : Music.Internal.Pitch.Pitch

cFlat3 : Music.Internal.Pitch.Pitch

cFlat4 : Music.Internal.Pitch.Pitch

cFlat5 : Music.Internal.Pitch.Pitch

cFlat6 : Music.Internal.Pitch.Pitch

cFlat7 : Music.Internal.Pitch.Pitch

cFlat8 : Music.Internal.Pitch.Pitch

eSharp0 : Music.Internal.Pitch.Pitch

eSharp1 : Music.Internal.Pitch.Pitch

eSharp2 : Music.Internal.Pitch.Pitch

eSharp3 : Music.Internal.Pitch.Pitch

eSharp4 : Music.Internal.Pitch.Pitch

eSharp5 : Music.Internal.Pitch.Pitch

eSharp6 : Music.Internal.Pitch.Pitch

eSharp7 : Music.Internal.Pitch.Pitch

eSharp8 : Music.Internal.Pitch.Pitch

fFlat0 : Music.Internal.Pitch.Pitch

fFlat1 : Music.Internal.Pitch.Pitch

fFlat2 : Music.Internal.Pitch.Pitch

fFlat3 : Music.Internal.Pitch.Pitch

fFlat4 : Music.Internal.Pitch.Pitch

fFlat5 : Music.Internal.Pitch.Pitch

fFlat6 : Music.Internal.Pitch.Pitch

fFlat7 : Music.Internal.Pitch.Pitch

fFlat8 : Music.Internal.Pitch.Pitch

bSharp0 : Music.Internal.Pitch.Pitch

bSharp1 : Music.Internal.Pitch.Pitch

bSharp2 : Music.Internal.Pitch.Pitch

bSharp3 : Music.Internal.Pitch.Pitch

bSharp4 : Music.Internal.Pitch.Pitch

bSharp5 : Music.Internal.Pitch.Pitch

bSharp6 : Music.Internal.Pitch.Pitch

bSharp7 : Music.Internal.Pitch.Pitch

bSharp8 : Music.Internal.Pitch.Pitch