{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE InstanceSigs #-}
module Harmonic.Rules.Types.Harmony
(
Functionality
, toFunctionality
, toFunctionalityChord
, Chord(..)
, Cadence(..)
, Movement(..)
, toMovement
, fromMovement
, EnharmonicSpelling(..)
, EnharmonicPreference(..)
, enharmonicPreference
, selectEnharm
, defaultEnharm
, spellingToPreference
, enharmonicFunc
, inferSpelling
, noteNameImpliesSpelling
, isAmbiguousPattern
, ChordState(..)
, CadenceState(..)
, toTriad
, flatTriad
, sharpTriad
, toChord
, flatChord
, sharpChord
, toCadence
, fromChordState
, fromCadenceState
, initCadenceState
, mkCadenceStatePCs
, walkTriadCadence
, walkTriadState
, ToTriadTrace(..)
, fromCadenceStateTraced
, constructCadence
, corpusFunctionality
, deconstructCadence
, rootNote
, inversions
, isInversion
, normalForm
, primeForm
, zeroFormPC
) where
import GHC.Generics (Generic)
import Data.Function (on)
import Data.List (sort, sortBy)
import qualified Data.List as List
import Data.Maybe (fromMaybe, listToMaybe)
import Control.Applicative ((<|>))
import qualified Data.IntMap.Strict as IM
import qualified Data.IntSet as IS
import Harmonic.Rules.Types.Pitch
data EnharmonicSpelling = SharpSpelling | FlatSpelling
deriving (EnharmonicSpelling -> EnharmonicSpelling -> Bool
(EnharmonicSpelling -> EnharmonicSpelling -> Bool)
-> (EnharmonicSpelling -> EnharmonicSpelling -> Bool)
-> Eq EnharmonicSpelling
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
== :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
$c/= :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
/= :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
Eq, Eq EnharmonicSpelling
Eq EnharmonicSpelling =>
(EnharmonicSpelling -> EnharmonicSpelling -> Ordering)
-> (EnharmonicSpelling -> EnharmonicSpelling -> Bool)
-> (EnharmonicSpelling -> EnharmonicSpelling -> Bool)
-> (EnharmonicSpelling -> EnharmonicSpelling -> Bool)
-> (EnharmonicSpelling -> EnharmonicSpelling -> Bool)
-> (EnharmonicSpelling -> EnharmonicSpelling -> EnharmonicSpelling)
-> (EnharmonicSpelling -> EnharmonicSpelling -> EnharmonicSpelling)
-> Ord EnharmonicSpelling
EnharmonicSpelling -> EnharmonicSpelling -> Bool
EnharmonicSpelling -> EnharmonicSpelling -> Ordering
EnharmonicSpelling -> EnharmonicSpelling -> EnharmonicSpelling
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: EnharmonicSpelling -> EnharmonicSpelling -> Ordering
compare :: EnharmonicSpelling -> EnharmonicSpelling -> Ordering
$c< :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
< :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
$c<= :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
<= :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
$c> :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
> :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
$c>= :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
>= :: EnharmonicSpelling -> EnharmonicSpelling -> Bool
$cmax :: EnharmonicSpelling -> EnharmonicSpelling -> EnharmonicSpelling
max :: EnharmonicSpelling -> EnharmonicSpelling -> EnharmonicSpelling
$cmin :: EnharmonicSpelling -> EnharmonicSpelling -> EnharmonicSpelling
min :: EnharmonicSpelling -> EnharmonicSpelling -> EnharmonicSpelling
Ord, Int -> EnharmonicSpelling -> ShowS
[EnharmonicSpelling] -> ShowS
EnharmonicSpelling -> String
(Int -> EnharmonicSpelling -> ShowS)
-> (EnharmonicSpelling -> String)
-> ([EnharmonicSpelling] -> ShowS)
-> Show EnharmonicSpelling
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EnharmonicSpelling -> ShowS
showsPrec :: Int -> EnharmonicSpelling -> ShowS
$cshow :: EnharmonicSpelling -> String
show :: EnharmonicSpelling -> String
$cshowList :: [EnharmonicSpelling] -> ShowS
showList :: [EnharmonicSpelling] -> ShowS
Show, ReadPrec [EnharmonicSpelling]
ReadPrec EnharmonicSpelling
Int -> ReadS EnharmonicSpelling
ReadS [EnharmonicSpelling]
(Int -> ReadS EnharmonicSpelling)
-> ReadS [EnharmonicSpelling]
-> ReadPrec EnharmonicSpelling
-> ReadPrec [EnharmonicSpelling]
-> Read EnharmonicSpelling
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS EnharmonicSpelling
readsPrec :: Int -> ReadS EnharmonicSpelling
$creadList :: ReadS [EnharmonicSpelling]
readList :: ReadS [EnharmonicSpelling]
$creadPrec :: ReadPrec EnharmonicSpelling
readPrec :: ReadPrec EnharmonicSpelling
$creadListPrec :: ReadPrec [EnharmonicSpelling]
readListPrec :: ReadPrec [EnharmonicSpelling]
Read, (forall x. EnharmonicSpelling -> Rep EnharmonicSpelling x)
-> (forall x. Rep EnharmonicSpelling x -> EnharmonicSpelling)
-> Generic EnharmonicSpelling
forall x. Rep EnharmonicSpelling x -> EnharmonicSpelling
forall x. EnharmonicSpelling -> Rep EnharmonicSpelling x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. EnharmonicSpelling -> Rep EnharmonicSpelling x
from :: forall x. EnharmonicSpelling -> Rep EnharmonicSpelling x
$cto :: forall x. Rep EnharmonicSpelling x -> EnharmonicSpelling
to :: forall x. Rep EnharmonicSpelling x -> EnharmonicSpelling
Generic)
data EnharmonicPreference = FlatPref | SharpPref | AmbiguousPref
deriving (EnharmonicPreference -> EnharmonicPreference -> Bool
(EnharmonicPreference -> EnharmonicPreference -> Bool)
-> (EnharmonicPreference -> EnharmonicPreference -> Bool)
-> Eq EnharmonicPreference
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EnharmonicPreference -> EnharmonicPreference -> Bool
== :: EnharmonicPreference -> EnharmonicPreference -> Bool
$c/= :: EnharmonicPreference -> EnharmonicPreference -> Bool
/= :: EnharmonicPreference -> EnharmonicPreference -> Bool
Eq, Int -> EnharmonicPreference -> ShowS
[EnharmonicPreference] -> ShowS
EnharmonicPreference -> String
(Int -> EnharmonicPreference -> ShowS)
-> (EnharmonicPreference -> String)
-> ([EnharmonicPreference] -> ShowS)
-> Show EnharmonicPreference
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EnharmonicPreference -> ShowS
showsPrec :: Int -> EnharmonicPreference -> ShowS
$cshow :: EnharmonicPreference -> String
show :: EnharmonicPreference -> String
$cshowList :: [EnharmonicPreference] -> ShowS
showList :: [EnharmonicPreference] -> ShowS
Show)
enharmonicPreference :: PitchClass -> EnharmonicPreference
enharmonicPreference :: PitchClass -> EnharmonicPreference
enharmonicPreference (P Int
0) = EnharmonicPreference
AmbiguousPref
enharmonicPreference (P Int
1) = EnharmonicPreference
FlatPref
enharmonicPreference (P Int
2) = EnharmonicPreference
SharpPref
enharmonicPreference (P Int
3) = EnharmonicPreference
FlatPref
enharmonicPreference (P Int
4) = EnharmonicPreference
SharpPref
enharmonicPreference (P Int
5) = EnharmonicPreference
FlatPref
enharmonicPreference (P Int
6) = EnharmonicPreference
SharpPref
enharmonicPreference (P Int
7) = EnharmonicPreference
SharpPref
enharmonicPreference (P Int
8) = EnharmonicPreference
FlatPref
enharmonicPreference (P Int
9) = EnharmonicPreference
SharpPref
enharmonicPreference (P Int
10) = EnharmonicPreference
FlatPref
enharmonicPreference (P Int
11) = EnharmonicPreference
SharpPref
enharmonicPreference PitchClass
_ = EnharmonicPreference
FlatPref
selectEnharm :: EnharmonicSpelling -> PitchClass -> PitchClass -> EnharmonicSpelling
selectEnharm :: EnharmonicSpelling
-> PitchClass -> PitchClass -> EnharmonicSpelling
selectEnharm EnharmonicSpelling
current PitchClass
prior PitchClass
posterior
| PitchClass
prior PitchClass -> PitchClass -> Bool
forall a. Eq a => a -> a -> Bool
== PitchClass
posterior = EnharmonicSpelling
current
selectEnharm EnharmonicSpelling
current PitchClass
prior PitchClass
posterior =
let priorPref :: EnharmonicPreference
priorPref = PitchClass -> EnharmonicPreference
enharmonicPreference PitchClass
prior
posteriorPref :: EnharmonicPreference
posteriorPref = PitchClass -> EnharmonicPreference
enharmonicPreference PitchClass
posterior
prior_actual_matches_posterior_pref :: Bool
prior_actual_matches_posterior_pref = case (EnharmonicSpelling
current, EnharmonicPreference
posteriorPref) of
(EnharmonicSpelling
FlatSpelling, EnharmonicPreference
FlatPref) -> Bool
True
(EnharmonicSpelling
SharpSpelling, EnharmonicPreference
SharpPref) -> Bool
True
(EnharmonicSpelling, EnharmonicPreference)
_ -> Bool
False
both_same_pref_differs_from_current :: Bool
both_same_pref_differs_from_current = case (EnharmonicPreference
priorPref, EnharmonicPreference
posteriorPref, EnharmonicSpelling
current) of
(EnharmonicPreference
FlatPref, EnharmonicPreference
FlatPref, EnharmonicSpelling
SharpSpelling) -> Bool
True
(EnharmonicPreference
SharpPref, EnharmonicPreference
SharpPref, EnharmonicSpelling
FlatSpelling) -> Bool
True
(EnharmonicPreference, EnharmonicPreference, EnharmonicSpelling)
_ -> Bool
False
in case (EnharmonicPreference
priorPref, EnharmonicPreference
posteriorPref) of
(EnharmonicPreference
AmbiguousPref, EnharmonicPreference
FlatPref) -> EnharmonicSpelling
FlatSpelling
(EnharmonicPreference
AmbiguousPref, EnharmonicPreference
SharpPref) -> EnharmonicSpelling
SharpSpelling
(EnharmonicPreference
FlatPref, EnharmonicPreference
AmbiguousPref) -> EnharmonicSpelling
current
(EnharmonicPreference
SharpPref, EnharmonicPreference
AmbiguousPref) -> EnharmonicSpelling
current
(EnharmonicPreference
AmbiguousPref, EnharmonicPreference
AmbiguousPref) -> EnharmonicSpelling
current
(EnharmonicPreference
FlatPref, EnharmonicPreference
FlatPref) ->
if Bool
prior_actual_matches_posterior_pref then EnharmonicSpelling
FlatSpelling
else if Bool
both_same_pref_differs_from_current then EnharmonicSpelling
FlatSpelling
else EnharmonicSpelling
current
(EnharmonicPreference
SharpPref, EnharmonicPreference
SharpPref) ->
if Bool
prior_actual_matches_posterior_pref then EnharmonicSpelling
SharpSpelling
else if Bool
both_same_pref_differs_from_current then EnharmonicSpelling
SharpSpelling
else EnharmonicSpelling
current
(EnharmonicPreference, EnharmonicPreference)
_ -> EnharmonicSpelling
current
defaultEnharm :: PitchClass -> EnharmonicSpelling
defaultEnharm :: PitchClass -> EnharmonicSpelling
defaultEnharm (P Int
0) = EnharmonicSpelling
FlatSpelling
defaultEnharm PitchClass
pc = case PitchClass -> EnharmonicPreference
enharmonicPreference PitchClass
pc of
EnharmonicPreference
FlatPref -> EnharmonicSpelling
FlatSpelling
EnharmonicPreference
SharpPref -> EnharmonicSpelling
SharpSpelling
EnharmonicPreference
AmbiguousPref -> EnharmonicSpelling
FlatSpelling
spellingToPreference :: EnharmonicSpelling -> EnharmonicPreference
spellingToPreference :: EnharmonicSpelling -> EnharmonicPreference
spellingToPreference EnharmonicSpelling
FlatSpelling = EnharmonicPreference
FlatPref
spellingToPreference EnharmonicSpelling
SharpSpelling = EnharmonicPreference
SharpPref
enharmonicFunc :: EnharmonicSpelling -> (PitchClass -> NoteName)
enharmonicFunc :: EnharmonicSpelling -> PitchClass -> NoteName
enharmonicFunc EnharmonicSpelling
SharpSpelling = PitchClass -> NoteName
sharp
enharmonicFunc EnharmonicSpelling
FlatSpelling = PitchClass -> NoteName
flat
inferSpelling :: [Int] -> EnharmonicSpelling
inferSpelling :: [Int] -> EnharmonicSpelling
inferSpelling [] = EnharmonicSpelling
FlatSpelling
inferSpelling [Int]
pcs =
let bassNorm :: Int
bassNorm = [Int] -> Int
forall a. HasCallStack => [a] -> a
head [Int]
pcs Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12
restSet :: IntSet
restSet = [Int] -> IntSet
IS.fromList ((Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) ([Int] -> [Int]
forall a. HasCallStack => [a] -> [a]
tail [Int]
pcs))
tryTable :: IntMap [(IntSet, a)] -> Maybe a
tryTable IntMap [(IntSet, a)]
table = case Int -> IntMap [(IntSet, a)] -> Maybe [(IntSet, a)]
forall a. Int -> IntMap a -> Maybe a
IM.lookup Int
bassNorm IntMap [(IntSet, a)]
table of
Maybe [(IntSet, a)]
Nothing -> Maybe a
forall a. Maybe a
Nothing
Just [(IntSet, a)]
entries ->
[a] -> Maybe a
forall a. [a] -> Maybe a
listToMaybe [a
s | (IntSet
upperSet, a
s) <- [(IntSet, a)]
entries, IntSet
upperSet IntSet -> IntSet -> Bool
`IS.isSubsetOf` IntSet
restSet]
in EnharmonicSpelling
-> Maybe EnharmonicSpelling -> EnharmonicSpelling
forall a. a -> Maybe a -> a
fromMaybe (PitchClass -> EnharmonicSpelling
defaultEnharm (Int -> PitchClass
mkPitchClass Int
bassNorm))
(IntMap [(IntSet, EnharmonicSpelling)] -> Maybe EnharmonicSpelling
forall {a}. IntMap [(IntSet, a)] -> Maybe a
tryTable IntMap [(IntSet, EnharmonicSpelling)]
layer1Table Maybe EnharmonicSpelling
-> Maybe EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> IntMap [(IntSet, EnharmonicSpelling)] -> Maybe EnharmonicSpelling
forall {a}. IntMap [(IntSet, a)] -> Maybe a
tryTable IntMap [(IntSet, EnharmonicSpelling)]
layer2Table)
layer1Table :: IM.IntMap [(IS.IntSet, EnharmonicSpelling)]
layer1Table :: IntMap [(IntSet, EnharmonicSpelling)]
layer1Table = ([(IntSet, EnharmonicSpelling)]
-> [(IntSet, EnharmonicSpelling)]
-> [(IntSet, EnharmonicSpelling)])
-> [(Int, [(IntSet, EnharmonicSpelling)])]
-> IntMap [(IntSet, EnharmonicSpelling)]
forall a. (a -> a -> a) -> [(Int, a)] -> IntMap a
IM.fromListWith [(IntSet, EnharmonicSpelling)]
-> [(IntSet, EnharmonicSpelling)] -> [(IntSet, EnharmonicSpelling)]
forall a. [a] -> [a] -> [a]
(++) ([(Int, [(IntSet, EnharmonicSpelling)])]
-> IntMap [(IntSet, EnharmonicSpelling)])
-> [(Int, [(IntSet, EnharmonicSpelling)])]
-> IntMap [(IntSet, EnharmonicSpelling)]
forall a b. (a -> b) -> a -> b
$ ((Int, [Int], EnharmonicSpelling)
-> [(Int, [(IntSet, EnharmonicSpelling)])])
-> [(Int, [Int], EnharmonicSpelling)]
-> [(Int, [(IntSet, EnharmonicSpelling)])]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Int, [Int], EnharmonicSpelling)
-> [(Int, [(IntSet, EnharmonicSpelling)])]
forall {a} {b}. (a, [Int], b) -> [(a, [(IntSet, b)])]
expandRoot
[ Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
4, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
5, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
6, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
7, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
8, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
9, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
10, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
11, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
0, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
1, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
2, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
3, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
7, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
8, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
9, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
10, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
11, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
0, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
1, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
2, Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
3, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
4, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
5, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
6, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
0, Int
4] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
1, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
2, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
3, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
4, Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
5, Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
6, Int
10] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
7, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
8, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
9, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
10, Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
11, Int
3] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
3, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
4, Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
5, Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
6, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
7, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
8, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
9, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
10, Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
11, Int
3] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
0, Int
4] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
1, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
2, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
7, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
8, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
9, Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
10, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
11, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
0, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
1, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
2, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
3, Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
4, Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
5, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
6, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
0, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
1, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
2, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
3, Int
6] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
4, Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
5, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
6, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
7, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
8, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
9, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
10, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
11, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
5, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
6, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
7, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
8, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
9, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
10, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
11, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
0, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
1, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
2, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
3, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
4, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
7, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
8, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
9, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
10, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
11, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
0, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
1, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
2, Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
3, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
4, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
5, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
6, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
0, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
1, Int
6] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
2, Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
3, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
4, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
5, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
6, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
7, Int
0] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
8, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
9, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
10, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
11, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
3, Int
6] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
4, Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
5, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
6, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
7, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
8, Int
11] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
9, Int
0] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
10, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
11, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
0, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
1, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
2, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
4, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
5, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
6, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
7, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
8, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
9, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
10, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
11, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
0, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
1, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
2, Int
6] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
3, Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
4, Int
11] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
5, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
6, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
7, Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
8, Int
3] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
9, Int
4] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
10, Int
5] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
11, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
0, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
1, Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
2, Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
3, Int
10] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
11, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
0, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
1, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
2, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
3, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
4, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
5, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
6, Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
7, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
8, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
9, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
10, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
0, Int
4] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
1, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
2, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
3, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
4, Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
5, Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
6, Int
10] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
7, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
8, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
9, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
10, Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
11, Int
3] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
7, Int
11] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
8, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
9, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
10, Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
11, Int
3] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
0, Int
4] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
1, Int
5] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
2, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
3, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
4, Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
5, Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
6, Int
10] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
11, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
0, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
1, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
2, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
3, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
4, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
5, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
6, Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
7, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
8, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
9, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
10, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
0, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
1, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
2, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
3, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
4, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
5, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
6, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
7, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
8, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
9, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
10, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
11, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
3, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
4, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
5, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
6, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
7, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
8, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
9, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
10, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
11, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
0, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
1, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
2, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
10, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
11, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
0, Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
1, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
2, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
3, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
4, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
5, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
6, Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
7, Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
8, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
9, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
0, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
1, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
2, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
3, Int
6] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
4, Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
5, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
6, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
7, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
8, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
9, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
10, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
11, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
7, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
8, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
9, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
10, Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
11, Int
2] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
0, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
1, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
2, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
3, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
4, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
5, Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
6, Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
10, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
11, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
0, Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
1, Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
2, Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
3, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
4, Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
5, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
6, Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
7, Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
8, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
9, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
0, Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
1, Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
2, Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
3, Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
4, Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
5, Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
6, Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
7, Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
8, Int
3] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
9, Int
4] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
10, Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
11, Int
6] EnharmonicSpelling
SharpSpelling
]
where
rootEntry :: a -> b -> c -> (a, b, c)
rootEntry a
bass b
upper c
s = (a
bass, b
upper, c
s)
expandRoot :: (a, [Int], b) -> [(a, [(IntSet, b)])]
expandRoot (a
bass, [Int]
upper, b
s) = [(a
bass, [([Int] -> IntSet
IS.fromList [Int]
upper, b
s)])]
layer2Table :: IM.IntMap [(IS.IntSet, EnharmonicSpelling)]
layer2Table :: IntMap [(IntSet, EnharmonicSpelling)]
layer2Table = ([(IntSet, EnharmonicSpelling)]
-> [(IntSet, EnharmonicSpelling)]
-> [(IntSet, EnharmonicSpelling)])
-> [(Int, [(IntSet, EnharmonicSpelling)])]
-> IntMap [(IntSet, EnharmonicSpelling)]
forall a. (a -> a -> a) -> [(Int, a)] -> IntMap a
IM.fromListWith [(IntSet, EnharmonicSpelling)]
-> [(IntSet, EnharmonicSpelling)] -> [(IntSet, EnharmonicSpelling)]
forall a. [a] -> [a] -> [a]
(++) ([(Int, [(IntSet, EnharmonicSpelling)])]
-> IntMap [(IntSet, EnharmonicSpelling)])
-> [(Int, [(IntSet, EnharmonicSpelling)])]
-> IntMap [(IntSet, EnharmonicSpelling)]
forall a b. (a -> b) -> a -> b
$ ((Int, [Int], EnharmonicSpelling)
-> [(Int, [(IntSet, EnharmonicSpelling)])])
-> [(Int, [Int], EnharmonicSpelling)]
-> [(Int, [(IntSet, EnharmonicSpelling)])]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Int, [Int], EnharmonicSpelling)
-> [(Int, [(IntSet, EnharmonicSpelling)])]
forall {a} {b}. (a, [Int], b) -> [(a, [(IntSet, b)])]
expandRoot
[ Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
4] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
6] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
7] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
8] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
9] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
10] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
1] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
2] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
3] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
0 [Int
3] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
1 [Int
4] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
2 [Int
5] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
3 [Int
6] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
4 [Int
7] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
5 [Int
8] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
6 [Int
9] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
7 [Int
10] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
8 [Int
11] EnharmonicSpelling
SharpSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
9 [Int
0] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
10 [Int
1] EnharmonicSpelling
FlatSpelling
, Int
-> [Int] -> EnharmonicSpelling -> (Int, [Int], EnharmonicSpelling)
forall {a} {b} {c}. a -> b -> c -> (a, b, c)
rootEntry Int
11 [Int
2] EnharmonicSpelling
SharpSpelling
]
where
rootEntry :: a -> b -> c -> (a, b, c)
rootEntry a
bass b
upper c
s = (a
bass, b
upper, c
s)
expandRoot :: (a, [Int], b) -> [(a, [(IntSet, b)])]
expandRoot (a
bass, [Int]
upper, b
s) = [(a
bass, [([Int] -> IntSet
IS.fromList [Int]
upper, b
s)])]
noteNameImpliesSpelling :: NoteName -> Maybe EnharmonicSpelling
noteNameImpliesSpelling :: NoteName -> Maybe EnharmonicSpelling
noteNameImpliesSpelling NoteName
C' = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
SharpSpelling
noteNameImpliesSpelling NoteName
D' = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
SharpSpelling
noteNameImpliesSpelling NoteName
F' = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
SharpSpelling
noteNameImpliesSpelling NoteName
G' = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
SharpSpelling
noteNameImpliesSpelling NoteName
A' = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
SharpSpelling
noteNameImpliesSpelling NoteName
Db = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
FlatSpelling
noteNameImpliesSpelling NoteName
Eb = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
FlatSpelling
noteNameImpliesSpelling NoteName
Gb = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
FlatSpelling
noteNameImpliesSpelling NoteName
Ab = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
FlatSpelling
noteNameImpliesSpelling NoteName
Bb = EnharmonicSpelling -> Maybe EnharmonicSpelling
forall a. a -> Maybe a
Just EnharmonicSpelling
FlatSpelling
noteNameImpliesSpelling NoteName
_ = Maybe EnharmonicSpelling
forall a. Maybe a
Nothing
ambiguousPatterns :: IM.IntMap [IS.IntSet]
ambiguousPatterns :: IntMap [IntSet]
ambiguousPatterns = ([IntSet] -> [IntSet] -> [IntSet])
-> [(Int, [IntSet])] -> IntMap [IntSet]
forall a. (a -> a -> a) -> [(Int, a)] -> IntMap a
IM.fromListWith [IntSet] -> [IntSet] -> [IntSet]
forall a. [a] -> [a] -> [a]
(++)
[ (Int
bass Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12, [[Int] -> IntSet
IS.fromList ((Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
uppers)])
| Int
root <- [Int
1, Int
2, Int
7, Int
8, Int
9]
, (Int
bass, [Int]
uppers) <- Int -> [(Int, [Int])]
forall {a}. Num a => a -> [(a, [a])]
min7o3Inversions Int
root
]
where
min7o3Inversions :: a -> [(a, [a])]
min7o3Inversions a
r =
[ (a
r, [a
ra -> a -> a
forall a. Num a => a -> a -> a
+a
7, a
ra -> a -> a
forall a. Num a => a -> a -> a
+a
10])
, (a
ra -> a -> a
forall a. Num a => a -> a -> a
+a
7, [a
ra -> a -> a
forall a. Num a => a -> a -> a
+a
10, a
r])
, (a
ra -> a -> a
forall a. Num a => a -> a -> a
+a
10, [a
r, a
ra -> a -> a
forall a. Num a => a -> a -> a
+a
7])
]
isAmbiguousPattern :: [Int] -> Bool
isAmbiguousPattern :: [Int] -> Bool
isAmbiguousPattern [] = Bool
False
isAmbiguousPattern [Int]
pcs =
let bassNorm :: Int
bassNorm = [Int] -> Int
forall a. HasCallStack => [a] -> a
head [Int]
pcs Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12
restSet :: IntSet
restSet = [Int] -> IntSet
IS.fromList ((Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) ([Int] -> [Int]
forall a. HasCallStack => [a] -> [a]
tail [Int]
pcs))
in case Int -> IntMap [IntSet] -> Maybe [IntSet]
forall a. Int -> IntMap a -> Maybe a
IM.lookup Int
bassNorm IntMap [IntSet]
ambiguousPatterns of
Maybe [IntSet]
Nothing -> Bool
False
Just [IntSet]
patterns -> (IntSet -> Bool) -> [IntSet] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (IntSet -> IntSet -> Bool
`IS.isSubsetOf` IntSet
restSet) [IntSet]
patterns
type Functionality = String
toFunctionality :: [PitchClass] -> Functionality
toFunctionality :: [PitchClass] -> String
toFunctionality [PitchClass]
ps = ([PitchClass] -> [PitchClass]) -> [PitchClass] -> ShowS
nameFuncTriad [PitchClass] -> [PitchClass]
forall {a}. a -> a
zeroFormFn [PitchClass]
ps String
""
where zeroFormFn :: a -> a
zeroFormFn = a -> a
forall {a}. a -> a
id
toFunctionalityChord :: [PitchClass] -> Functionality
toFunctionalityChord :: [PitchClass] -> String
toFunctionalityChord [PitchClass]
ps = ([PitchClass] -> [PitchClass]) -> [PitchClass] -> ShowS
nameFuncChord [PitchClass] -> [PitchClass]
forall {a}. a -> a
zeroFormFn [PitchClass]
ps String
""
where zeroFormFn :: a -> a
zeroFormFn = a -> a
forall {a}. a -> a
id
data Movement
= Asc PitchClass
| Desc PitchClass
| Unison
| Tritone
| Empty
deriving (Eq Movement
Eq Movement =>
(Movement -> Movement -> Ordering)
-> (Movement -> Movement -> Bool)
-> (Movement -> Movement -> Bool)
-> (Movement -> Movement -> Bool)
-> (Movement -> Movement -> Bool)
-> (Movement -> Movement -> Movement)
-> (Movement -> Movement -> Movement)
-> Ord Movement
Movement -> Movement -> Bool
Movement -> Movement -> Ordering
Movement -> Movement -> Movement
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Movement -> Movement -> Ordering
compare :: Movement -> Movement -> Ordering
$c< :: Movement -> Movement -> Bool
< :: Movement -> Movement -> Bool
$c<= :: Movement -> Movement -> Bool
<= :: Movement -> Movement -> Bool
$c> :: Movement -> Movement -> Bool
> :: Movement -> Movement -> Bool
$c>= :: Movement -> Movement -> Bool
>= :: Movement -> Movement -> Bool
$cmax :: Movement -> Movement -> Movement
max :: Movement -> Movement -> Movement
$cmin :: Movement -> Movement -> Movement
min :: Movement -> Movement -> Movement
Ord, Movement -> Movement -> Bool
(Movement -> Movement -> Bool)
-> (Movement -> Movement -> Bool) -> Eq Movement
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Movement -> Movement -> Bool
== :: Movement -> Movement -> Bool
$c/= :: Movement -> Movement -> Bool
/= :: Movement -> Movement -> Bool
Eq, (forall x. Movement -> Rep Movement x)
-> (forall x. Rep Movement x -> Movement) -> Generic Movement
forall x. Rep Movement x -> Movement
forall x. Movement -> Rep Movement x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Movement -> Rep Movement x
from :: forall x. Movement -> Rep Movement x
$cto :: forall x. Rep Movement x -> Movement
to :: forall x. Rep Movement x -> Movement
Generic)
instance Show Movement where
show :: Movement -> String
show :: Movement -> String
show (Asc PitchClass
n) = String
"asc " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (PitchClass -> Int
unPitchClass PitchClass
n)
show (Desc PitchClass
n) = String
"desc " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (PitchClass -> Int
unPitchClass PitchClass
n)
show Movement
Unison = String
"pedal"
show Movement
Tritone = String
"tritone"
show Movement
Empty = String
"empty"
instance Read Movement where
readsPrec :: Int -> ReadS Movement
readsPrec :: Int -> ReadS Movement
readsPrec Int
_ String
s
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"pedal" = [(Movement
Unison, String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"asc 1" = [(PitchClass -> Movement
Asc (Int -> PitchClass
P Int
1), String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"asc 2" = [(PitchClass -> Movement
Asc (Int -> PitchClass
P Int
2), String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"asc 3" = [(PitchClass -> Movement
Asc (Int -> PitchClass
P Int
3), String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"asc 4" = [(PitchClass -> Movement
Asc (Int -> PitchClass
P Int
4), String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"asc 5" = [(PitchClass -> Movement
Asc (Int -> PitchClass
P Int
5), String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"tritone" = [(Movement
Tritone, String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"desc 5" = [(PitchClass -> Movement
Desc (Int -> PitchClass
P Int
5), String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"desc 4" = [(PitchClass -> Movement
Desc (Int -> PitchClass
P Int
4), String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"desc 3" = [(PitchClass -> Movement
Desc (Int -> PitchClass
P Int
3), String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"desc 2" = [(PitchClass -> Movement
Desc (Int -> PitchClass
P Int
2), String
"")]
| String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"desc 1" = [(PitchClass -> Movement
Desc (Int -> PitchClass
P Int
1), String
"")]
| Bool
otherwise = [(Movement
Empty, String
"")]
toMovement :: PitchClass -> PitchClass -> Movement
toMovement :: PitchClass -> PitchClass -> Movement
toMovement PitchClass
from PitchClass
to
| Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
y = PitchClass -> Movement
Asc (Int -> PitchClass
P Int
x)
| Int
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
x = PitchClass -> Movement
Desc (Int -> PitchClass
P Int
y)
| Int
x Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 Bool -> Bool -> Bool
&& Int
y Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 = Movement
Unison
| Bool
otherwise = Movement
Tritone
where
x :: Int
x = [Int] -> Int
forall a. HasCallStack => [a] -> a
last ([Int] -> Int) -> [Int] -> Int
forall a b. (a -> b) -> a -> b
$ [Int] -> [Int]
forall {a}. Integral a => [a] -> [a]
zeroFormLegacy [PitchClass -> Int
unPitchClass PitchClass
from, PitchClass -> Int
unPitchClass PitchClass
to]
y :: Int
y = [Int] -> Int
forall a. HasCallStack => [a] -> a
last ([Int] -> Int) -> [Int] -> Int
forall a b. (a -> b) -> a -> b
$ [Int] -> [Int]
forall {a}. Integral a => [a] -> [a]
zeroFormLegacy [PitchClass -> Int
unPitchClass PitchClass
to, PitchClass -> Int
unPitchClass PitchClass
from]
zeroFormLegacy :: [a] -> [a]
zeroFormLegacy (a
h:[a]
hs) = [a] -> [a]
forall a. Ord a => [a] -> [a]
sort ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ (a -> a) -> [a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (\a
n -> (a
n a -> a -> a
forall a. Num a => a -> a -> a
- a
h) a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
12) (a
ha -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
hs)
zeroFormLegacy [] = []
fromMovement :: Movement -> PitchClass
fromMovement :: Movement -> PitchClass
fromMovement (Asc PitchClass
n) = PitchClass
n
fromMovement (Desc PitchClass
n) = Int -> PitchClass
P (Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
- PitchClass -> Int
unPitchClass PitchClass
n)
fromMovement Movement
Unison = Int -> PitchClass
P Int
0
fromMovement Movement
Tritone = Int -> PitchClass
P Int
6
fromMovement Movement
Empty = Int -> PitchClass
P Int
0
data Chord = Chord
{ Chord -> NoteName
chordNoteName :: NoteName
, Chord -> String
chordFunctionality :: Functionality
, Chord -> [Integer]
chordIntervals :: [Integer]
} deriving (Chord -> Chord -> Bool
(Chord -> Chord -> Bool) -> (Chord -> Chord -> Bool) -> Eq Chord
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Chord -> Chord -> Bool
== :: Chord -> Chord -> Bool
$c/= :: Chord -> Chord -> Bool
/= :: Chord -> Chord -> Bool
Eq, Eq Chord
Eq Chord =>
(Chord -> Chord -> Ordering)
-> (Chord -> Chord -> Bool)
-> (Chord -> Chord -> Bool)
-> (Chord -> Chord -> Bool)
-> (Chord -> Chord -> Bool)
-> (Chord -> Chord -> Chord)
-> (Chord -> Chord -> Chord)
-> Ord Chord
Chord -> Chord -> Bool
Chord -> Chord -> Ordering
Chord -> Chord -> Chord
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Chord -> Chord -> Ordering
compare :: Chord -> Chord -> Ordering
$c< :: Chord -> Chord -> Bool
< :: Chord -> Chord -> Bool
$c<= :: Chord -> Chord -> Bool
<= :: Chord -> Chord -> Bool
$c> :: Chord -> Chord -> Bool
> :: Chord -> Chord -> Bool
$c>= :: Chord -> Chord -> Bool
>= :: Chord -> Chord -> Bool
$cmax :: Chord -> Chord -> Chord
max :: Chord -> Chord -> Chord
$cmin :: Chord -> Chord -> Chord
min :: Chord -> Chord -> Chord
Ord, (forall x. Chord -> Rep Chord x)
-> (forall x. Rep Chord x -> Chord) -> Generic Chord
forall x. Rep Chord x -> Chord
forall x. Chord -> Rep Chord x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Chord -> Rep Chord x
from :: forall x. Chord -> Rep Chord x
$cto :: forall x. Rep Chord x -> Chord
to :: forall x. Rep Chord x -> Chord
Generic)
instance Show Chord where
show :: Chord -> String
show (Chord NoteName
noteName String
functionality [Integer]
_)
| String
functionality String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"N/A" = ShowS
forall a. Show a => a -> String
show String
"N/A"
| Bool
otherwise = NoteName -> String
forall a. Show a => a -> String
show NoteName
noteName String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"_" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
functionality
data Cadence = Cadence
{ Cadence -> String
cadenceFunctionality :: Functionality
, Cadence -> Movement
cadenceMovement :: Movement
, Cadence -> [PitchClass]
cadenceIntervals :: [PitchClass]
} deriving (Cadence -> Cadence -> Bool
(Cadence -> Cadence -> Bool)
-> (Cadence -> Cadence -> Bool) -> Eq Cadence
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Cadence -> Cadence -> Bool
== :: Cadence -> Cadence -> Bool
$c/= :: Cadence -> Cadence -> Bool
/= :: Cadence -> Cadence -> Bool
Eq, Eq Cadence
Eq Cadence =>
(Cadence -> Cadence -> Ordering)
-> (Cadence -> Cadence -> Bool)
-> (Cadence -> Cadence -> Bool)
-> (Cadence -> Cadence -> Bool)
-> (Cadence -> Cadence -> Bool)
-> (Cadence -> Cadence -> Cadence)
-> (Cadence -> Cadence -> Cadence)
-> Ord Cadence
Cadence -> Cadence -> Bool
Cadence -> Cadence -> Ordering
Cadence -> Cadence -> Cadence
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Cadence -> Cadence -> Ordering
compare :: Cadence -> Cadence -> Ordering
$c< :: Cadence -> Cadence -> Bool
< :: Cadence -> Cadence -> Bool
$c<= :: Cadence -> Cadence -> Bool
<= :: Cadence -> Cadence -> Bool
$c> :: Cadence -> Cadence -> Bool
> :: Cadence -> Cadence -> Bool
$c>= :: Cadence -> Cadence -> Bool
>= :: Cadence -> Cadence -> Bool
$cmax :: Cadence -> Cadence -> Cadence
max :: Cadence -> Cadence -> Cadence
$cmin :: Cadence -> Cadence -> Cadence
min :: Cadence -> Cadence -> Cadence
Ord, (forall x. Cadence -> Rep Cadence x)
-> (forall x. Rep Cadence x -> Cadence) -> Generic Cadence
forall x. Rep Cadence x -> Cadence
forall x. Cadence -> Rep Cadence x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Cadence -> Rep Cadence x
from :: forall x. Cadence -> Rep Cadence x
$cto :: forall x. Rep Cadence x -> Cadence
to :: forall x. Rep Cadence x -> Cadence
Generic)
instance Show Cadence where
show :: Cadence -> String
show (Cadence String
functionality Movement
mvmt [PitchClass]
_) =
String
"( " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Movement -> String
forall a. Show a => a -> String
show Movement
mvmt String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" -> " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
functionality String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" )"
data ChordState = ChordState
{ ChordState -> Chord
stateChord :: Chord
, ChordState -> NoteName
stateRoot :: NoteName
} deriving (ChordState -> ChordState -> Bool
(ChordState -> ChordState -> Bool)
-> (ChordState -> ChordState -> Bool) -> Eq ChordState
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ChordState -> ChordState -> Bool
== :: ChordState -> ChordState -> Bool
$c/= :: ChordState -> ChordState -> Bool
/= :: ChordState -> ChordState -> Bool
Eq, (forall x. ChordState -> Rep ChordState x)
-> (forall x. Rep ChordState x -> ChordState) -> Generic ChordState
forall x. Rep ChordState x -> ChordState
forall x. ChordState -> Rep ChordState x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ChordState -> Rep ChordState x
from :: forall x. ChordState -> Rep ChordState x
$cto :: forall x. Rep ChordState x -> ChordState
to :: forall x. Rep ChordState x -> ChordState
Generic)
instance Show ChordState where
show :: ChordState -> String
show (ChordState Chord
chord NoteName
root) = NoteName -> String
forall a. Show a => a -> String
show NoteName
root String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
": " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Chord -> String
forall a. Show a => a -> String
show Chord
chord
data CadenceState = CadenceState
{ CadenceState -> Cadence
stateCadence :: Cadence
, CadenceState -> NoteName
stateCadenceRoot :: NoteName
, CadenceState -> EnharmonicSpelling
stateSpelling :: EnharmonicSpelling
} deriving (CadenceState -> CadenceState -> Bool
(CadenceState -> CadenceState -> Bool)
-> (CadenceState -> CadenceState -> Bool) -> Eq CadenceState
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CadenceState -> CadenceState -> Bool
== :: CadenceState -> CadenceState -> Bool
$c/= :: CadenceState -> CadenceState -> Bool
/= :: CadenceState -> CadenceState -> Bool
Eq, (forall x. CadenceState -> Rep CadenceState x)
-> (forall x. Rep CadenceState x -> CadenceState)
-> Generic CadenceState
forall x. Rep CadenceState x -> CadenceState
forall x. CadenceState -> Rep CadenceState x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CadenceState -> Rep CadenceState x
from :: forall x. CadenceState -> Rep CadenceState x
$cto :: forall x. Rep CadenceState x -> CadenceState
to :: forall x. Rep CadenceState x -> CadenceState
Generic)
instance Show CadenceState where
show :: CadenceState -> String
show (CadenceState Cadence
cadence NoteName
root EnharmonicSpelling
_) =
String
"( " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Movement -> String
forall a. Show a => a -> String
show (Cadence -> Movement
cadenceMovement Cadence
cadence) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" -> " String -> ShowS
forall a. [a] -> [a] -> [a]
++
NoteName -> String
forall a. Show a => a -> String
show NoteName
root String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"_" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Cadence -> String
cadenceFunctionality Cadence
cadence String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" )"
nameFuncTriad :: ([PitchClass] -> [PitchClass]) -> [PitchClass] -> String -> String
nameFuncTriad :: ([PitchClass] -> [PitchClass]) -> [PitchClass] -> ShowS
nameFuncTriad [PitchClass] -> [PitchClass]
f [PitchClass]
xs =
let
zs :: [Int]
zs = Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int) -> (PitchClass -> Int) -> PitchClass -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PitchClass -> Int
unPitchClass (PitchClass -> Int) -> [PitchClass] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [PitchClass] -> [PitchClass]
f [PitchClass]
xs :: [Int]
chain :: [ShowS]
chain =
[if (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
4 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
3,Int
10,Int
11]) Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
8 [Int]
zs
then (String
"maj"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
3 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
4 [Int]
zs) Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
6 [Int]
zs
then (String
"min"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
9 [Int]
zs then (String
"6"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
10 [Int]
zs then (String
"7"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
11 [Int]
zs then (String
"maj7"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
7,Int
8] then (String
"b13"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
2 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
5 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
3,Int
4] Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
7 [Int]
zs
then (String
"sus2"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
5 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
2 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
3,Int
4] Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
7 [Int]
zs
then (String
"sus4"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
2,Int
5] then (String
"sus2/4"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
5 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
2 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
3,Int
4]
Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
7 [Int]
zs then (String
"sus2"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
2 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
5 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
3,Int
4]
Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
7 [Int]
zs then (String
"sus4"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
2,Int
3] Bool -> Bool -> Bool
|| (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
2,Int
4]
then (String
"add9"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
5,Int
3] Bool -> Bool -> Bool
|| (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
5,Int
4]
then (String
"add11"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
1 [Int]
zs then (String
"b9"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
3,Int
4] then (String
"#9"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
6 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
5 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
7,Int
8]
then (String
"#11"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if ((Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
6 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
7 [Int]
zs) Bool -> Bool -> Bool
|| (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
6 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
8 [Int]
zs))
Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
3 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
7,Int
8]
then (String
"b5"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if ((Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
8 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
7 [Int]
zs) Bool -> Bool -> Bool
|| (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
8,Int
9])
Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
4 [Int]
zs then (String
"#5"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
2,Int
3,Int
4,Int
5] then (String
"no3"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
6,Int
7,Int
8] then (String
"no5"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
3,Int
6] then (String
"dim"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
4,Int
8] then (String
"aug"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)]
in (ShowS -> ShowS -> ShowS) -> ShowS -> [ShowS] -> ShowS
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) ShowS
forall {a}. a -> a
id [ShowS]
chain
nameFuncChord :: ([PitchClass] -> [PitchClass]) -> [PitchClass] -> String -> String
nameFuncChord :: ([PitchClass] -> [PitchClass]) -> [PitchClass] -> ShowS
nameFuncChord [PitchClass] -> [PitchClass]
f [PitchClass]
xs =
let
zs :: [Int]
zs = Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int) -> (PitchClass -> Int) -> PitchClass -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PitchClass -> Int
unPitchClass (PitchClass -> Int) -> [PitchClass] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [PitchClass] -> [PitchClass]
f [PitchClass]
xs :: [Int]
chain :: [ShowS]
chain =
[(String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
0,Int
4,Int
7] Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
1,Int
2,Int
3,Int
5,Int
6,Int
8,Int
9,Int
10,Int
11]
then (String
"maj"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
3 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
4,Int
10] then (String
"m"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
3,Int
10] Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
4 [Int]
zs then (String
"m7"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
9 [Int]
zs then (String
"6"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
10 [Int]
zs Bool -> Bool -> Bool
&& (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
3 [Int]
zs Bool -> Bool -> Bool
|| (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
3,Int
4]) then (String
"7"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
11 [Int]
zs then (String
"maj7"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
2,Int
5] Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
3,Int
4] then (String
"sus2/4"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
5 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
2 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
3,Int
4]
then (String
"sus2"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
2 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
5 [Int]
zs Bool -> Bool -> Bool
&& (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
3,Int
4]
then (String
"sus4"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if ((Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
6 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
7 [Int]
zs) Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
5 [Int]
zs)
Bool -> Bool -> Bool
|| (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
5 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
6 [Int]
zs) then (String
"b5"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if ((Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
8 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
7 [Int]
zs) Bool -> Bool -> Bool
|| (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
8,Int
9]) then (String
"#5"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
2,Int
3,Int
5] Bool -> Bool -> Bool
|| (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
2,Int
4,Int
5]
then (String
"add9/11"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
5 [Int]
zs Bool -> Bool -> Bool
&& ((Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
2,Int
3] Bool -> Bool -> Bool
|| (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
2,Int
4])
then (String
"add9"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
2 [Int]
zs Bool -> Bool -> Bool
&& ((Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
5,Int
3] Bool -> Bool -> Bool
|| (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
5,Int
4])
then (String
"add11"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
6 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
5 [Int]
zs) Bool -> Bool -> Bool
&& (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
7 [Int]
zs Bool -> Bool -> Bool
&& Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Int
8 [Int]
zs) then (String
"#11"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
1 [Int]
zs then (String
"b9"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
3,Int
4] then (String
"#9"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
zs) [Int
7,Int
8] then (String
"b13"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
2,Int
3,Int
4,Int
5] then (String
"no3"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)
,if (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Int -> [Int] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Int]
zs) [Int
6,Int
7,Int
8] then (String
"no5"String -> ShowS
forall a. [a] -> [a] -> [a]
++) else (String
""String -> ShowS
forall a. [a] -> [a] -> [a]
++)]
in (ShowS -> ShowS -> ShowS) -> ShowS -> [ShowS] -> ShowS
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) ShowS
forall {a}. a -> a
id [ShowS]
chain
toTriad :: (PitchClass -> NoteName) -> [Int] -> Chord
toTriad :: (PitchClass -> NoteName) -> [Int] -> Chord
toTriad PitchClass -> NoteName
enharm ps :: [Int]
ps@(Int
fund:[Int]
_)
| [Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Int] -> [Int]
forall {a}. Integral a => [a] -> [a]
pcSetInts [Int]
ps) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
3 = (PitchClass -> NoteName) -> [Int] -> Chord
toTriad PitchClass -> NoteName
enharm ([Int] -> Chord) -> [Int] -> Chord
forall a b. (a -> b) -> a -> b
$ [[Int]] -> [Int]
mostConsonant ([[Int]] -> [Int]) -> [[Int]] -> [Int]
forall a b. (a -> b) -> a -> b
$ (PitchClass -> NoteName) -> Int -> [Int] -> [[Int]]
possibleTriadsSimple PitchClass -> NoteName
enharm Int
fund ([Int] -> [Int]
forall a. HasCallStack => [a] -> [a]
tail [Int]
ps)
| Bool
otherwise =
let normalizedPs :: [Int]
normalizedPs = Int -> [Int] -> [Int]
normalizeWithFund Int
fund [Int]
ps
pcs :: [PitchClass]
pcs = (Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
mkPitchClass [Int]
normalizedPs
bass :: PitchClass
bass = Int -> PitchClass
mkPitchClass ([Int] -> Int
forall a. HasCallStack => [a] -> a
head [Int]
normalizedPs)
invs :: [[PitchClass]]
invs = [PitchClass] -> [[PitchClass]]
inversions [PitchClass]
pcs
headInv :: [PitchClass]
headInv = [[PitchClass]] -> [PitchClass]
forall a. HasCallStack => [a] -> a
head [[PitchClass]]
invs
rootOffset :: Int
rootOffset = case [PitchClass]
headInv of
[P Int
0, P Int
4, P Int
7] -> Int
0
[P Int
0, P Int
3, P Int
7] -> Int
0
[P Int
0, P Int
3, P Int
8] -> Int
8
[P Int
0, P Int
4, P Int
9] -> Int
9
[P Int
0, P Int
5, P Int
9] -> Int
5
[P Int
0, P Int
5, P Int
8] -> Int
5
[P Int
0, P Int
3, P Int
6] -> Int
0
[P Int
0, P Int
6, P Int
9] -> Int
6
[P Int
0, P Int
3, P Int
9] -> Int
9
[PitchClass]
_ -> Int
0
rootPC :: PitchClass
rootPC = PitchClass
bass PitchClass -> PitchClass -> PitchClass
forall a. Num a => a -> a -> a
+ Int -> PitchClass
P Int
rootOffset
rootRelativePCs :: [PitchClass]
rootRelativePCs = [PitchClass] -> [PitchClass]
forall a. Ord a => [a] -> [a]
sort ([PitchClass] -> [PitchClass]) -> [PitchClass] -> [PitchClass]
forall a b. (a -> b) -> a -> b
$ (PitchClass -> PitchClass) -> [PitchClass] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map (\PitchClass
p -> PitchClass
p PitchClass -> PitchClass -> PitchClass
forall a. Num a => a -> a -> a
- PitchClass
rootPC) [PitchClass]
pcs
functionality :: String
functionality = ([PitchClass] -> [PitchClass]) -> [PitchClass] -> ShowS
nameFuncTriad [PitchClass] -> [PitchClass]
zeroFormPC [PitchClass]
rootRelativePCs String
""
invResult :: (NoteName, String)
invResult = (PitchClass -> NoteName) -> [Int] -> (NoteName, String)
detectInversion PitchClass -> NoteName
enharm [Int]
normalizedPs
in NoteName -> String -> [Integer] -> Chord
Chord ((NoteName, String) -> NoteName
forall a b. (a, b) -> a
fst (NoteName, String)
invResult) (String
functionality String -> ShowS
forall a. [a] -> [a] -> [a]
++ (NoteName, String) -> String
forall a b. (a, b) -> b
snd (NoteName, String)
invResult) ((Int -> Integer) -> [Int] -> [Integer]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral [Int]
ps)
where
pcSetInts :: [a] -> [a]
pcSetInts [a]
xs = [a] -> [a]
forall a. Eq a => [a] -> [a]
List.nub ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ [a] -> [a]
forall a. Ord a => [a] -> [a]
sort ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ (a -> a) -> [a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
12) [a]
xs
toTriad PitchClass -> NoteName
_ [] = NoteName -> String -> [Integer] -> Chord
Chord NoteName
C String
"N/A" []
flatTriad :: [Int] -> Chord
flatTriad :: [Int] -> Chord
flatTriad = (PitchClass -> NoteName) -> [Int] -> Chord
toTriad PitchClass -> NoteName
flat
sharpTriad :: [Int] -> Chord
sharpTriad :: [Int] -> Chord
sharpTriad = (PitchClass -> NoteName) -> [Int] -> Chord
toTriad PitchClass -> NoteName
sharp
toChord :: (PitchClass -> NoteName) -> [Int] -> Chord
toChord :: (PitchClass -> NoteName) -> [Int] -> Chord
toChord PitchClass -> NoteName
enharm ps :: [Int]
ps@(Int
fund:[Int]
tones) =
let chord :: [Int]
chord = (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
fund) (Int -> Int) -> [Int] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([Int] -> [Int]
forall {a}. Integral a => [a] -> [a]
sortedZeroForm ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ Int
fund Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
: ([Int] -> [Int]
forall a. [a] -> [a]
reverse ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ [Int] -> [Int]
forall a. Ord a => [a] -> [a]
sort [Int]
tones))
functionality :: String
functionality = ([PitchClass] -> [PitchClass]) -> [PitchClass] -> ShowS
nameFuncChord [PitchClass] -> [PitchClass]
zeroFormPC ((Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
mkPitchClass [Int]
chord) String
""
in NoteName -> String -> [Integer] -> Chord
Chord (PitchClass -> NoteName
enharm (PitchClass -> NoteName) -> PitchClass -> NoteName
forall a b. (a -> b) -> a -> b
$ Int -> PitchClass
mkPitchClass ([Int] -> Int
forall a. HasCallStack => [a] -> a
head [Int]
chord)) String
functionality ((Int -> Integer) -> [Int] -> [Integer]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Int] -> [Integer]) -> [Int] -> [Integer]
forall a b. (a -> b) -> a -> b
$ (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
chord)
where
sortedZeroForm :: [a] -> [a]
sortedZeroForm [a]
xs =
let m :: a
m = [a] -> a
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [a]
xs
in [a] -> [a]
forall a. Ord a => [a] -> [a]
sort ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ (a -> a) -> [a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (\a
n -> (a
n a -> a -> a
forall a. Num a => a -> a -> a
- a
m) a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
12) [a]
xs
toChord PitchClass -> NoteName
enharm [] = NoteName -> String -> [Integer] -> Chord
Chord (PitchClass -> NoteName
enharm (Int -> PitchClass
P Int
0)) String
"N/A" []
flatChord :: [Int] -> Chord
flatChord :: [Int] -> Chord
flatChord = (PitchClass -> NoteName) -> [Int] -> Chord
toChord PitchClass -> NoteName
flat
sharpChord :: [Int] -> Chord
sharpChord :: [Int] -> Chord
sharpChord = (PitchClass -> NoteName) -> [Int] -> Chord
toChord PitchClass -> NoteName
sharp
toCadence :: (Chord, Chord) -> Cadence
toCadence :: (Chord, Chord) -> Cadence
toCadence (Chord
fromChord, Chord
toChord') =
let fromRoot :: PitchClass
fromRoot = NoteName -> PitchClass
pitchClass (Chord -> NoteName
chordNoteName Chord
fromChord)
toRoot :: PitchClass
toRoot = NoteName -> PitchClass
pitchClass (Chord -> NoteName
chordNoteName Chord
toChord')
mvmt :: Movement
mvmt = PitchClass -> PitchClass -> Movement
toMovement PitchClass
fromRoot PitchClass
toRoot
toIntervals :: [PitchClass]
toIntervals = (Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
mkPitchClass ([Int] -> [PitchClass]) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> a -> b
$ Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
take Int
3 ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ (Integer -> Int) -> [Integer] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Chord -> [Integer]
chordIntervals Chord
toChord')
in String -> Movement -> [PitchClass] -> Cadence
Cadence (Chord -> String
chordFunctionality Chord
toChord') Movement
mvmt ([PitchClass] -> [PitchClass]
zeroFormPC [PitchClass]
toIntervals)
fromChordState :: ChordState -> Chord
fromChordState :: ChordState -> Chord
fromChordState = ChordState -> Chord
stateChord
fromCadenceState :: CadenceState -> Chord
fromCadenceState :: CadenceState -> Chord
fromCadenceState (CadenceState Cadence
cadence NoteName
root EnharmonicSpelling
spelling) =
let rootPC :: PitchClass
rootPC = NoteName -> PitchClass
pitchClass NoteName
root
enharm :: PitchClass -> NoteName
enharm = EnharmonicSpelling -> PitchClass -> NoteName
enharmonicFunc EnharmonicSpelling
spelling
tones :: [PitchClass]
tones = Cadence -> [PitchClass]
cadenceIntervals Cadence
cadence
pitches :: [Int]
pitches = (PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\PitchClass
t -> PitchClass -> Int
unPitchClass (PitchClass
t PitchClass -> PitchClass -> PitchClass
forall a. Num a => a -> a -> a
+ PitchClass
rootPC)) [PitchClass]
tones
in (PitchClass -> NoteName) -> [Int] -> Chord
toTriad PitchClass -> NoteName
enharm [Int]
pitches
initCadenceState :: Int -> String -> [Int] -> CadenceState
initCadenceState :: Int -> String -> [Int] -> CadenceState
initCadenceState Int
movement String
note [Int]
quality =
let approach :: Movement
approach = PitchClass -> PitchClass -> Movement
toMovement (Int -> PitchClass
P Int
0) (Int -> PitchClass
mkPitchClass Int
movement)
from :: Chord
from = [Int] -> Chord
flatTriad [Int
0]
toIntervals :: [Int]
toIntervals = (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ PitchClass -> Int
unPitchClass (Movement -> PitchClass
fromMovement Movement
approach)) ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ [Int] -> [Int]
forall {a}. Integral a => [a] -> [a]
zeroFormInts [Int]
quality
to :: Chord
to = [Int] -> Chord
flatTriad [Int]
toIntervals
root :: NoteName
root = String -> NoteName
readNoteName String
note
cad :: Cadence
cad = (Chord, Chord) -> Cadence
toCadence (Chord
from, Chord
to)
rootPC :: PitchClass
rootPC = NoteName -> PitchClass
pitchClass NoteName
root
tones :: [PitchClass]
tones = Cadence -> [PitchClass]
cadenceIntervals Cadence
cad
absolutePitches :: [Int]
absolutePitches = (PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\PitchClass
t -> PitchClass -> Int
unPitchClass (PitchClass
t PitchClass -> PitchClass -> PitchClass
forall a. Num a => a -> a -> a
+ PitchClass
rootPC)) [PitchClass]
tones
inferredSpelling :: EnharmonicSpelling
inferredSpelling = [Int] -> EnharmonicSpelling
inferSpelling [Int]
absolutePitches
spelling :: EnharmonicSpelling
spelling = case NoteName -> Maybe EnharmonicSpelling
noteNameImpliesSpelling NoteName
root of
Just EnharmonicSpelling
explicit -> EnharmonicSpelling
explicit
Maybe EnharmonicSpelling
Nothing -> EnharmonicSpelling
inferredSpelling
in Cadence -> NoteName -> EnharmonicSpelling -> CadenceState
CadenceState Cadence
cad NoteName
root EnharmonicSpelling
spelling
where
zeroFormInts :: [a] -> [a]
zeroFormInts [a]
xs = let m :: a
m = [a] -> a
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [a]
xs in [a] -> [a]
forall a. Ord a => [a] -> [a]
sort ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ (a -> a) -> [a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (\a
n -> (a
n a -> a -> a
forall a. Num a => a -> a -> a
- a
m) a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
12) [a]
xs
mkCadenceStatePCs :: NoteName -> Movement -> [Int] -> CadenceState
mkCadenceStatePCs :: NoteName -> Movement -> [Int] -> CadenceState
mkCadenceStatePCs NoteName
root Movement
movement [Int]
intervals =
let rootPC :: Int
rootPC = PitchClass -> Int
unPitchClass (NoteName -> PitchClass
pitchClass NoteName
root)
ivs :: [Int]
ivs = [Int] -> [Int]
forall a. Ord a => [a] -> [a]
sort ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ [Int] -> [Int]
forall a. Eq a => [a] -> [a]
List.nub ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) (Int
0 Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
: [Int]
intervals)
pcs :: [PitchClass]
pcs = (Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
mkPitchClass [Int]
ivs
functionality :: String
functionality
| [PitchClass] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PitchClass]
pcs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
3 = [PitchClass] -> String
toFunctionality [PitchClass]
pcs
| Bool
otherwise = [PitchClass] -> String
toFunctionalityChord [PitchClass]
pcs
absolutePitches :: [Int]
absolutePitches = (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
i -> (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
rootPC) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
ivs
spelling :: EnharmonicSpelling
spelling = case NoteName -> Maybe EnharmonicSpelling
noteNameImpliesSpelling NoteName
root of
Just EnharmonicSpelling
explicit -> EnharmonicSpelling
explicit
Maybe EnharmonicSpelling
Nothing -> [Int] -> EnharmonicSpelling
inferSpelling [Int]
absolutePitches
in Cadence -> NoteName -> EnharmonicSpelling -> CadenceState
CadenceState (String -> Movement -> [PitchClass] -> Cadence
Cadence String
functionality Movement
movement [PitchClass]
pcs) NoteName
root EnharmonicSpelling
spelling
walkTriadCadence :: Cadence -> Cadence
walkTriadCadence :: Cadence -> Cadence
walkTriadCadence Cadence
cad
| [PitchClass] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PitchClass]
ivs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
3 = Cadence
cad
| [[Int]] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[Int]]
triads = Cadence
cad
| Bool
otherwise =
let best :: [Int]
best = [[Int]] -> [Int]
mostConsonant [[Int]]
triads
zf :: [PitchClass]
zf = (Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
mkPitchClass [Int]
best
in String -> Movement -> [PitchClass] -> Cadence
Cadence ([PitchClass] -> String
corpusFunctionality [PitchClass]
zf) (Cadence -> Movement
cadenceMovement Cadence
cad) [PitchClass]
zf
where
ivs :: [PitchClass]
ivs = Cadence -> [PitchClass]
cadenceIntervals Cadence
cad
uppers :: [Int]
uppers = [Int] -> [Int]
forall a. Eq a => [a] -> [a]
List.nub [ Int
i | Int
i <- (PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\PitchClass
p -> PitchClass -> Int
unPitchClass PitchClass
p Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [PitchClass]
ivs, Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
0 ]
triads :: [[Int]]
triads = [ [Int
0, Int
a, Int
b] | Int
a <- [Int]
uppers, Int
b <- [Int]
uppers, Int
a Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
b ]
walkTriadState :: CadenceState -> CadenceState
walkTriadState :: CadenceState -> CadenceState
walkTriadState (CadenceState Cadence
cad NoteName
root EnharmonicSpelling
spelling) =
Cadence -> NoteName -> EnharmonicSpelling -> CadenceState
CadenceState (Cadence -> Cadence
walkTriadCadence Cadence
cad) NoteName
root EnharmonicSpelling
spelling
data ToTriadTrace = ToTriadTrace
{ ToTriadTrace -> String
tttRawDbIntervals :: String
, ToTriadTrace -> String
tttRawDbMovement :: String
, ToTriadTrace -> String
tttRawDbFunctionality :: String
, ToTriadTrace -> Int
tttRootPC :: Int
, ToTriadTrace -> String
tttRootNoteName :: String
, ToTriadTrace -> [Int]
tttTones :: [Int]
, ToTriadTrace -> [Int]
tttTransposedPitches:: [Int]
, ToTriadTrace -> [Int]
tttNormalizedPs :: [Int]
, ToTriadTrace -> [Int]
tttZeroForm :: [Int]
, ToTriadTrace -> String
tttDetectedRoot :: String
, ToTriadTrace -> String
tttFunctionality :: String
, ToTriadTrace -> String
tttFinalChord :: String
, ToTriadTrace -> String
tttStoredFunc :: String
} deriving (Int -> ToTriadTrace -> ShowS
[ToTriadTrace] -> ShowS
ToTriadTrace -> String
(Int -> ToTriadTrace -> ShowS)
-> (ToTriadTrace -> String)
-> ([ToTriadTrace] -> ShowS)
-> Show ToTriadTrace
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ToTriadTrace -> ShowS
showsPrec :: Int -> ToTriadTrace -> ShowS
$cshow :: ToTriadTrace -> String
show :: ToTriadTrace -> String
$cshowList :: [ToTriadTrace] -> ShowS
showList :: [ToTriadTrace] -> ShowS
Show, ToTriadTrace -> ToTriadTrace -> Bool
(ToTriadTrace -> ToTriadTrace -> Bool)
-> (ToTriadTrace -> ToTriadTrace -> Bool) -> Eq ToTriadTrace
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ToTriadTrace -> ToTriadTrace -> Bool
== :: ToTriadTrace -> ToTriadTrace -> Bool
$c/= :: ToTriadTrace -> ToTriadTrace -> Bool
/= :: ToTriadTrace -> ToTriadTrace -> Bool
Eq)
fromCadenceStateTraced :: CadenceState -> (Chord, ToTriadTrace)
fromCadenceStateTraced :: CadenceState -> (Chord, ToTriadTrace)
fromCadenceStateTraced (CadenceState Cadence
cadence NoteName
root EnharmonicSpelling
spelling) =
let rootPC :: PitchClass
rootPC = NoteName -> PitchClass
pitchClass NoteName
root
rootPCInt :: Int
rootPCInt = PitchClass -> Int
unPitchClass PitchClass
rootPC
enharm :: PitchClass -> NoteName
enharm = EnharmonicSpelling -> PitchClass -> NoteName
enharmonicFunc EnharmonicSpelling
spelling
tones :: [PitchClass]
tones = Cadence -> [PitchClass]
cadenceIntervals Cadence
cadence
tonesInts :: [Int]
tonesInts = (PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map PitchClass -> Int
unPitchClass [PitchClass]
tones
pitches :: [Int]
pitches = (PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\PitchClass
t -> PitchClass -> Int
unPitchClass (PitchClass
t PitchClass -> PitchClass -> PitchClass
forall a. Num a => a -> a -> a
+ PitchClass
rootPC)) [PitchClass]
tones
fund :: Int
fund = [Int] -> Int
forall a. HasCallStack => [a] -> a
head [Int]
pitches
normalizedPs :: [Int]
normalizedPs = Int -> [Int] -> [Int]
normalizeWithFund Int
fund [Int]
pitches
pcs :: [PitchClass]
pcs = (Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
mkPitchClass [Int]
normalizedPs
bass :: PitchClass
bass = Int -> PitchClass
mkPitchClass ([Int] -> Int
forall a. HasCallStack => [a] -> a
head [Int]
normalizedPs)
invs :: [[PitchClass]]
invs = [PitchClass] -> [[PitchClass]]
inversions [PitchClass]
pcs
headInv :: [PitchClass]
headInv = [[PitchClass]] -> [PitchClass]
forall a. HasCallStack => [a] -> a
head [[PitchClass]]
invs
rootOffset :: Int
rootOffset = case [PitchClass]
headInv of
[P Int
0, P Int
4, P Int
7] -> Int
0
[P Int
0, P Int
3, P Int
7] -> Int
0
[P Int
0, P Int
3, P Int
8] -> Int
8
[P Int
0, P Int
4, P Int
9] -> Int
9
[P Int
0, P Int
5, P Int
9] -> Int
5
[P Int
0, P Int
5, P Int
8] -> Int
5
[P Int
0, P Int
3, P Int
6] -> Int
0
[P Int
0, P Int
6, P Int
9] -> Int
6
[P Int
0, P Int
3, P Int
9] -> Int
9
[PitchClass]
_ -> Int
0
rootPC_computed :: PitchClass
rootPC_computed = PitchClass
bass PitchClass -> PitchClass -> PitchClass
forall a. Num a => a -> a -> a
+ Int -> PitchClass
P Int
rootOffset
rootRelativePCs :: [PitchClass]
rootRelativePCs = [PitchClass] -> [PitchClass]
forall a. Ord a => [a] -> [a]
sort ([PitchClass] -> [PitchClass]) -> [PitchClass] -> [PitchClass]
forall a b. (a -> b) -> a -> b
$ (PitchClass -> PitchClass) -> [PitchClass] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map (\PitchClass
p -> PitchClass
p PitchClass -> PitchClass -> PitchClass
forall a. Num a => a -> a -> a
- PitchClass
rootPC_computed) [PitchClass]
pcs
zeroForm :: [Int]
zeroForm = (PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map PitchClass -> Int
unPitchClass ([PitchClass] -> [Int]) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> a -> b
$ [PitchClass] -> [PitchClass]
zeroFormPC [PitchClass]
pcs
invResult :: (NoteName, String)
invResult = (PitchClass -> NoteName) -> [Int] -> (NoteName, String)
detectInversion PitchClass -> NoteName
enharm [Int]
normalizedPs
functionality :: String
functionality = ([PitchClass] -> [PitchClass]) -> [PitchClass] -> ShowS
nameFuncTriad [PitchClass] -> [PitchClass]
zeroFormPC [PitchClass]
rootRelativePCs String
""
finalChord :: Chord
finalChord = NoteName -> String -> [Integer] -> Chord
Chord ((NoteName, String) -> NoteName
forall a b. (a, b) -> a
fst (NoteName, String)
invResult) (String
functionality String -> ShowS
forall a. [a] -> [a] -> [a]
++ (NoteName, String) -> String
forall a b. (a, b) -> b
snd (NoteName, String)
invResult) ((Int -> Integer) -> [Int] -> [Integer]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral [Int]
pitches)
dbIntervals :: String
dbIntervals = [PitchClass] -> String
forall a. Show a => a -> String
show [PitchClass]
tones
dbMovement :: String
dbMovement = Movement -> String
forall a. Show a => a -> String
show (Cadence -> Movement
cadenceMovement Cadence
cadence)
dbFunctionality :: String
dbFunctionality = Cadence -> String
cadenceFunctionality Cadence
cadence
trace :: ToTriadTrace
trace = ToTriadTrace
{ tttRawDbIntervals :: String
tttRawDbIntervals = String
dbIntervals
, tttRawDbMovement :: String
tttRawDbMovement = String
dbMovement
, tttRawDbFunctionality :: String
tttRawDbFunctionality = String
dbFunctionality
, tttRootPC :: Int
tttRootPC = Int
rootPCInt
, tttRootNoteName :: String
tttRootNoteName = NoteName -> String
forall a. Show a => a -> String
show NoteName
root
, tttTones :: [Int]
tttTones = [Int]
tonesInts
, tttTransposedPitches :: [Int]
tttTransposedPitches = [Int]
pitches
, tttNormalizedPs :: [Int]
tttNormalizedPs = [Int]
normalizedPs
, tttZeroForm :: [Int]
tttZeroForm = [Int]
zeroForm
, tttDetectedRoot :: String
tttDetectedRoot = NoteName -> String
forall a. Show a => a -> String
show ((NoteName, String) -> NoteName
forall a b. (a, b) -> a
fst (NoteName, String)
invResult)
, tttFunctionality :: String
tttFunctionality = String
functionality
, tttFinalChord :: String
tttFinalChord = NoteName -> String
forall a. Show a => a -> String
show ((NoteName, String) -> NoteName
forall a b. (a, b) -> a
fst (NoteName, String)
invResult) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
functionality String -> ShowS
forall a. [a] -> [a] -> [a]
++ (NoteName, String) -> String
forall a b. (a, b) -> b
snd (NoteName, String)
invResult
, tttStoredFunc :: String
tttStoredFunc = String
dbFunctionality
}
in (Chord
finalChord, ToTriadTrace
trace)
constructCadence :: (String, String) -> Cadence
constructCadence :: (String, String) -> Cadence
constructCadence (String
movementStr, String
chordStr) =
let pitches :: [PitchClass]
pitches = String -> [PitchClass]
forall a. Read a => String -> a
read String
chordStr :: [PitchClass]
functionality :: String
functionality = [PitchClass] -> String
corpusFunctionality [PitchClass]
pitches
movement :: Movement
movement = String -> Movement
forall a. Read a => String -> a
read String
movementStr :: Movement
in String -> Movement -> [PitchClass] -> Cadence
Cadence String
functionality Movement
movement [PitchClass]
pitches
corpusFunctionality :: [PitchClass] -> Functionality
corpusFunctionality :: [PitchClass] -> String
corpusFunctionality [PitchClass]
pcs =
case [PitchClass] -> [([PitchClass], String)] -> Maybe String
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup ([PitchClass] -> [PitchClass]
zeroFormPC [PitchClass]
pcs) [([PitchClass], String)]
corpusNameTable of
Just String
name -> String
name
Maybe String
Nothing
| [PitchClass] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PitchClass]
pcs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
3 -> [PitchClass] -> String
toFunctionality [PitchClass]
pcs
| Bool
otherwise -> [PitchClass] -> String
toFunctionalityChord [PitchClass]
pcs
corpusNameTable :: [([PitchClass], Functionality)]
corpusNameTable :: [([PitchClass], String)]
corpusNameTable = (([Int], String) -> ([PitchClass], String))
-> [([Int], String)] -> [([PitchClass], String)]
forall a b. (a -> b) -> [a] -> [b]
map (\([Int]
is, String
n) -> ((Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
P [Int]
is, String
n))
[ ([Int
0,Int
1,Int
2], String
"sus2b9no5"), ([Int
0,Int
1,Int
3], String
"minb9no5")
, ([Int
0,Int
1,Int
4], String
"majb9no5"), ([Int
0,Int
1,Int
5], String
"sus4b9no5")
, ([Int
0,Int
1,Int
6], String
"b9b5no3"), ([Int
0,Int
1,Int
7], String
"b9no3")
, ([Int
0,Int
1,Int
8], String
"b9#5no3"), ([Int
0,Int
1,Int
9], String
"6b9no3no5")
, ([Int
0,Int
1,Int
10], String
"7b9no3no5"), ([Int
0,Int
1,Int
11], String
"maj7b9no3no5")
, ([Int
0,Int
2,Int
3], String
"minadd9no5"), ([Int
0,Int
2,Int
4], String
"majadd9no5")
, ([Int
0,Int
2,Int
5], String
"sus2/4no5"), ([Int
0,Int
2,Int
6], String
"sus2b5")
, ([Int
0,Int
2,Int
7], String
"sus4_1stInv"), ([Int
0,Int
2,Int
8], String
"sus2#5")
, ([Int
0,Int
2,Int
9], String
"6sus2no5"), ([Int
0,Int
2,Int
10], String
"7sus2no5")
, ([Int
0,Int
2,Int
11], String
"maj7sus2no5"), ([Int
0,Int
3,Int
4], String
"#9no5")
, ([Int
0,Int
3,Int
5], String
"minadd11no5"), ([Int
0,Int
3,Int
6], String
"dim")
, ([Int
0,Int
3,Int
7], String
"min"), ([Int
0,Int
3,Int
8], String
"maj_1stInv")
, ([Int
0,Int
3,Int
9], String
"dim_1stInv"), ([Int
0,Int
3,Int
10], String
"min7no5")
, ([Int
0,Int
3,Int
11], String
"minmaj7no5"), ([Int
0,Int
4,Int
5], String
"majadd11no5")
, ([Int
0,Int
4,Int
6], String
"majb5"), ([Int
0,Int
4,Int
7], String
"maj")
, ([Int
0,Int
4,Int
8], String
"aug"), ([Int
0,Int
4,Int
9], String
"min_1stInv")
, ([Int
0,Int
4,Int
10], String
"7no5"), ([Int
0,Int
4,Int
11], String
"maj7no5")
, ([Int
0,Int
5,Int
6], String
"sus4b5"), ([Int
0,Int
5,Int
7], String
"sus4")
, ([Int
0,Int
5,Int
8], String
"min_2ndInv"), ([Int
0,Int
5,Int
9], String
"maj_2ndInv")
, ([Int
0,Int
5,Int
10], String
"sus4_2ndInv"), ([Int
0,Int
5,Int
11], String
"maj7sus4no5")
, ([Int
0,Int
6,Int
7], String
"#11no3"), ([Int
0,Int
6,Int
8], String
"#11#5no3")
, ([Int
0,Int
6,Int
9], String
"dim_2ndInv"), ([Int
0,Int
6,Int
10], String
"7b5no3")
, ([Int
0,Int
6,Int
11], String
"maj7b5no3"), ([Int
0,Int
7,Int
8], String
"b13no3")
, ([Int
0,Int
7,Int
9], String
"6no3"), ([Int
0,Int
7,Int
10], String
"7no3")
, ([Int
0,Int
7,Int
11], String
"maj7no3"), ([Int
0,Int
8,Int
9], String
"6#5no3")
, ([Int
0,Int
8,Int
10], String
"7#5no3"), ([Int
0,Int
8,Int
11], String
"maj7#5no3")
, ([Int
0,Int
9,Int
10], String
"67no3no5"), ([Int
0,Int
9,Int
11], String
"6maj7no3no5")
, ([Int
0,Int
10,Int
11], String
"7maj7no3no5")
]
deconstructCadence :: Cadence -> (Movement, [PitchClass])
deconstructCadence :: Cadence -> (Movement, [PitchClass])
deconstructCadence (Cadence String
_ Movement
mvmt [PitchClass]
intervals) = (Movement
mvmt, [PitchClass]
intervals)
rootNote :: Chord -> NoteName
rootNote :: Chord -> NoteName
rootNote = Chord -> NoteName
chordNoteName
inversions :: [PitchClass] -> [[PitchClass]]
inversions :: [PitchClass] -> [[PitchClass]]
inversions [PitchClass]
ps = ([Int] -> [PitchClass]) -> [[Int]] -> [[PitchClass]]
forall a b. (a -> b) -> [a] -> [b]
map ([PitchClass] -> [PitchClass]
zeroFormPC ([PitchClass] -> [PitchClass])
-> ([Int] -> [PitchClass]) -> [Int] -> [PitchClass]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> PitchClass
P (Int -> PitchClass) -> (Int -> Int) -> Int -> PitchClass
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral)) ([[Int]] -> [[PitchClass]]) -> [[Int]] -> [[PitchClass]]
forall a b. (a -> b) -> a -> b
$ [Int] -> [[Int]]
forall {a}. [a] -> [[a]]
simpleRotations ((PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map PitchClass -> Int
unPitchClass [PitchClass]
ps)
where
simpleRotations :: [a] -> [[a]]
simpleRotations [a]
xs = Int -> [[a]] -> [[a]]
forall a. Int -> [a] -> [a]
take ([a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs) ([[a]] -> [[a]]) -> [[a]] -> [[a]]
forall a b. (a -> b) -> a -> b
$ ([a] -> [a]) -> [a] -> [[a]]
forall a. (a -> a) -> a -> [a]
iterate [a] -> [a]
forall a. [a] -> [a]
rotate [a]
xs
rotate :: [a] -> [a]
rotate [a]
ys = [a] -> [a]
forall a. HasCallStack => [a] -> [a]
tail [a]
ys [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [[a] -> a
forall a. HasCallStack => [a] -> a
head [a]
ys]
normalForm :: [PitchClass] -> [PitchClass]
normalForm :: [PitchClass] -> [PitchClass]
normalForm [PitchClass]
xs
| [PitchClass] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PitchClass]
pitches Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 = [Int -> PitchClass
P Int
0]
| [PitchClass] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PitchClass]
pitches Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
2 = [[PitchClass]] -> [PitchClass]
forall a. HasCallStack => [a] -> a
head ([[PitchClass]] -> [PitchClass]) -> [[PitchClass]] -> [PitchClass]
forall a b. (a -> b) -> a -> b
$ [[PitchClass]] -> [[PitchClass]]
filterByLast ([[PitchClass]] -> [[PitchClass]])
-> [[PitchClass]] -> [[PitchClass]]
forall a b. (a -> b) -> a -> b
$ [[PitchClass]]
invs
| [PitchClass] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PitchClass]
pitches Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
3 = [[PitchClass]] -> [PitchClass]
forall a. HasCallStack => [a] -> a
head ([[PitchClass]] -> [PitchClass]) -> [[PitchClass]] -> [PitchClass]
forall a b. (a -> b) -> a -> b
$ [[PitchClass]] -> [[PitchClass]]
filterBySecondLast ([[PitchClass]] -> [[PitchClass]])
-> [[PitchClass]] -> [[PitchClass]]
forall a b. (a -> b) -> a -> b
$ [[PitchClass]] -> [[PitchClass]]
filterByLast [[PitchClass]]
invs
| Bool
otherwise = [[PitchClass]] -> [PitchClass]
forall a. HasCallStack => [a] -> a
head ([[PitchClass]] -> [PitchClass]) -> [[PitchClass]] -> [PitchClass]
forall a b. (a -> b) -> a -> b
$ [[PitchClass]] -> [[PitchClass]]
filterBySecondLast ([[PitchClass]] -> [[PitchClass]])
-> [[PitchClass]] -> [[PitchClass]]
forall a b. (a -> b) -> a -> b
$ [[PitchClass]] -> [[PitchClass]]
filterByLast [[PitchClass]]
invs
where
pitches :: [PitchClass]
pitches = [PitchClass] -> [PitchClass]
forall a. Eq a => [a] -> [a]
List.nub [PitchClass]
xs
invs :: [[PitchClass]]
invs = [PitchClass] -> [[PitchClass]]
inversions [PitchClass]
pitches
toInts :: [PitchClass] -> [Int]
toInts [PitchClass]
ys = (PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map PitchClass -> Int
unPitchClass [PitchClass]
ys
filterByLast :: [[PitchClass]] -> [[PitchClass]]
filterByLast [[PitchClass]]
xss = ([PitchClass] -> Bool) -> [[PitchClass]] -> [[PitchClass]]
forall a. (a -> Bool) -> [a] -> [a]
filter (\[PitchClass]
x -> [Int] -> Int
forall a. HasCallStack => [a] -> a
last ([PitchClass] -> [Int]
toInts [PitchClass]
x) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== [Int] -> Int
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum (([PitchClass] -> Int) -> [[PitchClass]] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map ([Int] -> Int
forall a. HasCallStack => [a] -> a
last ([Int] -> Int) -> ([PitchClass] -> [Int]) -> [PitchClass] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [PitchClass] -> [Int]
toInts) [[PitchClass]]
xss)) [[PitchClass]]
xss
filterBySecondLast :: [[PitchClass]] -> [[PitchClass]]
filterBySecondLast [[PitchClass]]
xss =
let penultimate :: [PitchClass] -> Int
penultimate [PitchClass]
ys = if [PitchClass] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PitchClass]
ys Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
2 then [PitchClass] -> [Int]
toInts [PitchClass]
ys [Int] -> Int -> Int
forall a. HasCallStack => [a] -> Int -> a
!! ([PitchClass] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PitchClass]
ys Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
2) else Int
0
in ([PitchClass] -> Bool) -> [[PitchClass]] -> [[PitchClass]]
forall a. (a -> Bool) -> [a] -> [a]
filter (\[PitchClass]
x -> [PitchClass] -> Int
penultimate [PitchClass]
x Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== [Int] -> Int
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum (([PitchClass] -> Int) -> [[PitchClass]] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map [PitchClass] -> Int
penultimate [[PitchClass]]
xss)) [[PitchClass]]
xss
primeForm :: [PitchClass] -> [PitchClass]
primeForm :: [PitchClass] -> [PitchClass]
primeForm [PitchClass]
xs = (Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
P ([Int] -> [PitchClass]) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> a -> b
$ [Int]
primeInts
where
cmpt :: [Int]
cmpt = (PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map PitchClass -> Int
unPitchClass ([PitchClass] -> [Int]) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> a -> b
$ [PitchClass] -> [PitchClass]
normalForm [PitchClass]
xs
inverted :: [Int]
inverted = (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
n -> (Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
cmpt
invCmpt :: [Int]
invCmpt = (PitchClass -> Int) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map PitchClass -> Int
unPitchClass ([PitchClass] -> [Int]) -> [PitchClass] -> [Int]
forall a b. (a -> b) -> a -> b
$ [PitchClass] -> [PitchClass]
normalForm ((Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
P [Int]
inverted)
primeInts :: [Int]
primeInts = [[Int]] -> [Int]
forall a. HasCallStack => [a] -> a
head ([[Int]] -> [Int]) -> [[Int]] -> [Int]
forall a b. (a -> b) -> a -> b
$ ([Int] -> [Int] -> Ordering) -> [[Int]] -> [[Int]]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy (Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Int -> Int -> Ordering)
-> ([Int] -> Int) -> [Int] -> [Int] -> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum) [[Int]
cmpt, [Int]
invCmpt]
readNoteName :: String -> NoteName
readNoteName :: String -> NoteName
readNoteName String
"C" = NoteName
C
readNoteName String
"C#" = NoteName
C'
readNoteName String
"Db" = NoteName
Db
readNoteName String
"D" = NoteName
D
readNoteName String
"D#" = NoteName
D'
readNoteName String
"Eb" = NoteName
Eb
readNoteName String
"E" = NoteName
E
readNoteName String
"F" = NoteName
F
readNoteName String
"F#" = NoteName
F'
readNoteName String
"Gb" = NoteName
Gb
readNoteName String
"G" = NoteName
G
readNoteName String
"G#" = NoteName
G'
readNoteName String
"Ab" = NoteName
Ab
readNoteName String
"A" = NoteName
A
readNoteName String
"A#" = NoteName
A'
readNoteName String
"Bb" = NoteName
Bb
readNoteName String
"B" = NoteName
B
readNoteName String
s = String -> NoteName
forall a. HasCallStack => String -> a
error (String -> NoteName) -> String -> NoteName
forall a b. (a -> b) -> a -> b
$ String
"readNoteName: unknown note name: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ShowS
forall a. Show a => a -> String
show String
s
zeroFormPC :: [PitchClass] -> [PitchClass]
zeroFormPC :: [PitchClass] -> [PitchClass]
zeroFormPC [] = []
zeroFormPC xs :: [PitchClass]
xs@(P Int
first:[PitchClass]
_) =
[PitchClass] -> [PitchClass]
forall a. Ord a => [a] -> [a]
sort ([PitchClass] -> [PitchClass]) -> [PitchClass] -> [PitchClass]
forall a b. (a -> b) -> a -> b
$ (PitchClass -> PitchClass) -> [PitchClass] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map (\(P Int
n) -> Int -> PitchClass
P ((Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
first) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12)) [PitchClass]
xs
normalizeWithFund :: Int -> [Int] -> [Int]
normalizeWithFund :: Int -> [Int] -> [Int]
normalizeWithFund Int
fund [Int]
ps =
let ps' :: [Int]
ps' = (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
ps
adjusted :: [Int]
adjusted = Int
fund Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
: [Int] -> [Int]
forall a. Ord a => [a] -> [a]
sort ((Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
fund Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
ps')
in [Int]
adjusted
possibleTriadsSimple :: (PitchClass -> NoteName) -> Int -> [Int] -> [[Int]]
possibleTriadsSimple :: (PitchClass -> NoteName) -> Int -> [Int] -> [[Int]]
possibleTriadsSimple PitchClass -> NoteName
_ Int
fund [Int]
ps =
let fundPC :: Int
fundPC = Int
fund Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12
otherPCs :: [Int]
otherPCs = [Int] -> [Int]
forall a. Eq a => [a] -> [a]
List.nub ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ (Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
fundPC) ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12) [Int]
ps
pairs :: [[Int]]
pairs = [[Int
a, Int
b] | Int
a <- [Int]
otherPCs, Int
b <- [Int]
otherPCs, Int
a Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
b]
in ([Int] -> [Int]) -> [[Int]] -> [[Int]]
forall a b. (a -> b) -> [a] -> [b]
map (Int
fundPC Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
:) [[Int]]
pairs
mostConsonant :: [[Int]] -> [Int]
mostConsonant :: [[Int]] -> [Int]
mostConsonant [] = [Int
0, Int
4, Int
7]
mostConsonant [[Int]]
xs = (Int, [Int]) -> [Int]
forall a b. (a, b) -> b
snd ((Int, [Int]) -> [Int])
-> ([(Int, [Int])] -> (Int, [Int])) -> [(Int, [Int])] -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Int, [Int])] -> (Int, [Int])
forall a. HasCallStack => [a] -> a
head ([(Int, [Int])] -> (Int, [Int]))
-> ([(Int, [Int])] -> [(Int, [Int])])
-> [(Int, [Int])]
-> (Int, [Int])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, [Int]) -> (Int, [Int]) -> Ordering)
-> [(Int, [Int])] -> [(Int, [Int])]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy (Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Int -> Int -> Ordering)
-> ((Int, [Int]) -> Int)
-> (Int, [Int])
-> (Int, [Int])
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (Int, [Int]) -> Int
forall a b. (a, b) -> a
fst) ([(Int, [Int])] -> [Int]) -> [(Int, [Int])] -> [Int]
forall a b. (a -> b) -> a -> b
$ ([Int] -> (Int, [Int])) -> [[Int]] -> [(Int, [Int])]
forall a b. (a -> b) -> [a] -> [b]
map [Int] -> (Int, [Int])
forall {a}. Integral a => [a] -> (Int, [a])
dissonanceLevel [[Int]]
xs
where
dissonanceLevel :: [a] -> (Int, [a])
dissonanceLevel [a]
ys
| [Int] -> Int -> Int
forall {a}. Eq a => [a] -> a -> Int
countElem [Int]
iVect Int
0 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
5 = (Int
27 :: Int, [a]
ys)
| [a] -> Bool
forall {a}. Integral a => [a] -> Bool
hasPerfectFifth [a]
ys = (Int
baseDiss Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1, [a]
ys)
| Bool
otherwise = (Int
baseDiss, [a]
ys)
where
iVect :: [Int]
iVect = [a] -> [Int]
forall {a}. Integral a => [a] -> [Int]
intervalVector [a]
ys
baseDiss :: Int
baseDiss = [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Int] -> Int) -> [Int] -> Int
forall a b. (a -> b) -> a -> b
$ (Int -> Int -> Int) -> [Int] -> [Int] -> [Int]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int -> Int -> Int
forall a. Num a => a -> a -> a
(*) [Int
16,Int
8,Int
4,Int
2,Int
1,Int
24] [Int]
iVect
intervalVector :: [a] -> [Int]
intervalVector [a]
ys = [a -> [a] -> Int
forall {a}. Integral a => a -> [a] -> Int
countInterval a
i [a]
ys | a
i <- [a
1..a
6]]
countInterval :: a -> [a] -> Int
countInterval a
i [a]
ys = [()] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [() | a
a <- [a]
ys, a
b <- [a]
ys, a
a a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
b, ((a
b a -> a -> a
forall a. Num a => a -> a -> a
- a
a) a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
12) a -> [a] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [a
i, a
12a -> a -> a
forall a. Num a => a -> a -> a
-a
i]]
countElem :: [a] -> a -> Int
countElem [a]
xs' a
x = [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ((a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
filter (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
x) [a]
xs')
hasPerfectFifth :: [a] -> Bool
hasPerfectFifth [] = Bool
False
hasPerfectFifth (a
root:[a]
rest) =
let p5 :: a
p5 = (a
root a -> a -> a
forall a. Num a => a -> a -> a
+ a
7) a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
12
in (a -> Bool) -> [a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\a
x -> a
x a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
12 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
p5) [a]
rest
detectInversion :: (PitchClass -> NoteName) -> [Int] -> (NoteName, String)
detectInversion :: (PitchClass -> NoteName) -> [Int] -> (NoteName, String)
detectInversion PitchClass -> NoteName
enharm [Int]
xs
| [Int] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Int]
xs = (PitchClass -> NoteName
enharm (Int -> PitchClass
P Int
0), String
"")
| [Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Int]
xs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
3 = (PitchClass -> NoteName
enharm (Int -> PitchClass
mkPitchClass ([Int] -> Int
forall a. HasCallStack => [a] -> a
head [Int]
xs)), String
"")
| Bool
otherwise =
let pcs :: [PitchClass]
pcs = (Int -> PitchClass) -> [Int] -> [PitchClass]
forall a b. (a -> b) -> [a] -> [b]
map Int -> PitchClass
mkPitchClass [Int]
xs
bass :: PitchClass
bass = Int -> PitchClass
mkPitchClass ([Int] -> Int
forall a. HasCallStack => [a] -> a
head [Int]
xs)
invs :: [[PitchClass]]
invs = [PitchClass] -> [[PitchClass]]
inversions [PitchClass]
pcs
headInv :: [PitchClass]
headInv = [[PitchClass]] -> [PitchClass]
forall a. HasCallStack => [a] -> a
head [[PitchClass]]
invs
rootFromOffset :: Int -> NoteName
rootFromOffset Int
offset = PitchClass -> NoteName
enharm (PitchClass
bass PitchClass -> PitchClass -> PitchClass
forall a. Num a => a -> a -> a
+ Int -> PitchClass
P Int
offset)
in case [PitchClass]
headInv of
[P Int
0, P Int
4, P Int
7] -> (Int -> NoteName
rootFromOffset Int
0, String
"")
[P Int
0, P Int
3, P Int
7] -> (Int -> NoteName
rootFromOffset Int
0, String
"")
[P Int
0, P Int
3, P Int
8] -> (Int -> NoteName
rootFromOffset Int
8, String
"_1stInv")
[P Int
0, P Int
4, P Int
9] -> (Int -> NoteName
rootFromOffset Int
9, String
"_1stInv")
[P Int
0, P Int
5, P Int
9] -> (Int -> NoteName
rootFromOffset Int
5, String
"_2ndInv")
[P Int
0, P Int
5, P Int
8] -> (Int -> NoteName
rootFromOffset Int
5, String
"_2ndInv")
[P Int
0, P Int
3, P Int
6] -> (Int -> NoteName
rootFromOffset Int
0, String
"")
[P Int
0, P Int
6, P Int
9] -> (Int -> NoteName
rootFromOffset Int
6, String
"_2ndInv")
[P Int
0, P Int
3, P Int
9] -> (Int -> NoteName
rootFromOffset Int
9, String
"_1stInv")
[PitchClass]
_ -> (Int -> NoteName
rootFromOffset Int
0, String
"")
isInversion :: Cadence -> Bool
isInversion :: Cadence -> Bool
isInversion Cadence
cad = case Cadence -> [PitchClass]
cadenceIntervals Cadence
cad of
[P Int
0, P Int
3, P Int
8] -> Bool
True
[P Int
0, P Int
4, P Int
9] -> Bool
True
[P Int
0, P Int
5, P Int
9] -> Bool
True
[P Int
0, P Int
5, P Int
8] -> Bool
True
[P Int
0, P Int
6, P Int
9] -> Bool
True
[P Int
0, P Int
3, P Int
9] -> Bool
True
[PitchClass]
_ -> Bool
False