\begin{code}
module Music.Analysis.MusicXML.Level3Num (
module Music.Analysis.MusicXML.Level3Num,
)where
import Music.Analysis.Base
import Music.Analysis.PF
import qualified Music.Analysis.MusicXML.Level1Num as Layer1Num
import qualified Music.Analysis.MusicXML.Level2Num as Layer2Num
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 Layer2Num.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 = Layer1Num.Type_
type Dot = MusicXML.Dot
type Accidental = Layer1Num.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_, [IntegerNumber])
data Key_ = Key_1 (Maybe MusicXML.Cancel, Layer2Num.Fifths, Maybe Layer2Num.Mode)
| Key_2 [(IntegerNumber, Number)]
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 = Layer2Num.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 -> Layer2Num.Score_Partwise
abst_Score_Partwise =
(either (const []) (fmap abst_Measure . head) . grd null) .
p2 . p2
abst_Measure :: Measure -> Layer2Num.Measure
abst_Measure = catMaybes . fmap abst_Music_Data
abst_Music_Data :: Music_Data -> Maybe Layer2Num.Music_Data
abst_Music_Data (Music_Data_1 x) = Just (Layer2Num.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 (Layer2Num.Music_Data_5 (abst_Attributes x))
abst_Music_Data (Music_Data_10 _) = Nothing
abst_Note :: Note -> Layer2Num.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_ -> Layer2Num.Note_
abst_Note_ (Note_3 (x1,x2)) =
Layer2Num.Note_3 (abst_Full_Note x1, abst_Duration x2)
abst_Full_Note :: Full_Note -> Layer2Num.Full_Note
abst_Full_Note = abst_Full_Note_ . p2
abst_Full_Note_ :: Full_Note_ -> Layer2Num.Full_Note_
abst_Full_Note_ (Full_Note_1 x) = (Layer2Num.Full_Note_1 x)
abst_Full_Note_ (Full_Note_3 _) = (Layer2Num.Full_Note_3 ())
abst_Duration :: Duration -> Layer2Num.Duration
abst_Duration = id
abst_Type :: Type -> Layer2Num.Type
abst_Type = id
abst_Dot :: Dot -> Layer2Num.Dot
abst_Dot = const ()
abst_Accidental :: Accidental -> Layer2Num.Accidental
abst_Accidental = id
abst_Divisions :: Divisions -> Layer2Num.Divisions
abst_Divisions = id
abst_Attributes :: Attributes -> Layer2Num.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 -> Layer2Num.Key
abst_Key = (abst_Key_ >< fmap id)
abst_Key_ :: Key_ -> Layer2Num.Key_
abst_Key_ (Key_1 x) = (Layer2Num.Key_1 . p2 . unflatr) x
abst_Key_ (Key_2 x) = Layer2Num.Key_2 x
abst_Time :: Time -> Layer2Num.Time
abst_Time (Time_5 l) = Layer2Num.Time_5 l
abst_Time (Time_6 _) = Layer2Num.Time_5 []
abst_Clef :: Clef -> Layer2Num.Clef
abst_Clef = id
\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 = fmap (map_Measure f)
map_Measure :: (Music_Data -> Music_Data) -> Measure -> Measure
map_Measure f = fmap (map_Music_Data f)
map_Music_Data :: (Music_Data -> Music_Data) -> Music_Data -> Music_Data
map_Music_Data f = f
\end{code}
\begin{nocode}
-- |
type Music = [Part]
-- |
type Part = (PartName, [Measure])
-- |
type PartName = Text
-- |
type Measure = [Either Attributes Note]
-- |
type Attributes = (Maybe Divisions, [Key], [Time], [Clef])
-- |
type Note = ((Maybe Chord, Maybe Instrument, Maybe Staff, Maybe Voice),
((Either Pitch Rest, Accidental), ((Duration, Maybe Type), Dots)))
-- |
type Chord = ()
-- |
type Instrument = Text
-- |
type Staff = Text
-- |
type Voice = Text
\end{nocode}
\begin{nocode}
rep :: Layer2Num.Music -> Music
rep = (:[]) .
split (const "noPartName")
((map . map) (rep_Settings -||- rep_Note)) where
rep_Settings :: Layer2Num.Settings -> Settings
rep_Settings = flatl .
(( e2m . (id -|- (rep_ClefSign >< id)) . m2e ><
e2m . (id -|- (id >< rep_KeyMode)) . m2e) >< id) .
unflatl
rep_Note :: Layer2Num.Note -> Note
rep_Note = split (const (Nothing, Nothing, Nothing))
((rep_Pitch -|- id) >< (rep_Type >< id))
rep_Pitch :: Layer2Num.Pitch -> Pitch
rep_Pitch = flatl .
((rep_Step >< e2m . (id -|- rep_Accidental) . m2e) >< id) .
unflatl
rep_Step :: Layer2Num.Step -> Step
rep_Step Layer2Num.A = A
rep_Step Layer2Num.B = B
rep_Step Layer2Num.C = C
rep_Step Layer2Num.D = D
rep_Step Layer2Num.E = E
rep_Step Layer2Num.F = F
rep_Step Layer2Num.G = G
rep_Type :: Layer2Num.Type -> Type
rep_Type Layer2Num.Whole = Whole
rep_Type Layer2Num.Half = Half
rep_Type Layer2Num.Quarter = Quarter
rep_Type Layer2Num.Eighth = Eighth
rep_Type Layer2Num.Th16 = Th16
rep_Type Layer2Num.Th32 = Th32
rep_Type Layer2Num.Th64 = Th64
-- ||
rep_Accidental :: Layer2Num.Accidental -> Accidental
rep_Accidental Layer2Num.DoubleFlat = DoubleFlat
rep_Accidental Layer2Num.Flat = Flat
rep_Accidental Layer2Num.Natural = Natural
rep_Accidental Layer2Num.Sharp = Sharp
rep_Accidental Layer2Num.DoubleSharp = DoubleSharp
-- ||
rep_ClefSign :: Layer2Num.ClefSign -> ClefSign
rep_ClefSign Layer2Num.SignC = SignC
rep_ClefSign Layer2Num.SignF = SignF
rep_ClefSign Layer2Num.SignG = SignG
-- ||
rep_KeyMode :: Layer2Num.KeyMode -> KeyMode
rep_KeyMode Layer2Num.Major = Major
rep_KeyMode Layer2Num.Minor = Minor
\end{nocode}
\begin{nocode}
abst :: Music -> Layer2Num.Music
abst = cond null (const [])
((map . map) (abst_Settings -|- abst_Note) . p2 . head) where
abst_Settings :: Settings -> Layer2Num.Settings
abst_Settings = flatl .
(( e2m . (id -|- (abst_ClefSign >< id)) . m2e ><
e2m . (id -|- (id >< abst_KeyMode)) . m2e) >< id) .
unflatl
abst_Note :: Note -> Layer2Num.Note
abst_Note = ((abst_Pitch -|- id) >< (abst_Type >< id)) . p2
abst_Pitch :: Pitch -> Layer2Num.Pitch
abst_Pitch = (flatl .
((abst_Step >< e2m . (id -||- abst_Accidental) . m2e) >< id) .
unflatl)
abst_Step :: Step -> Layer2Num.Step
abst_Step A = Layer2Num.A
abst_Step B = Layer2Num.B
abst_Step C = Layer2Num.C
abst_Step D = Layer2Num.D
abst_Step E = Layer2Num.E
abst_Step F = Layer2Num.F
abst_Step G = Layer2Num.G
abst_Type :: Type -> Layer2Num.Type
abst_Type Whole = Layer2Num.Whole
abst_Type Half = Layer2Num.Half
abst_Type Quarter = Layer2Num.Quarter
abst_Type Eighth = Layer2Num.Eighth
abst_Type Th16 = Layer2Num.Th16
abst_Type Th32 = Layer2Num.Th32
abst_Type Th64 = Layer2Num.Th64
abst_Accidental :: Accidental -> Layer2Num.Accidental
abst_Accidental DoubleFlat = Layer2Num.DoubleFlat
abst_Accidental Flat = Layer2Num.Flat
abst_Accidental Natural = Layer2Num.Natural
abst_Accidental Sharp = Layer2Num.Sharp
abst_Accidental DoubleSharp = Layer2Num.DoubleSharp
abst_ClefSign :: ClefSign -> Layer2Num.ClefSign
abst_ClefSign SignC = Layer2Num.SignC
abst_ClefSign SignF = Layer2Num.SignF
abst_ClefSign SignG = Layer2Num.SignG
abst_KeyMode :: KeyMode -> Layer2Num.KeyMode
abst_KeyMode Major = Layer2Num.Major
abst_KeyMode Minor = Layer2Num.Minor
\end{nocode}
\begin{nocode}
--mapLayer2Num :: (Layer2Num.Music -> Layer2Num.Music) -> Music -> Music
-- [(Text, [[Either Settings (Either Pitch Rest)]])]
--mapLayer2Num :: (Layer2Num.Music -> Layer2Num.Music) -> Music ->
-- [(PartName, ([[Either Settings (Maybe Instrument, Maybe Staff, Maybe Voice)]],
-- [[Either Settings (Either Pitch Rest, (Type, Dots))]]))]
mapLayer2Num :: ([[Either Settings (a,(Either Pitch Rest,(Type, Dots)))]] ->
[[Either Settings (a,(Either Pitch Rest,(Type, Dots)))]]) -> Music -> Music
mapLayer2Num f =
map (id >< (map.map) aux1) .
map (id >< map (uncurry zip) . uncurry zip ) . map (unflatr . flatl) .
map (id >< post2 . f . pre2) . map (unflatl . flatr) .
map (id ><
split ((map.map) ((id -|- p1))) ((map.map) (id -|- p2)))
where
aux1 :: (Either b a, Either b c) -> Either b (a,c)
aux1 (Right a, Right c) = Right (a,c)
aux1 (Left b, _) = Left b
aux1 (_, Left b) = Left b
pre2 :: [[Either Settings (Either Pitch Rest, (Type, Dots))]] ->
[[Either Settings (Either Pitch Rest, (Type, Dots))]]
pre2 = (map . map) (id -|- id) -- where
-- abst_Settings :: Settings -> Layer2Num.Settings
-- abst_Settings = flatl .
-- (( e2m . (id -|- (abst_ClefSign >< id)) . m2e ><
-- e2m . (id -|- (id >< abst_KeyMode)) . m2e) >< id) .
-- unflatl
-- abst_Note :: (Either Pitch Rest, (Type, Dots)) -> Layer2Num.Note
-- abst_Note = ((abst_Pitch -|- id) >< (abst_Type >< id))
-- abst_Pitch :: Pitch -> Layer2Num.Pitch
-- abst_Pitch = (flatl .
-- ((abst_Step >< e2m .(id -|- abst_Accidental). m2e) >< id) .
-- unflatl)
post2 :: [[Either Settings (Either Pitch Rest, (Type, Dots))]] ->
[[Either Settings (Either Pitch Rest, (Type, Dots))]]
post2 = ((map . map) (id -|- id)) -- where
-- rep_Settings :: Layer2Num.Settings -> Settings
-- rep_Settings = flatl .
-- (( e2m . (id -|- (rep_ClefSign >< id)) . m2e ><
-- e2m . (id -|- (id >< rep_KeyMode)) . m2e) >< id) .
-- unflatl
-- rep_Note :: Layer2Num.Note -> (Either Pitch Rest, (Type, Dots))
-- rep_Note = ((rep_Pitch -|- id) >< (rep_Type >< id))
-- rep_Pitch :: Layer2Num.Pitch -> Pitch
-- rep_Pitch = flatl .
-- ((rep_Step >< e2m . (id -|- rep_Accidental) . m2e) >< id) .
-- unflatl
\end{nocode}
\begin{nocode}
mapLayer2' :: (Either Attributes Note -> Either Attributes Note) ->
Music -> Music
mapLayer2' f =
-- map (id >< (map . map) (id -|- swap)) .
map (id >< (map . map) (post2 . f . pre2))
-- map (id >< (map . map) )
where
pre2 :: Either a Note -> Either a Note
pre2 = (id -|- (id >< id)) -- where
-- abst_Settings :: Settings -> Layer2Num.Settings
-- abst_Settings = flatl .
-- (( e2m . (id -|- (abst_ClefSign >< id)) . m2e ><
-- e2m . (id -|- (id >< abst_KeyMode)) . m2e) >< id) .
-- unflatl
-- abst_Note :: (Either Pitch Rest, (Type, Dots)) -> Layer2Num.Note
-- abst_Note = ((abst_Pitch -|- id) >< (abst_Type >< id))
-- abst_Pitch :: Pitch -> Layer2Num.Pitch
-- abst_Pitch = (flatl .
-- ((abst_Step >< e2m .(id -|- abst_Accidental). m2e) >< id) .
-- unflatl)
post2 :: Either a Note -> Either a Note
post2 = (id -|- (id >< id)) -- where
-- rep_Settings :: Layer2Num.Settings -> Settings
-- rep_Settings = flatl .
-- (( e2m . (id -|- (rep_ClefSign >< id)) . m2e ><
-- e2m . (id -|- (id >< rep_KeyMode)) . m2e) >< id) .
-- unflatl
-- rep_Note :: Layer2Num.Note -> (Either Pitch Rest, (Type, Dots))
-- rep_Note = ((rep_Pitch -|- id) >< (rep_Type >< id))
-- rep_Pitch :: Layer2Num.Pitch -> Pitch
-- rep_Pitch = flatl .
-- ((rep_Step >< e2m . (id -|- rep_Accidental) . m2e) >< id) .
-- unflatl
-- map (id >< (map . map) (id -|- swap))
\end{nocode}