hsc3-0.21: Sound/Sc3/Server/Nrt/Edit.hs
-- | Nrt editing
module Sound.Sc3.Server.Nrt.Edit where
import Data.List {- base -}
import qualified Data.List.Ordered {- data-ordlist -}
import qualified Sound.Osc.Datum as Osc {- hosc -}
import qualified Sound.Osc.Packet as Osc {- hosc -}
import qualified Sound.Sc3.Common.Base {- hsc3 -}
import qualified Sound.Sc3.Server.Command {- hsc3 -}
import Sound.Sc3.Server.Nrt {- hsc3 -}
-- | Merge two Nrt scores. Retains internal nrt_end messages.
nrt_merge :: Nrt -> Nrt -> Nrt
nrt_merge (Nrt p) (Nrt q) = Nrt (Data.List.Ordered.merge p q)
-- | Merge a set of Nrt. Retains internal 'nrt_end' messages.
nrt_merge_set :: [Nrt] -> Nrt
nrt_merge_set = foldr nrt_merge nrt_empty
-- | The empty Nrt.
nrt_empty :: Nrt
nrt_empty = Nrt []
-- | Add bundle at first permissable location of Nrt.
nrt_insert_pre :: Osc.BundleOf Osc.Message -> Nrt -> Nrt
nrt_insert_pre p (Nrt q) = Nrt (insert p q)
-- | Add bundle at last permissable location of Nrt.
nrt_insert_post :: Osc.BundleOf Osc.Message -> Nrt -> Nrt
nrt_insert_post p (Nrt q) = Nrt (Sound.Sc3.Common.Base.insert_post p q)
-- | bundleTime of last of nrt_bundles.
nrt_end_time :: Nrt -> Osc.Time
nrt_end_time = Osc.bundleTime . last . nrt_bundles
-- | Delete any internal nrt_end messages, and require one at the final bundle.
nrt_close :: Nrt -> Nrt
nrt_close (Nrt l) =
let is_nrt_end_msg = (== "/nrt_end") . Osc.messageAddress
bundle_map t_f m_f (Osc.Bundle t m) = Osc.Bundle (t_f t) (m_f m) -- apply temporal and message functions to bundle
rem_end_msg = bundle_map id (filter (not . is_nrt_end_msg))
req_end_msg =
let f m =
if any is_nrt_end_msg m
then m
else m ++ [Sound.Sc3.Server.Command.nrt_end]
in bundle_map id f
in Nrt (Sound.Sc3.Common.Base.at_last rem_end_msg req_end_msg l)
-- | Append /q/ to /p/, assumes last timestamp at /p/ precedes first at /q/.
nrt_append :: Nrt -> Nrt -> Nrt
nrt_append (Nrt p) (Nrt q) = Nrt (p ++ q)