\begin{code} -- | -- Maintainer : silva.samuel@alumni.uminho.pt -- Stability : experimental -- Portability: portable -- Implements interface to Lilypond module Music.Analysis.Abstract2Lilypond where import Music.Analysis.PF ((><), (-|-), grd, split, e2m, hyloL) import Music.Analysis.Base (IntegerNumber) import Music.Analysis.Abstract.Melodic (Accident) import Music.Analysis.Abstract.Zip (VoiceZipNode) import Data.Tuple (uncurry) import Data.List ((++)) import Data.Function ((.), const) import Data.Maybe (maybe) import Data.Either (either) import Data.Char (String) import Data.Ord (Ord(..)) import Data.Eq (Eq(..)) import Prelude (Num(..), show) \end{code} \begin{code} -- * Output Functions -- | output :: VoiceZipNode -> String output = uncurry (++) . (maybe "r" (uncurry (++) . (show >< outputAccidents)) >< uncurry (++) . (show >< outputDots)) -- | outputDots :: IntegerNumber -> String outputDots = hyloL (maybe [] (uncurry (++))) (e2m . (const () -|- split (const ".") pred) . grd (<=0)) where pred = \x -> x - 1 -- | outputAccidents :: Accident -> String outputAccidents = maybe "" (hyloL (maybe [] (uncurry (++))) (e2m . (const () -|- either (split (const "is") pred) (split (const "es") succ) . grd (>0)) . grd (==0))) where pred = \x -> x - 1 succ = \x -> x + 1 \end{code}