hamusic-0.1: src/Music/Analysis/Script.lhs
\begin{code}
-- |
-- Maintainer : silva.samuel@alumni.uminho.pt
-- Stability : experimental
-- Portability: portable
--
module Music.Analysis.Script where
import Script
import qualified Text.XML.MusicXML as MusicXML
import Music.Analysis.PF
import Music.Analysis.MusicXML2Haskore as IHaskore
import Music.Analysis.MusicXML as Interface
import Music.Analysis.MusicXML.Functions
import Music.Analysis.MusicXML.Level5 as Layer5
import Music.Analysis.MusicXML.Level4 as Layer4
--import Music.Analysis.Definition.Layer3 as Layer3
--import Music.Analysis.Definition.Layer2 as Layer2
import Text.XML.HaXml.OneOfN
import Control.Exception (throw, Exception(..))
import qualified Haskore.Music.GeneralMIDI
--import System.Directory
--import Text.XML.HaXml.XmlContent
--import Data.List
import System.IO (hFlush, stdout)
import Prelude
\end{code}
\begin{nocode}
-- |
procLength :: Length -> MusicXML.MusicXMLDoc -> String
procLength (Length Length_select_part Nothing) =
procLength (Length Length_select_part (Just Length_mode_simple))
procLength (Length Length_select_part (Just Length_mode_simple)) =
show . length_Part
procLength (Length Length_select_part (Just Length_mode_map)) =
unwords . map show . length_Part_map
procLength (Length Length_select_part (Just Length_mode_concat)) =
show . length_Part_concat
procLength (Length Length_select_measure Nothing) =
procLength (Length Length_select_measure (Just Length_mode_simple))
procLength (Length Length_select_measure (Just Length_mode_simple)) =
show . length_Measure
procLength (Length Length_select_measure (Just Length_mode_map)) =
unwords . map show . length_Measure_map
procLength (Length Length_select_measure (Just Length_mode_concat)) =
show . length_Measure_concat
\end{nocode}
\begin{code}
-- |
procFilter :: Filter -> MusicXML.MusicXMLDoc -> MusicXML.MusicXMLDoc
procFilter (Filter Filter_select_note Nothing) =
procFilter (Filter Filter_select_note (Just Filter_mode_yes))
procFilter (Filter Filter_select_note (Just Filter_mode_yes)) =
mapMusicXML filterNote
procFilter (Filter Filter_select_note (Just Filter_mode_no)) =
mapMusicXML filterNotNote
procFilter (Filter Filter_select_note_normal Nothing) =
procFilter (Filter Filter_select_note_normal (Just Filter_mode_yes))
procFilter (Filter Filter_select_note_normal (Just Filter_mode_yes)) =
mapMusicXML filterNormalNote
procFilter (Filter Filter_select_note_normal (Just Filter_mode_no)) =
mapMusicXML filterNotNormalNote
procFilter (Filter Filter_select_note_cue Nothing) =
procFilter (Filter Filter_select_note_cue (Just Filter_mode_yes))
procFilter (Filter Filter_select_note_cue (Just Filter_mode_yes)) =
mapMusicXML filterCueNote
procFilter (Filter Filter_select_note_cue (Just Filter_mode_no)) =
mapMusicXML filterNotCueNote
procFilter (Filter Filter_select_note_grace Nothing) =
procFilter (Filter Filter_select_note_grace (Just Filter_mode_yes))
procFilter (Filter Filter_select_note_grace (Just Filter_mode_yes)) =
mapMusicXML filterGraceNote
procFilter (Filter Filter_select_note_grace (Just Filter_mode_no)) =
mapMusicXML filterNotGraceNote
-- |
onlyPartwise :: (MusicXML.Score_Partwise -> MusicXML.Score_Partwise) ->
MusicXML.MusicXMLDoc -> MusicXML.MusicXMLDoc
onlyPartwise f (MusicXML.Score (MusicXML.Partwise x)) =
MusicXML.Score (MusicXML.Partwise (f x))
onlyPartwise _ x = x
-- |
procReification :: Reification ->
MusicXML.Score_Partwise -> MusicXML.Score_Partwise
procReification (Reification Reification_value_5) =
Interface.rep_Score_Partwise .
Interface.abst_Score_Partwise
procReification (Reification Reification_value_4) =
Interface.rep_Score_Partwise .
Layer5.rep_Score_Partwise .
Layer5.abst_Score_Partwise .
Interface.abst_Score_Partwise
procReification (Reification Reification_value_3) =
Interface.rep_Score_Partwise .
Layer5.rep_Score_Partwise .
Layer4.rep_Score_Partwise .
Layer4.abst_Score_Partwise .
Layer5.abst_Score_Partwise .
Interface.abst_Score_Partwise
procReification (Reification Reification_value_2) =
Interface.rep_Score_Partwise .
Layer5.rep_Score_Partwise .
Layer4.rep_Score_Partwise .
-- Layer3.rep_Score_Partwise .
-- Layer3.abst_Score_Partwise .
Layer4.abst_Score_Partwise .
Layer5.abst_Score_Partwise .
Interface.abst_Score_Partwise
procReification (Reification Reification_value_1) =
Interface.rep_Score_Partwise .
Layer5.rep_Score_Partwise .
Layer4.rep_Score_Partwise .
-- Layer3.rep_Score_Partwise .
-- Layer2.rep_Score_Partwise .
-- Layer2.abst_Score_Partwise .
-- Layer3.abst_Score_Partwise .
Layer4.abst_Score_Partwise .
Layer5.abst_Score_Partwise .
Interface.abst_Score_Partwise
procCount :: Count -> MusicXML.MusicXMLDoc -> (String, Int)
procCount (Count Count_select_part) =
\m -> ("part", count_part m)
procCount (Count Count_select_measure) =
\m -> ("measure", count_measure m)
procCount (Count Count_select_music_data) =
\m -> ("music-data", count_music_data m)
procCount (Count Count_select_note) =
\m -> ("note", count_note m)
procCount (Count Count_select_note_normal) =
\m -> ("note-normal", count_note_normal m)
procCount (Count Count_select_note_grace) =
\m -> ("note-grace", count_note_grace m)
procCount (Count Count_select_note_cue) =
\m -> ("note-cue", count_note_cue m)
procStat :: Stat -> MusicXML.MusicXMLDoc -> String
procStat (Stat (Stat_Attrs Nothing) list) =
procStat (Stat (Stat_Attrs (Just Stat_verbose_yes)) list)
procStat (Stat (Stat_Attrs (Just Stat_verbose_no)) list) =
\m -> unlines (map (show.p2) (map (flip procCount m) list))
procStat (Stat (Stat_Attrs (Just Stat_verbose_yes)) list) =
\m -> unlines (map (uncurry (++) . ((++": ") >< show))
(map (flip procCount m) list))
-- |
procParttime :: a -> MusicXML.MusicXMLDoc -> MusicXML.MusicXMLDoc
procParttime _ (MusicXML.Score (MusicXML.Partwise music)) =
(MusicXML.Score (MusicXML.Timewise (Interface.toTimewise music)))
procParttime _ music = music
-- |
procTimepart :: a -> MusicXML.MusicXMLDoc -> MusicXML.MusicXMLDoc
procTimepart _ (MusicXML.Score (MusicXML.Timewise music)) =
(MusicXML.Score (MusicXML.Partwise (Interface.toPartwise music)))
procTimepart _ music = music
procHaskore :: a -> MusicXML.MusicXMLDoc -> String
procHaskore _ (MusicXML.Score (MusicXML.Partwise music)) = "music = " ++
show (IHaskore.partwise2haskore music)
procHaskore _ (MusicXML.Score (MusicXML.Timewise music)) = "music = " ++
show (IHaskore.partwise2haskore (Interface.toPartwise music))
procHaskore _ _ = []
procMidi :: Midi -> MusicXML.MusicXMLDoc -> Either Haskore.Music.GeneralMIDI.T ()
procMidi (Midi Nothing) = procMidi (Midi (Just Midi_play_no))
procMidi (Midi (Just Midi_play_no)) = i2 . const ()
procMidi (Midi (Just Midi_play_yes)) = i1 . toMidi . procTimepart Timepart
--(procTimepart Timepart m)
-- playMidi "test.mid" (procTimepart Timepart music) >> return ()
--procMidi (Midi (Just filepath) Nothing) music =
-- procMidi (Midi (Just filepath) (Just Midi_play_no)) music
--procMidi (Midi (Just filepath) (Just Midi_play_no)) music =
-- saveMidi filepath music
--procMidi (Midi (Just filepath) (Just Midi_play_yes)) music =
-- saveMidi filepath music >>
-- playMidi filepath (procTimepart Timepart music) >> return ()
\end{code}
\begin{code}
-- |
procWarn :: Maybe Action_warnings -> Bool
procWarn Nothing = procWarn (Just Action_warnings_no)
procWarn (Just Action_warnings_no) = False
procWarn (Just Action_warnings_yes) = True
-- |
procOutput :: Maybe FilePath ->
Either (Either MusicXML.MusicXMLDoc String)
(Either Haskore.Music.GeneralMIDI.T ()) -> IO ()
procOutput Nothing x = do
let f = MusicXML.show_CONTENTS MusicXML.show_MusicXMLDoc
either (either (putStrLn . f) putStrLn)
(either (return . const ()) (return . const ())) x
hFlush stdout
procOutput (Just output) x = do
let f = MusicXML.show_FILE MusicXML.show_MusicXMLDoc
either (either (f output) (writeFile output))
(either (\m -> saveMidi output m >>
playMidi output m >> return ())
(return . const ())) x
-- |
fromError :: MusicXML.Result a -> String
fromError (MusicXML.Error e) = e
fromError (MusicXML.Ok _) = throw (ErrorCall "internal error")
-- |
procAction_ ::
[OneOf7 Filter Reification Stat Parttime Timepart Haskore Midi] ->
MusicXML.MusicXMLDoc ->
Either (Either MusicXML.MusicXMLDoc String)
(Either Haskore.Music.GeneralMIDI.T ())
procAction_ [] = i1 . i1
--procAction_ ((OneOf8 a):_) = i1 . i2 . procLength a
procAction_ ((OneOf7 b):t) = \m -> procAction_ t (procFilter b m)
procAction_ ((TwoOf7 c):t) =
\m -> procAction_ t (onlyPartwise (procReification c) m)
procAction_ ((ThreeOf7 d):_) = i1 . i2 . procStat d
procAction_ ((FourOf7 e):t) = \m -> procAction_ t (procParttime e m)
procAction_ ((FiveOf7 f):t) = \m -> procAction_ t (procTimepart f m)
procAction_ ((SixOf7 g):_) = i1 . i2 . procHaskore g
procAction_ ((SevenOf7 h):_) = i2 . procMidi h
procAction :: Action -> IO ()
procAction (Action (Action_Attrs input output w) x) = do
musicxml <- MusicXML.read_FILE MusicXML.read_MusicXMLDoc input
case MusicXML.isOK musicxml of
True -> procOutput output
(procAction_ x (MusicXML.fromOK musicxml))
False ->
if procWarn w
then procOutput output ((i1 . i2) (fromError musicxml))
else return ()
-- |
procScript :: Script -> IO ()
procScript (Script _ actions) = mapM_ procAction actions
\end{code}