module Derive.Call.NoteUtil (make_event, make_event_control_vals) where
import qualified Data.Map as Map
import qualified Derive.Args as Args
import qualified Derive.Call as Call
import qualified Derive.Controls as Controls
import qualified Derive.Derive as Derive
import qualified Derive.DeriveT as DeriveT
import qualified Derive.Deriver.Internal as Internal
import qualified Derive.Env as Env
import qualified Derive.EnvKey as EnvKey
import qualified Derive.Flags as Flags
import qualified Derive.PSignal as PSignal
import qualified Derive.Score as Score
import qualified Derive.ScoreT as ScoreT
import qualified Perform.RealTime as RealTime
import qualified Perform.Signal as Signal
import qualified Ui.Color as Color
import qualified Ui.Event as Event
import qualified Ui.ScoreTime as ScoreTime
import Global
import Types
make_event :: Derive.PassedArgs a -> Derive.Dynamic -> RealTime -> RealTime
-> Text -> Flags.Flags -> Derive.Deriver Score.Event
make_event :: forall a.
PassedArgs a
-> Dynamic
-> RealTime
-> RealTime
-> Text
-> Flags
-> Deriver Event
make_event PassedArgs a
args Dynamic
dyn RealTime
start RealTime
dur Text
integrate Flags
flags = do
ControlValMap
cvmap <- RealTime -> Deriver ControlValMap
Derive.controls_at RealTime
start
forall a.
ControlValMap
-> PassedArgs a
-> Dynamic
-> RealTime
-> RealTime
-> Text
-> Flags
-> Deriver Event
make_event_control_vals ControlValMap
cvmap PassedArgs a
args Dynamic
dyn RealTime
start RealTime
dur Text
integrate Flags
flags
make_event_control_vals :: ScoreT.ControlValMap -> Derive.PassedArgs a
-> Derive.Dynamic -> RealTime -> RealTime -> Text -> Flags.Flags
-> Derive.Deriver Score.Event
make_event_control_vals :: forall a.
ControlValMap
-> PassedArgs a
-> Dynamic
-> RealTime
-> RealTime
-> Text
-> Flags
-> Deriver Event
make_event_control_vals ControlValMap
cvmap PassedArgs a
args Dynamic
dyn RealTime
start RealTime
dur Text
integrate Flags
flags = do
RealTime
offset <- RealTime -> Deriver RealTime
get_start_offset RealTime
start
Deriver ()
Internal.increment_event_serial
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! Score.Event
{ event_start :: RealTime
event_start = RealTime
start
, event_duration :: RealTime
event_duration = RealTime
dur
, event_text :: Text
event_text = Event -> Text
Event.text (forall a. PassedArgs a -> Event
Args.event PassedArgs a
args)
, event_integrate :: Text
event_integrate = Text
integrate
, event_pitch :: PSignal
event_pitch = RealTime -> PSignal -> PSignal
trim_pitch RealTime
start (Dynamic -> PSignal
Derive.state_pitch Dynamic
dyn)
, event_stack :: Stack
event_stack = Dynamic -> Stack
Derive.state_stack Dynamic
dyn
, event_highlight :: Highlight
event_highlight = Highlight
Color.NoHighlight
, event_instrument :: Instrument
event_instrument = forall a. a -> Maybe a -> a
fromMaybe Instrument
ScoreT.empty_instrument forall a b. (a -> b) -> a -> b
$
forall a. Typecheck a => Text -> Environ -> Maybe a
Env.maybe_val Text
EnvKey.instrument Environ
environ
, event_environ :: Environ
event_environ = (Val -> Val) -> Environ -> Environ
Env.map (RealTime -> Val -> Val
trim_control_vals RealTime
start) forall a b. (a -> b) -> a -> b
$
ControlValMap -> RealTime -> Environ -> Environ
stash_convert_values ControlValMap
cvmap RealTime
offset Environ
environ
, event_flags :: Flags
event_flags = Flags
flags
, event_delayed_args :: Map Text Dynamic
event_delayed_args = forall a. Monoid a => a
mempty
, event_logs :: [Msg]
event_logs = []
}
where environ :: Environ
environ = Dynamic -> Environ
Derive.state_environ Dynamic
dyn
trim_control_vals :: RealTime -> DeriveT.Val -> DeriveT.Val
trim_control_vals :: RealTime -> Val -> Val
trim_control_vals RealTime
start = \case
DeriveT.VSignal Typed Control
sig -> Typed Control -> Val
DeriveT.VSignal forall a b. (a -> b) -> a -> b
$ forall {k} (kind :: k). RealTime -> Signal kind -> Signal kind
Signal.drop_before RealTime
start forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Typed Control
sig
DeriveT.VPSignal PSignal
sig -> PSignal -> Val
DeriveT.VPSignal forall a b. (a -> b) -> a -> b
$ RealTime -> PSignal -> PSignal
PSignal.drop_before RealTime
start PSignal
sig
Val
val -> Val
val
stash_convert_values :: ScoreT.ControlValMap -> RealTime -> Env.Environ
-> Env.Environ
stash_convert_values :: ControlValMap -> RealTime -> Environ -> Environ
stash_convert_values ControlValMap
vals RealTime
offset =
Environ -> Environ
stash_start_offset
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Control -> Text -> Environ -> Environ
insert_if Control
Controls.dynamic Text
EnvKey.dynamic_val
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Control -> Text -> Environ -> Environ
insert_if Control
Controls.attack_velocity Text
EnvKey.attack_val
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Control -> Text -> Environ -> Environ
insert_if Control
Controls.release_velocity Text
EnvKey.release_val
where
stash_start_offset :: Environ -> Environ
stash_start_offset = forall a. ToVal a => Text -> a -> Environ -> Environ
Env.insert_val Text
EnvKey.start_offset_val RealTime
offset
insert_if :: Control -> Text -> Environ -> Environ
insert_if Control
control Text
key = forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. a -> a
id (forall a. ToVal a => Text -> a -> Environ -> Environ
Env.insert_val Text
key) forall a b. (a -> b) -> a -> b
$
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Control
control ControlValMap
vals
get_start_offset :: RealTime -> Derive.Deriver RealTime
get_start_offset :: RealTime -> Deriver RealTime
get_start_offset RealTime
start = do
RealTime
start_s <- forall b a. b -> (a -> b) -> Maybe a -> b
maybe RealTime
0 Y -> RealTime
RealTime.seconds forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
Control -> RealTime -> Deriver (Maybe Y)
Derive.untyped_control_at Control
Controls.start_s RealTime
start
ScoreTime
start_t <- forall b a. b -> (a -> b) -> Maybe a -> b
maybe ScoreTime
0 Y -> ScoreTime
ScoreTime.from_double forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
Control -> RealTime -> Deriver (Maybe Y)
Derive.untyped_control_at Control
Controls.start_t RealTime
start
RealTime
start_t <- forall t1 t2. (Time t1, Time t2) => t1 -> t2 -> Deriver RealTime
Call.real_duration RealTime
start ScoreTime
start_t
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ RealTime
start_s forall a. Num a => a -> a -> a
+ RealTime
start_t
trim_pitch :: RealTime -> PSignal.PSignal -> PSignal.PSignal
trim_pitch :: RealTime -> PSignal -> PSignal
trim_pitch = RealTime -> PSignal -> PSignal
PSignal.drop_before