\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}