\begin{code}
module Music.Analysis.MusicXML.Level6 (
    module Music.Analysis.MusicXML.Level6,
    )where
import Music.Analysis.PF 
import qualified Music.Analysis.MusicXML.Level5 as Layer5
import Data.Maybe (catMaybes)
import qualified Text.XML.MusicXML as MusicXML
\end{code} \begin{code}
-- |
type Score_Partwise = 
    (MusicXML.Document_Attributes, (MusicXML.Score_Header, [Part]))
-- |
type Part = (MusicXML.ID, [Measure])
-- | 
type Measure = ((MusicXML.CDATA, Maybe MusicXML.Yes_No, 
    Maybe MusicXML.Yes_No, Maybe MusicXML.Tenths), [Music_Data])
-- |
data Music_Data =   
      Music_Data_1 Note 
    | Music_Data_2 MusicXML.Backup 
    | Music_Data_3 MusicXML.Forward 
    | Music_Data_4 MusicXML.Direction 
    | Music_Data_5 Attributes 
    | Music_Data_6 MusicXML.Harmony
    | Music_Data_7 MusicXML.Figured_Bass
    | Music_Data_8 MusicXML.Print
    | Music_Data_9 MusicXML.Sound
    | Music_Data_10 MusicXML.Barline
    | Music_Data_11 MusicXML.Grouping
    | Music_Data_12 MusicXML.Link
    | Music_Data_13 MusicXML.Bookmark
    | Music_Data_14 Annotation
      deriving (Eq, Show)
-- |
type Annotation = (Maybe MusicXML.Start_Stop, MusicXML.PCDATA)
-- |
type Note = Layer5.Note
-- |
type Attributes = Layer5.Attributes
\end{code} \begin{code}
-- |
abst_Score_Partwise :: Score_Partwise -> Layer5.Score_Partwise
abst_Score_Partwise = (id >< (id >< map abst_Part))
-- |
abst_Part :: Part -> Layer5.Part
abst_Part = id >< map abst_Measure
-- |
abst_Measure :: Measure -> Layer5.Measure
abst_Measure = id >< catMaybes . fmap abst_Music_Data 
-- |
abst_Music_Data :: Music_Data -> Maybe Layer5.Music_Data
abst_Music_Data (Music_Data_1 x) = return (Layer5.Music_Data_1 (abst_Note x))
abst_Music_Data (Music_Data_2 x) = return (Layer5.Music_Data_2 x)
abst_Music_Data (Music_Data_3 x) = return (Layer5.Music_Data_3 x)
abst_Music_Data (Music_Data_4 x) = return (Layer5.Music_Data_4 x)
abst_Music_Data (Music_Data_5 x) = (Just .Layer5.Music_Data_5 .abst_Attributes) x
abst_Music_Data (Music_Data_6 x) = return (Layer5.Music_Data_6 x)
abst_Music_Data (Music_Data_7 x) = return (Layer5.Music_Data_7 x)
abst_Music_Data (Music_Data_8 x) = return (Layer5.Music_Data_8 x)
abst_Music_Data (Music_Data_9 x) = return (Layer5.Music_Data_9 x)
abst_Music_Data (Music_Data_10 x) = return (Layer5.Music_Data_10 x)
abst_Music_Data (Music_Data_11 x) = return (Layer5.Music_Data_11 x)
abst_Music_Data (Music_Data_12 x) = return (Layer5.Music_Data_12 x)
abst_Music_Data (Music_Data_13 x) = return (Layer5.Music_Data_13 x)
abst_Music_Data (Music_Data_14 x) = 
    return (Layer5.Music_Data_11 (abst_Annotation x))
-- |
abst_Note :: Note -> Layer5.Note
abst_Note = id
-- |
abst_Attributes :: Attributes -> Layer5.Attributes
abst_Attributes = id
-- |
abst_Annotation :: Annotation -> MusicXML.Grouping
abst_Annotation (a,ann) = 
    ((abst_SSS a, "1", Just "annotation"), [(Nothing, ann)])
-- |
abst_SSS :: Maybe MusicXML.Start_Stop -> MusicXML.Start_Stop_Single
abst_SSS (Just MusicXML.Start_Stop_1) = MusicXML.Start_Stop_Single_1
abst_SSS (Just MusicXML.Start_Stop_2) = MusicXML.Start_Stop_Single_2
abst_SSS Nothing = MusicXML.Start_Stop_Single_3 
\end{code} \begin{code}
-- |
rep_Score_Partwise :: Layer5.Score_Partwise -> Score_Partwise
rep_Score_Partwise = (id >< (id >< fmap rep_Part))
-- |
rep_Part :: Layer5.Part -> Part
rep_Part = id >< fmap rep_Measure
-- |
rep_Measure :: Layer5.Measure -> Measure
rep_Measure = id >< map rep_Music_Data
-- |
rep_Music_Data :: Layer5.Music_Data -> Music_Data
rep_Music_Data (Layer5.Music_Data_1 x) = Music_Data_1 (rep_Note x)
rep_Music_Data (Layer5.Music_Data_2 x) = Music_Data_2 x
rep_Music_Data (Layer5.Music_Data_3 x) = Music_Data_3 x
rep_Music_Data (Layer5.Music_Data_4 x) = Music_Data_4 x
rep_Music_Data (Layer5.Music_Data_5 x) = Music_Data_5 (rep_Attributes x)
rep_Music_Data (Layer5.Music_Data_6 x) = Music_Data_6 x
rep_Music_Data (Layer5.Music_Data_7 x) = Music_Data_7 x
rep_Music_Data (Layer5.Music_Data_8 x) = Music_Data_8 x
rep_Music_Data (Layer5.Music_Data_9 x) = Music_Data_9 x
rep_Music_Data (Layer5.Music_Data_10 x) = Music_Data_10 x
rep_Music_Data (Layer5.Music_Data_11 x) = 
    either Music_Data_14 Music_Data_11 (rep_Annotation x)
rep_Music_Data (Layer5.Music_Data_12 x) = Music_Data_12 x
rep_Music_Data (Layer5.Music_Data_13 x) = Music_Data_13 x
-- |
rep_Note :: Layer5.Note -> Note
rep_Note = id
-- |
rep_Attributes :: Layer5.Attributes -> Attributes
rep_Attributes = id
-- |
rep_Annotation :: MusicXML.Grouping -> Either Annotation MusicXML.Grouping
rep_Annotation ((a,_,Just "annotation"),[(_,ann)]) = i1 (rep_SSS a, ann)
rep_Annotation grouping = i2 grouping
-- |
rep_SSS :: MusicXML.Start_Stop_Single -> Maybe MusicXML.Start_Stop
rep_SSS MusicXML.Start_Stop_Single_1 = Just MusicXML.Start_Stop_1
rep_SSS MusicXML.Start_Stop_Single_2 = Just MusicXML.Start_Stop_2
rep_SSS MusicXML.Start_Stop_Single_3 = Nothing

\end{code} \begin{code}
-- |
map_Score_Partwise :: (Music_Data -> Music_Data) -> 
    Score_Partwise -> Score_Partwise 
map_Score_Partwise f = (id >< (id >< fmap (map_Part f)))
-- |
map_Part :: (Music_Data -> Music_Data) -> Part -> Part
map_Part f = (id >< fmap (map_Measure f))
-- |
map_Measure :: (Music_Data -> Music_Data) -> Measure -> Measure
map_Measure f = (id >< fmap (map_Music_Data f))
-- |
map_Music_Data :: (Music_Data -> Music_Data) -> 
    Music_Data -> Music_Data
map_Music_Data f = f
--map_Music_Data (Music_Data_1 x) =  Music_Data_1 x
--map_Music_Data (Music_Data_2 x) =  Music_Data_2 x
--map_Music_Data (Music_Data_3 x) =  Music_Data_3 x
--map_Music_Data (Music_Data_4 x) =  Music_Data_4 x
--map_Music_Data (Music_Data_5 x) =  Music_Data_5 x
--map_Music_Data (Music_Data_6 x) =  Music_Data_6 x
--map_Music_Data (Music_Data_7 x) =  Music_Data_7 x
--map_Music_Data (Music_Data_8 x) =  Music_Data_8 x
--map_Music_Data (Music_Data_9 x) =  Music_Data_9 x
--map_Music_Data (Music_Data_10 x) = Music_Data_10 x
--map_Music_Data (Music_Data_11 x) = Music_Data_11 x
--map_Music_Data (Music_Data_12 x) = Music_Data_12 x
--map_Music_Data (Music_Data_13 x) = Music_Data_13 x

--map_Score_Partwise :: (Layer4.Score_Partwise -> Layer4.Score_Partwise) -> 
--    Score_Partwise -> Score_Partwise
--map_Score_Partwise f = (id >< (id >< f))
--map_Part :: (Layer4.Part -> Layer4.Part) -> Part -> Part
--map_Part f = split p1 (f . abst_Part)
--( >< f)
--map_Measure :: (Layer4.Measure -> Layer4.Measure) -> Measure -> Measure
--map_Measure f = (id >< f )
\end{code}