module Music.Pitch.Clef (
ClefSymbol,
OctaveAdjustment,
Clef,
symbolName,
symbolPitch,
positionPitch,
pitchPosition,
) 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 OctaveAdjustment = Integer
type Clef = (ClefSymbol, OctaveAdjustment, StaffLines)
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"