\begin{code}
module Music.Analysis.MusicXML.Level3 (
module Music.Analysis.MusicXML.Level3,
)where
import Music.Analysis.Base (IntegerNumber)
import Music.Analysis.PF
import qualified Music.Analysis.MusicXML.Level1 as Layer1
import qualified Music.Analysis.MusicXML.Level2 as Layer2
import qualified Music.Analysis.MusicXML.Level2Num as Layer2Num
import qualified Music.Analysis.MusicXML.Level3Num as Layer3Num
import Data.Maybe
import qualified Text.XML.MusicXML as MusicXML
\end{code}
\begin{code}
type Score_Partwise =
(MusicXML.Document_Attributes, (MusicXML.Score_Header, [Part]))
type Part = [Measure]
type Measure = [Music_Data]
data Music_Data =
Music_Data_1 Note
| Music_Data_2 MusicXML.Backup
| Music_Data_3 MusicXML.Forward
| Music_Data_5 Attributes
| Music_Data_10 Barline
deriving (Eq, Show)
type Barline = MusicXML.Barline
type Note =
(Note_, Maybe Instrument, Editorial_Voice,
Maybe Type, [Dot], Maybe Accidental,
Maybe Staff)
data Note_ =
Note_3 (Full_Note, Duration)
deriving (Eq, Show)
type Full_Note = (Maybe MusicXML.Chord, Full_Note_)
data Full_Note_ = Full_Note_1 Layer2.Pitch
| Full_Note_3 Rest
deriving (Eq, Show)
type Rest = ()
type Duration = IntegerNumber
type Editorial_Voice = MusicXML.Editorial_Voice
type Instrument = MusicXML.Instrument
type Type = Layer1.Type_
type Dot = MusicXML.Dot
type Accidental = Layer1.Accidental_
type Staff = IntegerNumber
type Attributes = (Maybe Divisions, [Key], [Time],
Maybe Staves, Maybe Instruments,
[Clef], Maybe Transpose)
type Editorial = MusicXML.Editorial
type Divisions = IntegerNumber
type Key = (Key_, [Layer2.Key_Octave])
data Key_ = Key_1 (Maybe MusicXML.Cancel, Layer2.Fifths, Maybe Layer2.Mode)
| Key_2 [(Layer2.Key_Step, Layer2.Key_Alter)]
deriving (Eq, Show)
type Time = Time_B
data Time_B = Time_5 [(Beats, Beat_Type)]
| Time_6 MusicXML.Senza_Misura
deriving (Eq, Show)
type Beats = (IntegerNumber, Maybe IntegerNumber)
type Beat_Type = IntegerNumber
type Staves = MusicXML.Staves
type Part_Symbol = MusicXML.Part_Symbol
type Instruments = MusicXML.Instruments
type Clef = Layer2.Clef
type Staff_Details = MusicXML.Staff_Details
type Transpose = MusicXML.Transpose
type Directive = MusicXML.Directive
type Measure_Style = MusicXML.Measure_Style
\end{code}
\begin{code}
abst_Score_Partwise :: Score_Partwise -> Layer2.Score_Partwise
abst_Score_Partwise =
(either (const []) (fmap abst_Measure . head) . grd null) .
p2 . p2
abst_Measure :: Measure -> Layer2.Measure
abst_Measure = catMaybes . fmap abst_Music_Data
abst_Music_Data :: Music_Data -> Maybe Layer2.Music_Data
abst_Music_Data (Music_Data_1 x) = Just (Layer2.Music_Data_1 (abst_Note x))
abst_Music_Data (Music_Data_2 _) = Nothing
abst_Music_Data (Music_Data_3 _) = Nothing
abst_Music_Data (Music_Data_5 x) =
Just (Layer2.Music_Data_5 (abst_Attributes x))
abst_Music_Data (Music_Data_10 _) = Nothing
abst_Note :: Note -> Layer2.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_ -> Layer2.Note_
abst_Note_ (Note_3 (x1,x2)) =
Layer2.Note_3 (abst_Full_Note x1, abst_Duration x2)
abst_Full_Note :: Full_Note -> Layer2.Full_Note
abst_Full_Note = abst_Full_Note_ . p2
abst_Full_Note_ :: Full_Note_ -> Layer2.Full_Note_
abst_Full_Note_ (Full_Note_1 x) = (Layer2.Full_Note_1 x)
abst_Full_Note_ (Full_Note_3 _) = (Layer2.Full_Note_3 ())
abst_Duration :: Duration -> Layer2.Duration
abst_Duration = id
abst_Type :: Type -> Layer2.Type
abst_Type = id
abst_Dot :: Dot -> Layer2.Dot
abst_Dot = const ()
abst_Accidental :: Accidental -> Layer2.Accidental
abst_Accidental = id
abst_Divisions :: Divisions -> Layer2.Divisions
abst_Divisions = id
abst_Attributes :: Attributes -> Layer2.Attributes
abst_Attributes (x2,x3,x4,_,_,x8,_) =
(fmap abst_Divisions x2, fmap abst_Key x3,
fmap abst_Time x4, fmap abst_Clef x8)
abst_Key :: Key -> Layer2.Key
abst_Key = (abst_Key_ >< fmap id)
abst_Key_ :: Key_ -> Layer2.Key_
abst_Key_ (Key_1 x) = (Layer2.Key_1 . p2 . unflatr) x
abst_Key_ (Key_2 x) = Layer2.Key_2 x
abst_Time :: Time -> Layer2.Time
abst_Time (Time_5 l) = Layer2.Time_5 l
abst_Time (Time_6 _) = Layer2.Time_5 []
abst_Clef :: Clef -> Layer2.Clef
abst_Clef = id
\end{code}
\begin{code}
map_Score_Partwise :: (Music_Data -> b) -> Score_Partwise ->
(MusicXML.Document_Attributes, (MusicXML.Score_Header, [[[b]]]))
map_Score_Partwise f = (id >< (id >< fmap (map_Part f)))
map_Part :: (Music_Data -> b) -> Part -> [[b]]
map_Part f = fmap (map_Measure f)
map_Measure :: (Music_Data -> b) -> Measure -> [b]
map_Measure f = fmap (map_Music_Data f)
map_Music_Data :: (Music_Data -> b) -> Music_Data -> b
map_Music_Data f = f
toNum_Music_Data :: Music_Data -> Layer3Num.Music_Data
toNum_Music_Data (Music_Data_1 x) = Layer3Num.Music_Data_1 (toNum_Note x)
toNum_Music_Data (Music_Data_2 x) = Layer3Num.Music_Data_2 x
toNum_Music_Data (Music_Data_3 x) = Layer3Num.Music_Data_3 x
toNum_Music_Data (Music_Data_5 x) =
Layer3Num.Music_Data_5 (toNum_Attributes x)
toNum_Music_Data (Music_Data_10 x) = Layer3Num.Music_Data_10 x
toNum_Note :: Note -> Layer3Num.Note
toNum_Note ((Note_3 (a1,a2)),b,c,d,e,f,g) =
((Layer3Num.Note_3 (toNum_Full_Note a1, a2)),b,c,
fmap fromEnum d,e,fmap fromEnum f,g)
toNum_Full_Note :: Full_Note -> Layer3Num.Full_Note
toNum_Full_Note (a,Full_Note_1 (b1, b2, b3)) =
(a, Layer3Num.Full_Note_1 ((fromEnum b1)+(b3*7), b2))
toNum_Full_Note (a,Full_Note_3 b) = (a, Layer3Num.Full_Note_3 b)
toNum_Attributes :: Attributes -> Layer3Num.Attributes
toNum_Attributes (a,b,c,d,e,f,g) =
(a,fmap toNum_Key b,fmap toNum_Time c,d,e,fmap toNum_Clef f,g)
toNum_Key :: Key -> Layer3Num.Key
toNum_Key (Key_1 (a1,a2,a3),b) =
(Layer3Num.Key_1 (a1,a2,fmap toNum_Mode a3),b)
toNum_Key (Key_2 a,b) =
(Layer3Num.Key_2 (fmap (\(x,y) -> (fromEnum x,y)) a),b)
toNum_Mode :: Layer2.Mode -> Layer2Num.Mode
toNum_Mode Layer2.Major = Layer2Num.Major
toNum_Mode Layer2.Minor = Layer2Num.Minor
toNum_Mode Layer2.Dorian = Layer2Num.Dorian
toNum_Mode Layer2.Phrygian = Layer2Num.Phrygian
toNum_Mode Layer2.Lydian = Layer2Num.Lydian
toNum_Mode Layer2.Mixolydian = Layer2Num.Mixolydian
toNum_Mode Layer2.Aeolian = Layer2Num.Aeolian
toNum_Mode Layer2.Ionian = Layer2Num.Ionian
toNum_Mode Layer2.Locrian = Layer2Num.Locrian
toNum_Time :: Time -> Layer3Num.Time
toNum_Time (Time_5 a) = Layer3Num.Time_5 a
toNum_Time (Time_6 a) = Layer3Num.Time_6 a
toNum_Clef :: Clef -> Layer2Num.Clef
toNum_Clef (a,b,c) = (fromEnum a, b, c)
\end{code}