\begin{code}
module Music.Analysis.MusicXML.Level2 (
    module Music.Analysis.MusicXML.Level2,
    ) where
import qualified Music.Analysis.MusicXML.Level1 as Layer1
import Music.Analysis.PF 
import Music.Analysis.Base (IntegerNumber)
import Data.Maybe (catMaybes)
import Prelude
\end{code} \begin{code}
-- |
type Score_Partwise = [Measure]
-- | 
type Measure = [Music_Data]
-- |
data Music_Data = 
      Music_Data_1 Note 
    | Music_Data_5 Attributes 
      deriving (Eq, Show)
-- |
type Note = (Note_, Maybe Type, [Dot], Maybe Accidental)
-- |
data Note_ = 
          Note_3 (Full_Note, Duration)
          deriving (Eq, Show)
-- | 
type Full_Note = Full_Note_
-- |
data Full_Note_ = Full_Note_1 Pitch
                | Full_Note_3 Layer1.Rest
                  deriving (Eq, Show)
-- | 
type Pitch = (Layer1.Step, Maybe Layer1.Alter, Layer1.Octave)
-- |
type Duration = IntegerNumber
-- |
type Type = Layer1.Type_
-- |
type Dot = ()
-- |
type Accidental = Layer1.Accidental_
-- |
type Attributes = (Maybe Divisions, [Key], [Time], [Clef])
-- |
type Divisions = IntegerNumber
-- |
type Key = (Key_, [Key_Octave])
-- |
data Key_ = Key_1 (Fifths, Maybe Mode)
          | Key_2 [(Key_Step, Key_Alter)]
            deriving (Eq, Show)
-- |
type Fifths = IntegerNumber
-- |
data Mode = Major | Minor | 
    Dorian | Phrygian | Lydian | Mixolydian |
    Aeolian | Ionian | Locrian
    deriving (Eq, Show)
-- |
type Key_Step = Layer1.Step
-- |
type Key_Alter = Layer1.Alter
-- |
type Key_Octave = Layer1.Octave
-- |
type Time = Time_B
-- |
data Time_B = Time_5 [(Beats, Beat_Type)]
              deriving (Eq, Show)
-- | MusicXML Schema specify "xs:string"
type Beats = (IntegerNumber, Maybe IntegerNumber)
-- | MusicXML Schema specify "xs:string"
type Beat_Type = IntegerNumber
-- |
type Clef = (Sign, Maybe Line, Maybe Clef_Octave_Change)
-- |
data Sign = 
    Clef_Sign_G | Clef_Sign_F | Clef_Sign_C |
    Clef_Sign_Percussion | Clef_Sign_TAB | 
    Clef_Sign_None
    deriving (Eq, Show, Enum)
-- |
type Line = IntegerNumber
-- | 
type Clef_Octave_Change = IntegerNumber
\end{code} \begin{code}
-- |
abst_Score_Partwise :: Score_Partwise -> Layer1.Score_Partwise
abst_Score_Partwise = catMaybes . fmap abst_Music_Data . concat
--(id -|- fmap abst_Measure . head) . grd null . p2 . p2
--- |
--- abst_Measure :: Measure -> Layer1.Measure
--- abst_Measure = catMaybes . fmap abst_Music_Data
-- |
abst_Music_Data :: Music_Data -> Maybe Layer1.Music_Data
abst_Music_Data (Music_Data_1 x) = Just (Layer1.Music_Data_1 (abst_Note x))
--    x' <- abst_Note x
--    return (Layer1.Music_Data_1 x')
--    Layer1.Music_Data_1 ((catMaybes . (fmap abst_Note)) x)
--abst_Music_Data (Music_Data_2 _) = Nothing
--abst_Music_Data (Music_Data_3 _) = Nothing
--abst_Music_Data (Music_Data_4 _) = Nothing
abst_Music_Data (Music_Data_5 _) = Nothing
--    Just (Layer1.Music_Data_5 (abst_Attributes x))
--abst_Music_Data (Music_Data_6 _) = Nothing
--abst_Music_Data (Music_Data_7 _) = Nothing
--abst_Music_Data (Music_Data_8 _) = Nothing
--abst_Music_Data (Music_Data_9 _) = Nothing
--abst_Music_Data (Music_Data_10 _) = Nothing
--abst_Music_Data (Music_Data_11 _) = Nothing
--abst_Music_Data (Music_Data_12 _) = Nothing
--abst_Music_Data (Music_Data_13 _) = Nothing
-- |
abst_Note :: Note -> Layer1.Note
abst_Note = 
    (\(x1,x4,x5,x6) -> 
        (abst_Note_ x1, fmap abst_Type x4, 
         fmap abst_Dot x5, fmap abst_Accidental x6)) 
-- |
abst_Note_ :: Note_ -> Layer1.Note_
--abst_Note_ (Note_1 _) = Nothing
--    Layer1.Note_1 (abst_Grace x1, abst_Full_Note x2, 
--      fmap (abst_Tie >< fmap abst_Tie) x3)
--abst_Note_ (Note_2 _) = Nothing
--    Layer1.Note_2 (abst_Cue x1, abst_Full_Note x2, abst_Duration x3)
abst_Note_ (Note_3 (x1,_)) = Layer1.Note_3 (abst_Full_Note x1)
--    x1' <- abst_Full_Note x1
--    return (Layer1.Note_3 (x1', abst_Duration x2))
-- |
abst_Full_Note :: Full_Note -> Layer1.Full_Note
abst_Full_Note = abst_Full_Note_ 
--    b' <- abst_Full_Note_ b
--    return (fmap id a, b')
--abst_Full_Note :: Full_Note -> (Maybe Layer1.Chord, Maybe Layer1.Full_Note_)
--abst_Full_Note = (fmap id >< abst_Full_Note_)
--abst_Full_Note (x,y) = do 
--    y' <- abst_Full_Note_ y
--    return (fmap id x >< fmap id y'))
-- (fmap id >< (\x -> do 
--    y <- abst_Full_Note_ x
--    ))
-- |
abst_Full_Note_ :: Full_Note_ -> Layer1.Full_Note_
abst_Full_Note_ (Full_Note_1 x) = (Layer1.Full_Note_1 (abst_Pitch x))
--abst_Full_Note_ (Full_Note_2 _) = Nothing 
abst_Full_Note_ (Full_Note_3 x) = (Layer1.Full_Note_3 x)
-- |
abst_Pitch :: Pitch -> Layer1.Pitch
abst_Pitch = id
-- |
abst_Type :: Type -> Layer1.Type
abst_Type = id
-- |
abst_Dot :: Dot -> Layer1.Dot
abst_Dot = id
-- |
abst_Accidental :: Accidental -> Layer1.Accidental
abst_Accidental = id
\end{code} \begin{code}
-- |
split_Measure :: Measure -> ((), [Maybe Layer1.Music_Data])
split_Measure = split (const ()) (fmap (p2 . split_Music_Data))
--catMaybes . fmap abst_Music_Data . concat
--(id -|- fmap abst_Measure . head) . grd null . p2 . p2
--- |
--- abst_Measure :: Measure -> Layer1.Measure
--- abst_Measure = catMaybes . fmap abst_Music_Data
-- |
split_Music_Data :: Music_Data -> (Music_Data, Maybe Layer1.Music_Data)
--Maybe Layer1.Music_Data
split_Music_Data (Music_Data_1 x) = 
    split Music_Data_1 (Just . Layer1.Music_Data_1 . p2 . split_Note) x
--    x' <- abst_Note x
--    return (Layer1.Music_Data_1 x')
--    Layer1.Music_Data_1 ((catMaybes . (fmap abst_Note)) x)
--abst_Music_Data (Music_Data_2 _) = Nothing
--abst_Music_Data (Music_Data_3 _) = Nothing
--abst_Music_Data (Music_Data_4 _) = Nothing
split_Music_Data (Music_Data_5 x) = split Music_Data_5 (const Nothing) x
--    Just (Layer1.Music_Data_5 (abst_Attributes x))
--abst_Music_Data (Music_Data_6 _) = Nothing
--abst_Music_Data (Music_Data_7 _) = Nothing
--abst_Music_Data (Music_Data_8 _) = Nothing
--abst_Music_Data (Music_Data_9 _) = Nothing
--abst_Music_Data (Music_Data_10 _) = Nothing
--abst_Music_Data (Music_Data_11 _) = Nothing
--abst_Music_Data (Music_Data_12 _) = Nothing
--abst_Music_Data (Music_Data_13 _) = Nothing
-- |
split_Note :: Note -> (Note, Layer1.Note)
split_Note = split id (\(a,b,c,d) -> ((Layer1.Note_3 . p2.split_Note_) a, 
    fmap (p2.split_Type) b, fmap (p2.split_Dot) c, fmap (p2.split_Accidental) d))
--    (\(x1,x4,x5,x6) -> 
--        (abst_Note_ x1, fmap abst_Type x4, 
--         fmap abst_Dot x5, fmap abst_Accidental x6)) 
-- |
split_Note_ :: Note_ -> (Duration, Layer1.Full_Note_)
--abst_Note_ (Note_1 _) = Nothing
--    Layer1.Note_1 (abst_Grace x1, abst_Full_Note x2, 
--      fmap (abst_Tie >< fmap abst_Tie) x3)
--abst_Note_ (Note_2 _) = Nothing
--    Layer1.Note_2 (abst_Cue x1, abst_Full_Note x2, abst_Duration x3)
--split_Note_ (Note_3 (x1,x2)) = split (const x2) (Layer1.Note_3 (abst_Full_Note x1))
split_Note_ = split p2 (p2 . split_Full_Note . p1) . (\(Note_3 x) -> x)
--split (const x2) (Layer1.Note_3 (abst_Full_Note x1))
--    x1' <- abst_Full_Note x1
--    return (Layer1.Note_3 (x1', abst_Duration x2))
-- |
split_Full_Note :: Full_Note -> (Full_Note, Layer1.Full_Note)
split_Full_Note = split_Full_Note_ 
--    b' <- abst_Full_Note_ b
--    return (fmap id a, b')
--abst_Full_Note :: Full_Note -> (Maybe Layer1.Chord, Maybe Layer1.Full_Note_)
--abst_Full_Note = (fmap id >< abst_Full_Note_)
--abst_Full_Note (x,y) = do 
--    y' <- abst_Full_Note_ y
--    return (fmap id x >< fmap id y'))
-- (fmap id >< (\x -> do 
--    y <- abst_Full_Note_ x
--    ))
-- |
split_Full_Note_ :: Full_Note_ -> (Full_Note_, Layer1.Full_Note_)
split_Full_Note_ (Full_Note_1 x) = 
    ((id >< Layer1.Full_Note_1) . split Full_Note_1 (p2.split_Pitch)) x
--(Layer1.Full_Note_1 (split_Pitch x))
--abst_Full_Note_ (Full_Note_2 _) = Nothing 
split_Full_Note_ (Full_Note_3 x) = split Full_Note_3 (Layer1.Full_Note_3) x
--(Layer1.Full_Note_3 x)
-- |
split_Pitch :: Pitch -> (Pitch, Layer1.Pitch)
split_Pitch = split id id
-- |
split_Type :: Type -> (Type, Layer1.Type)
split_Type = split id id
-- |
split_Dot :: Dot -> (Dot, Layer1.Dot)
split_Dot = split id (const ())
-- |
split_Accidental :: Accidental -> (Accidental, Layer1.Accidental)
split_Accidental = split id id
\end{code}