\begin{code}
-- | 
-- Maintainer : silva.samuel@alumni.uminho.pt
-- Stability  : experimental
-- Portability: portable
-- This module implements functions on MusicXML format
module Music.Analysis.MusicXML.Functions  where
import Music.Analysis.PF
import qualified Text.XML.MusicXML as MusicXML
\end{code} \begin{nocode} length_Part :: MusicXML.MusicXMLDoc -> Int length_Part (MusicXML.Score (MusicXML.Partwise x)) = (length . p2 . p2) x length_Part (MusicXML.Score (MusicXML.Timewise x)) = (maximum . fmap (length.p2) . p2 . p2) x length_Part _ = 0 length_Measure :: MusicXML.MusicXMLDoc -> Int length_Measure (MusicXML.Score (MusicXML.Partwise x)) = (maximum . fmap (length.p2) . p2 . p2) x length_Measure (MusicXML.Score (MusicXML.Timewise x)) = (length . p2 . p2) x length_Measure _ = 0 length_Part_map :: MusicXML.MusicXMLDoc -> [Int] length_Part_map (MusicXML.Score (MusicXML.Partwise x)) = ((:[]) . length . p2 . p2) x length_Part_map (MusicXML.Score (MusicXML.Timewise x)) = (fmap (length . p2) . p2 . p2) x length_Part_map _ = [] length_Measure_map :: MusicXML.MusicXMLDoc -> [Int] length_Measure_map (MusicXML.Score (MusicXML.Partwise x)) = (fmap (length . p2) . p2 . p2) x length_Measure_map (MusicXML.Score (MusicXML.Timewise x)) = ((:[]) . length . p2 . p2) x length_Measure_map _ = [] length_Part_concat :: MusicXML.MusicXMLDoc -> Int length_Part_concat (MusicXML.Score (MusicXML.Partwise x)) = (length . p2 . p2) x length_Part_concat (MusicXML.Score (MusicXML.Timewise x)) = (sum . fmap length . fmap p2 . p2 . p2) x length_Part_concat _ = 0 length_Measure_concat :: MusicXML.MusicXMLDoc -> Int length_Measure_concat (MusicXML.Score (MusicXML.Partwise x)) = (sum . fmap length . fmap p2 . p2 . p2) x length_Measure_concat (MusicXML.Score (MusicXML.Timewise x)) = (length . p2 . p2) x length_Measure_concat _ = 0 \end{nocode} \begin{code}
-- |
isNote :: MusicXML.Music_Data_ -> Bool
isNote (MusicXML.Music_Data_1 _) = True
isNote _                         = False
-- |
isGraceNote :: MusicXML.Note -> Bool
isGraceNote (_,(MusicXML.Note_1 _,_,_,_,_,_,_,_,_,_,_,_,_)) = True
isGraceNote _ = False
-- |
isCueNote :: MusicXML.Note -> Bool
isCueNote (_,(MusicXML.Note_2 _,_,_,_,_,_,_,_,_,_,_,_,_)) = True
isCueNote _ = False
-- |
isNormalNote :: MusicXML.Note -> Bool
isNormalNote (_,(MusicXML.Note_3 _,_,_,_,_,_,_,_,_,_,_,_,_)) = True
isNormalNote _ = False
\end{code} \begin{code}
-- |
filterNote :: MusicXML.Music_Data -> MusicXML.Music_Data
filterNote = filter isNote
-- |
filterNotNote :: MusicXML.Music_Data -> MusicXML.Music_Data
filterNotNote = filter (not . isNote)

-- |
filterGraceNote :: MusicXML.Music_Data -> MusicXML.Music_Data
filterGraceNote = 
    filter (\x -> if isNote x 
                  then (isGraceNote . (\(MusicXML.Music_Data_1 y) -> y)) x 
                  else True)

-- |
filterNotGraceNote :: MusicXML.Music_Data -> MusicXML.Music_Data
filterNotGraceNote = 
    filter (\x -> if isNote x 
                  then (not . isGraceNote . (\(MusicXML.Music_Data_1 y) -> y)) x 
                  else True)


-- |
filterCueNote :: MusicXML.Music_Data -> MusicXML.Music_Data
filterCueNote = 
    filter (\x -> if isNote x 
                  then (isCueNote . (\(MusicXML.Music_Data_1 y) -> y)) x 
                  else True)

-- |
filterNotCueNote :: MusicXML.Music_Data -> MusicXML.Music_Data
filterNotCueNote = 
    filter (\x -> if isNote x 
                  then (not . isCueNote . (\(MusicXML.Music_Data_1 y) -> y)) x 
                  else True)


-- |
filterNormalNote :: MusicXML.Music_Data -> MusicXML.Music_Data
filterNormalNote = 
    filter (\x -> if isNote x 
                  then (isNormalNote . (\(MusicXML.Music_Data_1 y) -> y)) x 
                  else True)

-- |
filterNotNormalNote :: MusicXML.Music_Data -> MusicXML.Music_Data
filterNotNormalNote = 
    filter (\x -> if isNote x 
                  then (not . isNormalNote . (\(MusicXML.Music_Data_1 y) -> y)) x 
                  else True)

\end{code} \begin{code}
-- |
filterNote' :: (MusicXML.Note -> Bool) -> 
    MusicXML.Music_Data -> MusicXML.Music_Data
filterNote' p  =
    filter (\x -> if isNote x 
                  then (p . (\(MusicXML.Music_Data_1 y) -> y)) x 
                  else False)
-- |
count_part :: MusicXML.MusicXMLDoc -> Int
count_part (MusicXML.Score (MusicXML.Partwise x)) = 
    (length . p2 . p2) x
count_part (MusicXML.Score (MusicXML.Timewise x)) = 
    (sum . fmap length . fmap p2 . p2 . p2) x
count_part _                     = 0
-- |
count_measure :: MusicXML.MusicXMLDoc -> Int
count_measure (MusicXML.Score (MusicXML.Partwise x)) = 
    (sum . fmap length . fmap p2 . p2 . p2) x
count_measure (MusicXML.Score (MusicXML.Timewise x)) = 
    (length . p2 . p2) x
count_measure _                     = 0
-- |
count_music_data :: MusicXML.MusicXMLDoc -> Int
count_music_data (MusicXML.Score (MusicXML.Partwise x)) = 
    (sum . fmap sum . (fmap . fmap) (length . p2) . fmap p2 . p2 . p2) x
count_music_data (MusicXML.Score (MusicXML.Timewise x)) = 
    (sum . fmap sum . (fmap . fmap) (length . p2) . fmap p2 . p2 . p2) x
count_music_data _                     = 0
-- |
count_note :: MusicXML.MusicXMLDoc -> Int
count_note (MusicXML.Score (MusicXML.Partwise x)) = 
    (sum . fmap sum . (fmap.fmap) (length.filterNote.p2) . fmap p2 . p2 . p2) x
count_note (MusicXML.Score (MusicXML.Timewise x)) = 
    (sum . fmap sum . (fmap.fmap) (length.filterNote.p2) . fmap p2 . p2 . p2) x
count_note _                     = 0
-- |
count_note_grace :: MusicXML.MusicXMLDoc -> Int
count_note_grace (MusicXML.Score (MusicXML.Partwise x)) = 
    (sum . fmap sum . (fmap.fmap) (length.filterNote' isGraceNote.p2) . 
        fmap p2 . p2 . p2) x
count_note_grace (MusicXML.Score (MusicXML.Timewise x)) = 
    (sum . fmap sum . (fmap.fmap) (length.filterNote' isGraceNote.p2) . 
        fmap p2 . p2 . p2) x
count_note_grace _                     = 0
-- |
count_note_cue :: MusicXML.MusicXMLDoc -> Int
count_note_cue (MusicXML.Score (MusicXML.Partwise x)) = 
    (sum . fmap sum . (fmap.fmap) (length.filterNote' isCueNote.p2) . 
        fmap p2 . p2 . p2) x
count_note_cue (MusicXML.Score (MusicXML.Timewise x)) = 
    (sum . fmap sum . (fmap.fmap) (length.filterNote' isCueNote.p2) . 
        fmap p2 . p2 . p2) x
count_note_cue _                     = 0
-- |
count_note_normal :: MusicXML.MusicXMLDoc -> Int
count_note_normal (MusicXML.Score (MusicXML.Partwise x)) = 
    (sum . fmap sum . (fmap.fmap) (length.filterNote' isNormalNote.p2) . 
        fmap p2 . p2 . p2) x
count_note_normal (MusicXML.Score (MusicXML.Timewise x)) = 
    (sum . fmap sum . (fmap.fmap) (length.filterNote' isNormalNote.p2) . 
        fmap p2 . p2 . p2) x
count_note_normal _                     = 0
\end{code} \begin{code}
-- |
mapMusicXML :: (MusicXML.Music_Data -> MusicXML.Music_Data) -> 
    MusicXML.MusicXMLDoc -> MusicXML.MusicXMLDoc
mapMusicXML f (MusicXML.Score (MusicXML.Partwise x)) = 
    (MusicXML.Score . MusicXML.Partwise . 
        (id >< (id >< fmap (id >< fmap (id >< f))))) x
mapMusicXML f (MusicXML.Score (MusicXML.Timewise x)) = 
    (MusicXML.Score . MusicXML.Timewise . 
        (id >< (id >< fmap (id >< fmap (id >< f))))) x
mapMusicXML _ x = x

\end{code}