\begin{code}
-- | 
-- Maintainer : silva.samuel@alumni.uminho.pt
-- Stability  : experimental
-- Portability: portable
-- This module implements common types
module Music.Analysis.MusicXML2Abstract where
import Music.Analysis.Abstract.Settings
import Music.Analysis.Abstract.Motive 
--import Music.Analysis.Abstract.Melodic 
--import Music.Analysis.Abstract.Rhythm 
--import Text.XML.MusicXML.Partwise as Partwise
import Music.Analysis.MusicXML.Level2 as Level2
import Music.Analysis.MusicXML.Level1 as Level1
import Music.Analysis.Abstract.Melodic as Melodic
import Music.Analysis.Abstract.Rhythm as Rhythm
--import Music.Analysis.Abstract.Zip as Abstract
import Data.Ratio
\end{code} \begin{code}
mk_Music :: Level2.Score_Partwise -> 
    Motive (Melodic.MelodicClass, Rhythm.RhythmAbsolute)
--    [(Melodic.MelodicClass, Rhythm.RhythmAbsolute)]
mk_Music = mkMotive empty . concat . map mk_MusicData

mk_MusicData :: [Level2.Music_Data] ->     
    [(Melodic.MelodicClass, Rhythm.RhythmAbsolute)]
mk_MusicData = map mk_Note . map (\(Level2.Music_Data_1 x) -> x) . filter p 
    where p (Level2.Music_Data_1 _) = True
          p _ = False
-- |
mk_Note :: Level2.Note -> (Melodic.MelodicClass, Rhythm.RhythmAbsolute)
mk_Note (Level2.Note_3 (a1, a2), b, c, d) = 
    (mk_MelodicNode a1 d, mk_RhythmNode a2 b c)
-- |
mk_MelodicNode :: Level2.Full_Note -> Maybe Level2.Accidental 
    -> Melodic.MelodicClass
mk_MelodicNode (Level2.Full_Note_1 (a, _, _)) _ = Just (mk_Pitch a,Nothing)
mk_MelodicNode (Level2.Full_Note_3 _ ) _ = Nothing
-- |
mk_Pitch :: Level1.Step -> Melodic.PitchClass
mk_Pitch x = case x of
    Level1.C -> Melodic.C; Level1.D -> Melodic.D; 
    Level1.E -> Melodic.E; Level1.F -> Melodic.F; 
    Level1.G -> Melodic.G; Level1.A -> Melodic.A; 
    Level1.B -> Melodic.B; 
-- |
mk_RhythmNode :: Level2.Duration -> Maybe Level2.Type -> [Level2.Dot] 
    -> Rhythm.RhythmAbsolute
mk_RhythmNode x _ ly = (x % 1, length ly)
\end{code}