Copyright | (c) Dima Szamozvancev |
---|---|
License | MIT |
Maintainer | ds709@cam.ac.uk |
Stability | experimental |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell2010 |
Types and type functions modelling principles of functional harmony.
- data Quality
- data DegreeC d q k i o where
- type TimeSignature = Nat
- data TimeSig t = TimeSig
- type family KeyToQual (k :: KeyType) where ...
- type family KeyToOtherQual (k :: KeyType) where ...
- class IsMajor k s
- class IsMinor k s
- data ProgType k l where
- data Phrase k l where
- data Cadence k l where
- AuthCad :: DegreeC V MajQ k Inv1 (OctPred o) -> DegreeC I q k Inv0 o -> Cadence k 2
- AuthCad7 :: DegreeC V DomQ k Inv2 (OctPred o) -> DegreeC I q k Inv0 o -> Cadence k 2
- AuthCadVii :: DegreeC VII DimQ k Inv1 (OctPred o) -> DegreeC I q k Inv0 o -> Cadence k 2
- AuthCad64 :: DegreeC I q k Inv2 o -> DegreeC V DomQ k Inv3 (OctPred o) -> DegreeC I q k Inv1 o -> Cadence k 3
- DeceptCad :: DegreeC V DomQ k Inv2 o -> DegreeC VI q k Inv1 o -> Cadence k 2
- FullCad :: Subdominant k l1 -> Cadence k (l - l1) -> Cadence k l
- NoCad :: Cadence k 0
- data Tonic k l where
- data Dominant k l where
- DomVM :: DegreeC V MajQ k Inv2 o -> Dominant k 1
- DomV7 :: DegreeC V DomQ k Inv2 o -> Dominant k 1
- DomVii0 :: DegreeC VII DimQ k i o -> Dominant k 1
- DomSecD :: DegreeC II DomQ k Inv0 o -> DegreeC V DomQ k Inv2 (OctPred o) -> Dominant k 2
- DomSD :: Subdominant k l1 -> Dominant k (l - l1) -> Dominant k l
- DomDD :: Dominant k l1 -> Dominant k (l - l1) -> Dominant k l
- data Subdominant k l where
- SubIV :: DegreeC IV (KeyToQual k) k i o -> Subdominant k 1
- SubIIm :: DegreeC II MinQ k i o -> Subdominant k 1
- SubIIImIVM :: DegreeC III MinQ k i1 o -> DegreeC IV MajQ k i2 (OctPred o) -> Subdominant k 2
- SubSS :: Subdominant k l1 -> Subdominant k (l - l1) -> Subdominant k l
- type family ChordsToPartiture (v :: Vector (ChordType n) l) (t :: TimeSignature) :: Partiture n ((l * t) * 8) where ...
- type family ProgTypeToChords (l :: Nat) (p :: ProgType k l) :: Vector (ChordType 4) l where ...
- type family FromProg (p :: ProgType k l) (t :: TimeSignature) :: Partiture 4 ((l * t) * 8) where ...
- data Prog p = Prog
- data Ton t = Ton
- data Dom d = Dom
- data Sub s = Sub
- data Cad c = Cad
- data Phr p = Phr
Types and operations
data DegreeC d q k i o where Source #
A scale degree chord in given key, on the given scale, with the given quality and octave.
((~) (ChordType 4) ch1 (DegToChord II DomQ k Inv0 o d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord V DomQ k Inv2 (NatToOct ((-) (OctToNat o) 1)) d2), IntListRep (ChordType 4) ch2) => Primitive (Dominant k 2) (DomSecD k o d1 d2) Source # | |
((~) (ChordType 4) ch1 (DegToChord VII DimQ k Inv1 (NatToOct ((-) (OctToNat o) 1)) d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord I q k Inv0 o d2), IntListRep (ChordType 4) ch2) => Primitive (Cadence k 2) (AuthCadVii k o q d1 d2) Source # | |
((~) (ChordType 4) ch1 (DegToChord V DomQ k Inv2 (NatToOct ((-) (OctToNat o) 1)) d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord I q k Inv0 o d2), IntListRep (ChordType 4) ch2) => Primitive (Cadence k 2) (AuthCad7 k o q d1 d2) Source # | |
((~) (ChordType 4) ch1 (DegToChord V MajQ k Inv1 (NatToOct ((-) (OctToNat o) 1)) d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord I q k Inv0 o d2), IntListRep (ChordType 4) ch2) => Primitive (Cadence k 2) (AuthCad k o q d1 d2) Source # | |
((~) (ChordType 4) ch1 (DegToChord III MinQ k i1 o d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord IV MajQ k i2 (NatToOct ((-) (OctToNat o) 1)) d2), IntListRep (ChordType 4) ch2) => Primitive (Subdominant k 2) (SubIIImIVM k i1 o i2 d1 d2) Source # | |
((~) (ChordType 4) ch1 (DegToChord I q k Inv2 o d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord V DomQ k Inv3 (NatToOct ((-) (OctToNat o) 1)) d2), IntListRep (ChordType 4) ch2, (~) (ChordType 4) ch3 (DegToChord I q k Inv1 o d3), IntListRep (ChordType 4) ch3) => Primitive (Cadence k 3) (AuthCad64 k q o d1 d2 d3) Source # | |
type Rep (Dominant k 2) (DomSecD k o d1 d2) Source # | |
type Rep (Cadence k 2) (AuthCadVii k o q d1 d2) Source # | |
type Rep (Cadence k 2) (AuthCad7 k o q d1 d2) Source # | |
type Rep (Cadence k 2) (AuthCad k o q d1 d2) Source # | |
type Rep (Subdominant k 2) (SubIIImIVM k i1 o i2 d1 d2) Source # | |
type Rep (Cadence k 3) (AuthCad64 k q o d1 d2 d3) Source # | |
type TimeSignature = Nat Source #
The number of beats in a bar.
type family KeyToQual (k :: KeyType) where ... Source #
Convert the key mode to the corresponding chord quality (i.e., major mode into a major chord).
type family KeyToOtherQual (k :: KeyType) where ... Source #
Convert the key mode to the opposite chord quality (i.e., major mode into a minor chord).
KeyToOtherQual (Key _ _ MajorMode) = MinQ | |
KeyToOtherQual (Key _ _ MinorMode) = MajQ |
Enforce that the key is in major mode.
Enforce that the key is in minor mode.
Functional harmony
Types and constructors
data ProgType k l where Source #
A functionally described piece of music, built from multiple phrases.
CadPhrase :: Cadence k l -> ProgType k l | A cadential phrase, ending the progression. |
(:=) :: Phrase k l -> ProgType k (n - l) -> ProgType k n infix 5 | Add a new phrase to the beginning of the progression. |
IntLListRep (Cadence k l) c => Primitive (ProgType k l) (CadPhrase k l c) Source # | |
(IntLListRep (Phrase k l) ph, IntLListRep (ProgType k ((-) n l)) pr) => Primitive (ProgType k n) ((:=) k n l ph pr) Source # | |
type Rep (ProgType k l) (CadPhrase k l c) Source # | |
type Rep (ProgType k n) ((:=) k n l ph pr) Source # | |
data Phrase k l where Source #
A phrase matching a specific functional progression.
PhraseIVI :: Tonic k (l2 - l1) -> Dominant k l1 -> Tonic k (l - l2) -> Phrase k l | A tonic-dominant-tonic phrase. |
PhraseVI :: Dominant k l1 -> Tonic k (l - l1) -> Phrase k l | A dominant-tonic phrase. |
PhraseI :: Tonic k l -> Phrase k l | A tonic phrase. |
IntLListRep (Tonic k l) t => Primitive (Phrase k l) (PhraseI k l t) Source # | |
(IntLListRep (Dominant k l1) d, IntLListRep (Tonic k ((-) l l1)) t) => Primitive (Phrase k l) (PhraseVI k l l1 d t) Source # | |
(IntLListRep (Tonic k ((-) l2 l1)) t1, IntLListRep (Dominant k l1) d, IntLListRep (Tonic k ((-) l l2)) t2) => Primitive (Phrase k l) (PhraseIVI k l l2 l1 t1 d t2) Source # | |
type Rep (Phrase k l) (PhraseI k l t) Source # | |
type Rep (Phrase k l) (PhraseVI k l l1 d t) Source # | |
type Rep (Phrase k l) (PhraseIVI k l l2 l1 t1 d t2) Source # | |
data Cadence k l where Source #
A cadence in a specific key with a specific length.
AuthCad :: DegreeC V MajQ k Inv1 (OctPred o) -> DegreeC I q k Inv0 o -> Cadence k 2 | Authentic cadence with major fifth chord. |
AuthCad7 :: DegreeC V DomQ k Inv2 (OctPred o) -> DegreeC I q k Inv0 o -> Cadence k 2 | Authentic cadence with dominant seventh fifth chord. |
AuthCadVii :: DegreeC VII DimQ k Inv1 (OctPred o) -> DegreeC I q k Inv0 o -> Cadence k 2 | Authentic cadence with diminished seventh chord. |
AuthCad64 :: DegreeC I q k Inv2 o -> DegreeC V DomQ k Inv3 (OctPred o) -> DegreeC I q k Inv1 o -> Cadence k 3 | Authentic cadence with a cadential 6-4 chord |
DeceptCad :: DegreeC V DomQ k Inv2 o -> DegreeC VI q k Inv1 o -> Cadence k 2 | Deceptive cadence from a dominant fifth to a sixth. |
FullCad :: Subdominant k l1 -> Cadence k (l - l1) -> Cadence k l | Full cadence from subdominant to dominant to tonic. |
NoCad :: Cadence k 0 | No cadence. |
Primitive (Cadence k 0) (NoCad k) Source # | |
(IntLListRep (Subdominant k sdur) sd, IntLListRep (Cadence k ((-) l sdur)) c) => Primitive (Cadence k l) (FullCad k l sdur sd c) Source # | |
((~) (ChordType 4) ch1 (DegToChord V DomQ k Inv2 o d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord VI q k Inv1 o d2), IntListRep (ChordType 4) ch2) => Primitive (Cadence k 2) (DeceptCad k o q d1 d2) Source # | |
((~) (ChordType 4) ch1 (DegToChord VII DimQ k Inv1 (NatToOct ((-) (OctToNat o) 1)) d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord I q k Inv0 o d2), IntListRep (ChordType 4) ch2) => Primitive (Cadence k 2) (AuthCadVii k o q d1 d2) Source # | |
((~) (ChordType 4) ch1 (DegToChord V DomQ k Inv2 (NatToOct ((-) (OctToNat o) 1)) d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord I q k Inv0 o d2), IntListRep (ChordType 4) ch2) => Primitive (Cadence k 2) (AuthCad7 k o q d1 d2) Source # | |
((~) (ChordType 4) ch1 (DegToChord V MajQ k Inv1 (NatToOct ((-) (OctToNat o) 1)) d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord I q k Inv0 o d2), IntListRep (ChordType 4) ch2) => Primitive (Cadence k 2) (AuthCad k o q d1 d2) Source # | |
((~) (ChordType 4) ch1 (DegToChord I q k Inv2 o d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord V DomQ k Inv3 (NatToOct ((-) (OctToNat o) 1)) d2), IntListRep (ChordType 4) ch2, (~) (ChordType 4) ch3 (DegToChord I q k Inv1 o d3), IntListRep (ChordType 4) ch3) => Primitive (Cadence k 3) (AuthCad64 k q o d1 d2 d3) Source # | |
type Rep (Cadence k 0) (NoCad k) Source # | |
type Rep (Cadence k l) (FullCad k l sdur sd c) Source # | |
type Rep (Cadence k 2) (DeceptCad k o q d1 d2) Source # | |
type Rep (Cadence k 2) (AuthCadVii k o q d1 d2) Source # | |
type Rep (Cadence k 2) (AuthCad7 k o q d1 d2) Source # | |
type Rep (Cadence k 2) (AuthCad k o q d1 d2) Source # | |
type Rep (Cadence k 3) (AuthCad64 k q o d1 d2 d3) Source # | |
A tonic chord.
TonT :: DegreeC I (KeyToQual k) k Inv0 o -> Tonic k 1 | A major tonic chord. |
TonTT :: Tonic k l1 -> Tonic k (l - l1) -> Tonic k l | Doubled tonics. |
((~) (ChordType 4) ch (DegToChord I (KeyToQual k) k Inv0 o d), IntListRep (ChordType 4) ch) => Primitive (Tonic k 1) (TonT k o d) Source # | |
(IntLListRep (Tonic k dur1) t1, IntLListRep (Tonic k ((-) l dur1)) t2) => Primitive (Tonic k l) (TonTT k l dur1 t1 t2) Source # | |
type Rep (Tonic k 1) (TonT k o d) Source # | |
type Rep (Tonic k l) (TonTT k l dur1 t1 t2) Source # | |
data Dominant k l where Source #
A dominant chord progression.
DomVM :: DegreeC V MajQ k Inv2 o -> Dominant k 1 | Major fifth dominant. |
DomV7 :: DegreeC V DomQ k Inv2 o -> Dominant k 1 | Seventh chord fifth degree dominant. |
DomVii0 :: DegreeC VII DimQ k i o -> Dominant k 1 | Diminished seventh degree dominant. |
DomSecD :: DegreeC II DomQ k Inv0 o -> DegreeC V DomQ k Inv2 (OctPred o) -> Dominant k 2 | Secondary dominant followed by dominant. |
DomSD :: Subdominant k l1 -> Dominant k (l - l1) -> Dominant k l | Subdominant followed by dominant. |
DomDD :: Dominant k l1 -> Dominant k (l - l1) -> Dominant k l | Doubled dominants. |
((~) (ChordType 4) ch (DegToChord V DomQ k Inv2 o d), IntListRep (ChordType 4) ch) => Primitive (Dominant k 1) (DomV7 k o d) Source # | |
((~) (ChordType 4) ch (DegToChord V MajQ k Inv2 o d), IntListRep (ChordType 4) ch) => Primitive (Dominant k 1) (DomVM k o d) Source # | |
((~) (ChordType 4) ch1 (DegToChord II DomQ k Inv0 o d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord V DomQ k Inv2 (NatToOct ((-) (OctToNat o) 1)) d2), IntListRep (ChordType 4) ch2) => Primitive (Dominant k 2) (DomSecD k o d1 d2) Source # | |
((~) (ChordType 4) ch (DegToChord VII DimQ k i o d), IntListRep (ChordType 4) ch) => Primitive (Dominant k 1) (DomVii0 k i o d) Source # | |
(IntLListRep (Dominant k dur1) d1, IntLListRep (Dominant k ((-) l dur1)) d2) => Primitive (Dominant k l) (DomDD k l dur1 d1 d2) Source # | |
(IntLListRep (Subdominant k sdur) sd, IntLListRep (Dominant k ((-) l sdur)) d) => Primitive (Dominant k l) (DomSD k l sdur sd d) Source # | |
type Rep (Dominant k 1) (DomV7 k o d) Source # | |
type Rep (Dominant k 1) (DomVM k o d) Source # | |
type Rep (Dominant k 2) (DomSecD k o d1 d2) Source # | |
type Rep (Dominant k 1) (DomVii0 k i o d) Source # | |
type Rep (Dominant k l) (DomDD k l dur1 d1 d2) Source # | |
type Rep (Dominant k l) (DomSD k l sdur sd d) Source # | |
data Subdominant k l where Source #
A subdominant chord progression.
SubIV :: DegreeC IV (KeyToQual k) k i o -> Subdominant k 1 | Major fourth subdominant. |
SubIIm :: DegreeC II MinQ k i o -> Subdominant k 1 | Minor second subdominant. |
SubIIImIVM :: DegreeC III MinQ k i1 o -> DegreeC IV MajQ k i2 (OctPred o) -> Subdominant k 2 | Minor third followed by major fourth subdominant. |
SubSS :: Subdominant k l1 -> Subdominant k (l - l1) -> Subdominant k l | Doubled subdominants. |
((~) (ChordType 4) ch (DegToChord IV (KeyToQual k) k i o d), IntListRep (ChordType 4) ch) => Primitive (Subdominant k 1) (SubIV k i o d) Source # | |
((~) (ChordType 4) ch (DegToChord II MinQ k i o d), IntListRep (ChordType 4) ch) => Primitive (Subdominant k 1) (SubIIm k i o d) Source # | |
(IntLListRep (Subdominant k dur1) s1, IntLListRep (Subdominant k ((-) l dur1)) s2) => Primitive (Subdominant k l) (SubSS k l dur1 s1 s2) Source # | |
((~) (ChordType 4) ch1 (DegToChord III MinQ k i1 o d1), IntListRep (ChordType 4) ch1, (~) (ChordType 4) ch2 (DegToChord IV MajQ k i2 (NatToOct ((-) (OctToNat o) 1)) d2), IntListRep (ChordType 4) ch2) => Primitive (Subdominant k 2) (SubIIImIVM k i1 o i2 d1 d2) Source # | |
type Rep (Subdominant k 1) (SubIV k i o d) Source # | |
type Rep (Subdominant k 1) (SubIIm k i o d) Source # | |
type Rep (Subdominant k l) (SubSS k l dur1 s1 s2) Source # | |
type Rep (Subdominant k 2) (SubIIImIVM k i1 o i2 d1 d2) Source # | |
type family ChordsToPartiture (v :: Vector (ChordType n) l) (t :: TimeSignature) :: Partiture n ((l * t) * 8) where ... Source #
Convert a vector of chords ("chord progression") into a Partiture
.
type family ProgTypeToChords (l :: Nat) (p :: ProgType k l) :: Vector (ChordType 4) l where ... Source #
Convert a piece to chords.
ProgTypeToChords l (CadPhrase (c :: Cadence k l)) = CadToChords l c | |
ProgTypeToChords l ((p :: Phrase k l1) := ps) = PhraseToChords l1 p ++. ProgTypeToChords (l - l1) ps |
type family FromProg (p :: ProgType k l) (t :: TimeSignature) :: Partiture 4 ((l * t) * 8) where ... Source #
Convert a progression with a time signature into a Partiture
.
FromProg (p :: ProgType k l) t = ChordsToPartiture (ProgTypeToChords l p) t |