Portability | non-portable (TF,GNTD) |
---|---|
Stability | experimental |
Maintainer | hans@hanshoglund.se |
Safe Haskell | None |
Provides a standard pitch representation.
- data Accidental
- doubleFlat :: Accidental
- flat :: Accidental
- natural :: Accidental
- sharp :: Accidental
- doubleSharp :: Accidental
- isNatural :: Accidental -> Bool
- isSharpened :: Accidental -> Bool
- isFlattened :: Accidental -> Bool
- isStandard :: Accidental -> Bool
- data Name
- data Pitch
- pitch :: Name -> Accidental -> Pitch
- name :: Pitch -> Name
- accidental :: Pitch -> Accidental
- asPitch :: Pitch -> Pitch
- middleC :: Pitch
Accidentals
data Accidental Source
An accidental is either flat, natural or sharp.
This representation allows for an arbitrary number of flats or sharps rather than just single (the ♯ and ♭ symbols) and double (i.e. the x and ♭♭ symbols).
The Num
and Enum
instances treat Accidental
as the number of altered semitones,
i.e. a double flat is -2
, natural 0
and so on.
Enum Accidental | |
Eq Accidental | |
Integral Accidental | |
Num Accidental | |
Ord Accidental | |
Real Accidental | |
Show Accidental | |
Alterable Accidental | |
(IsPitch a, Alterable a) => IsPitch (Accidental -> a) | Magic instance that allow us to write |
doubleFlat :: AccidentalSource
The double flat accidental.
The flat accidental.
The natural accidental.
The sharp accidental.
doubleSharp :: AccidentalSource
The double sharp accidental.
Inspecting accidentals
isNatural :: Accidental -> BoolSource
Returns whether this is a natural accidental.
isSharpened :: Accidental -> BoolSource
Returns whether this is a sharp, double sharp etc.
isFlattened :: Accidental -> BoolSource
Returns whether this is a flat, double flat etc.
isStandard :: Accidental -> BoolSource
Returns whether this is a standard accidental, i.e. either a double flat, flat, natural, sharp or doubl sharp.
Name
Pitch
Common pitch representation.
Intervals and pitches can be added using .+^
. To get the interval between
two pitches, use .-.
.
Pitches are normally entered using the following literals.
c d e f g a b
Notes with accidentals can be written by adding the s
or b
suffices
(or two for double sharps and flats).
cs, ds, es ... -- sharp cb, db, eb ... -- flat css, dss, ess ... -- double sharp cbb, dbb, ebb ... -- double flat
There is also a convenience syntax for entering pitches one octave up or
down, using '
and _
respectively.
g a b c' d c b_ c
Because of some overloading magic, we can actually write sharp
and
flat
as postfix functions. This gives a better read:
cs == c sharp db == c flat
You can of course use typical functional transformation of pitch as well.
For example sharpen
and flatten
are the ordinary (prefix) versions of
sharp
and flat
sharpen c == c sharp == cs flatten d == d flat == ds (sharpen . sharpen) c == c doubleSharp == css (flatten . flatten) d == d doubleFlat == dss
Note that there is no guarantee that your pitch representation use
enharmonic equivalence, so cs == db
may or may not hold.
c .+^ minor third == eb f .-. c == perfect fourth
Pitches are described by name, accidental and octave number.
c == fromIntegral 0 _P4 == perfect fourth == interval Perfect 5 d5 == diminished fifth == diminish (perfect fifth)
pitch :: Name -> Accidental -> PitchSource
Creates a pitch from name accidental.
accidental :: Pitch -> AccidentalSource