module Music.Typesetting.Process where
import Data.List
import qualified Music.Typesetting.Literal.Dynamic as M
import Music.Typesetting.Model
import Music.Typesetting.Query
m_clef_set_staff :: Integer -> M_Annotation -> Maybe M_Annotation
m_clef_set_staff n a =
case a of
M_Clef c _ -> Just (M_Clef c n)
_ -> Nothing
n_remove_ties :: Note -> Note
n_remove_ties (Note d a) =
let f e = e == N_End_Tied || e == N_Begin_Tied
a' = filter (not . f) a
in Note d a'
n_add_end_hairpins :: [Note] -> [Note]
n_add_end_hairpins =
let f st n =
case n of
[] -> []
[Note d a] -> [Note d (if st then M.end_hairpin : a else a)]
Note d a : n' ->
let (a',st') = if st &&
any na_is_begin_dynamic a &&
M.end_hairpin `notElem` a
then (M.end_hairpin : a
,any na_is_begin_hairpin a)
else (a
,st || any na_is_begin_hairpin a)
in Note d a' : f st' n'
in f False
prune :: (a -> a -> Bool) -> (b -> Maybe a) -> (a -> b -> b) -> [b] -> [b]
prune cmp get del =
let go _ [] = []
go Nothing (x:xs) = x : go (get x) xs
go (Just st) (x:xs) =
case get x of
Nothing -> x : go (Just st) xs
Just y -> if cmp st y
then del y x : go (Just st) xs
else x : go (Just y) xs
in go Nothing
m_delete_annotation :: M_Annotation -> Measure -> Measure
m_delete_annotation i (Measure a n) = Measure (delete i a) n
m_remove_duplicate_ts :: [Measure] -> [Measure]
m_remove_duplicate_ts =
let get = m_time_signature'
del = m_delete_annotation
in prune (==) get del
m_remove_duplicate_tempo_marking :: [Measure] -> [Measure]
m_remove_duplicate_tempo_marking =
let get = m_tempo_marking'
del = m_delete_annotation
in prune (==) get del