module Music.Pitch.Clef (
ClefSymbol,
ClefOctave,
Clef,
symbolName,
symbolPitch,
positionPitch,
pitchPosition,
isModernClef,
isHistoricalClef,
isVoiceClef,
trebleClef,
bassClef,
sopranoClef,
mezzoSopranoClef,
altoClef,
tenorClef,
baritoneClef,
) where
import Data.Typeable
import Music.Pitch.StaffLines
import Music.Pitch.Common
import Music.Pitch.Literal
data ClefSymbol = GClef | CClef | FClef | PercClef | NeutralClef
deriving (Eq, Ord, Show, Typeable)
type ClefOctave = Integer
type ClefLine = StaffLines
type Clef = (ClefSymbol, ClefOctave, ClefLine)
symbolName :: ClefSymbol -> String
symbolName GClef = "G clef"
symbolName CClef = "C clef"
symbolName FClef = "F clef"
symbolName PercClef = "Percussion clef"
symbolName NeutralClef = "Neutral clef"
symbolPitch :: ClefSymbol -> Maybe Pitch
symbolPitch GClef = Just g
symbolPitch CClef = Just c
symbolPitch FClef = Just f
symbolPitch _ = Nothing
pitchPosition :: Clef -> Pitch -> Maybe StaffLines
pitchPosition (s,o,l) x = undefined
where
numbersPerOctave = 7
referencePitch = symbolPitch s :: Maybe Pitch
positionPitch :: Clef -> StaffLines -> Maybe Pitch
positionPitch (s,o,l) x = fmap (upDiatonic relativePosition) referencePitch
where
numbersPerOctave = 7
referencePitch = symbolPitch s :: Maybe Pitch
relativePosition = fromIntegral $ (x l) + fromIntegral (o*7)
upDiatonic :: Number -> Pitch -> Pitch
upDiatonic = error "Not implemented: upDiatonic"
trebleClef :: Clef
bassClef :: Clef
sopranoClef :: Clef
mezzoSopranoClef :: Clef
altoClef :: Clef
tenorClef :: Clef
baritoneClef :: Clef
trebleClef = (GClef, 1 :: ClefOctave, 1 :: ClefLine)
bassClef = (FClef, 1 :: ClefOctave, 1 :: ClefLine)
sopranoClef = (CClef, 0 :: ClefOctave, 2 :: ClefLine)
mezzoSopranoClef = (CClef, 0 :: ClefOctave, 1 :: ClefLine)
altoClef = (CClef, 0 :: ClefOctave, 0 :: ClefLine)
tenorClef = (CClef, 0 :: ClefOctave, 1 :: ClefLine)
baritoneClef = (CClef, 0 :: ClefOctave, 2 :: ClefLine)
isModernClef :: Clef -> Bool
isModernClef x |x == trebleClef = True
isModernClef x |x == bassClef = True
isModernClef x |x == altoClef = True
isModernClef x |x == tenorClef = True
isModernClef x |otherwise = False
isHistoricalClef :: Clef -> Bool
isHistoricalClef _ = False
isVoiceClef :: Clef -> Bool
isVoiceClef x |x == altoClef = True
isVoiceClef x |x == tenorClef = True
isVoiceClef x |otherwise = False