hsc3-lang-0.14: Haskell SuperCollider Language

Safe HaskellNone

Sound.SC3.Lang.Control.Event

Contents

Description

An Event is a (Key,Field) map.

Synopsis

Field

data Field Source

Event field.

Fields are Num.

 5 :: Field
 4 + 5 :: Field
 negate 5 :: Field
 f_array [2,3] + f_array [4,5] == f_array [6,8]
 f_array [1,2,3] + f_array [4,5] == f_array [5,7,7]
 4 + f_array [5,6] == f_array [9,10]

Constructors

F_Double 

Fields

f_double :: Double
 
F_Vector 

Fields

f_vector :: [Field]
 
F_String 

Fields

f_string :: String
 
F_Instr 

Fields

f_instr :: Instr
 

class F_Value a whereSource

Set of types that can be lifted to Field.

Methods

toF :: a -> FieldSource

class F_Value a => F_Num a Source

Numeric F_Value types.

f_double_m :: Field -> Maybe DoubleSource

Maybe variant of f_double.

f_reader_err :: String -> String -> (Field -> Maybe a) -> Field -> aSource

Variant of reader with specified error message.

f_double_err :: String -> Field -> DoubleSource

Variant of f_double with specified error message.

f_ref :: Field -> FieldSource

Single element F_Vector constructor.

 f_ref 1 == f_array [1]

f_array :: [Double] -> FieldSource

Uniform vector constructor.

 f_array [1,2] == F_Vector [F_Double 1,F_Double 2]

f_vector_m :: Field -> Maybe [Field]Source

Maybe variant of f_vector.

f_vector_length :: Field -> Maybe IntSource

length of f_vector_m.

 f_vector_length (f_array [1..5]) == Just 5

f_double_err_ix :: String -> Maybe Int -> Field -> DoubleSource

Indexed variant of f_double_err.

 f_double_err_ix "" Nothing 1 == 1
 f_double_err_ix "" (Just 1) (f_array [0,1]) == 1

f_instr_m :: Field -> Maybe InstrSource

Maybe variant of f_instr.

f_instr_err :: String -> Field -> InstrSource

Variant of f_instr with specified error message.

f_map :: (Field -> Field) -> Field -> FieldSource

Map fn over vector elements at f.

 f_map negate (f_array [0,1]) == f_array [0,-1]

f_uop :: (Double -> Double) -> Field -> FieldSource

Numerical unary operator.

 f_uop negate (F_Double 1) == F_Double (-1)
 f_uop negate (F_Vector [F_Double 0,F_Double 1]) == f_array [0,-1]

f_binop :: (Double -> Double -> Double) -> Field -> Field -> FieldSource

Numerical binary operator.

 f_binop (+) (F_Double 1) (F_Double 2) == F_Double 3
 f_binop (*) (f_array [1,2,3]) (f_array [3,4,5]) == f_array [3,8,15]
 f_binop (/) (F_Double 9) (F_Double 3) == F_Double 3

f_atf :: (Double -> a) -> Field -> aSource

At floating branch of Field.

f_atf2 :: (Double -> Double -> a) -> Field -> Field -> aSource

At floating branches of Fields.

f_atf3 :: (Double -> Double -> Double -> a) -> Field -> Field -> Field -> aSource

At floating branches of Fields.

f_mce_extend :: Int -> Field -> FieldSource

Extend to Field to n.

 f_mce_extend 3 (f_array [1,2]) == f_array [1,2,1]
 f_mce_extend 3 1 == f_array [1,1,1]

Key

data Key Source

The type of the key at an Event.

 :set -XOverloadedStrings
 [K_dur,"pan"] == [K_dur,K_param "pan"]

k_name :: Key -> StringSource

SC3 name of Key.

 map k_name [K_freq,K_dur,K_param "pan"] == ["freq","dur","pan"]

k_reserved :: [Key]Source

List of reserved Keys used in pitch, duration and amplitude models. These are keys that may be provided explicitly, but if not will be calculated implicitly.

 (K_freq `elem` k_reserved) == True

k_is_parameter :: (Key, a) -> BoolSource

Is Key not k_reserved, and not k_vector.

 k_is_parameter (K_param "pan",0) == True

Event

type Event = Map Key FieldSource

An Event is a (Key,Field) map.

e_insert :: Key -> Field -> Event -> EventSource

Insert (k,v) into e.

 e_get K_id (e_insert K_id 1 mempty) == Just 1

e_from_list :: [(Key, Field)] -> EventSource

Event from association list.

 e_get K_id (e_from_list [(K_id,1)]) == Just 1

e_to_list :: Event -> [(Key, Field)]Source

Event from association list.

 let a = [(K_id,1)] in e_to_list (e_from_list a) == a

e_get :: Key -> Event -> Maybe FieldSource

Lookup k in e.

 e_get K_id mempty == Nothing

e_get_ix :: Maybe Int -> Key -> Event -> Maybe FieldSource

Immediate or vector element lookup.

 e_get_ix Nothing K_id (e_from_list [(K_id,1)]) == Just 1
 let n = f_array [0,1,2]
 in e_get_ix Nothing K_id (e_from_list [(K_id,n)]) == Just n
 let n = f_array [0..9]
 in e_get_ix (Just 5) K_id (e_from_list [(K_id,n)]) == Just 5

e_get_double :: Key -> Event -> Maybe DoubleSource

Type specialised e_get.

e_get_bool :: Key -> Event -> Maybe BoolSource

Type specialised e_get.

e_get_int :: Key -> Event -> Maybe IntSource

Type specialised e_get.

e_get_int_ix :: Maybe Int -> Key -> Event -> Maybe IntSource

Type specialised e_get_ix.

e_get_instr :: Key -> Event -> Maybe InstrSource

Type specialised e_get.

e_get_instr_ix :: Maybe Int -> Key -> Event -> Maybe InstrSource

Type specialised e_get_ix.

e_get_array :: Key -> Event -> Maybe [Double]Source

Type specialised e_get.

e_get_array_ix :: Maybe Int -> Key -> Event -> Maybe [Double]Source

Type specialised e_get_ix.

 let e = e_from_list [(K_scale,f_array [0,2])]
 in e_get_array_ix Nothing K_scale e == Just [0,2]
 let e = e_from_list [(K_scale,f_ref (f_array [0,2]))]
 in e_get_array_ix (Just 0) K_scale e == Just [0,2]

e_type :: Event -> StringSource

Event type.

 e_type mempty == "s_new"

e_type_match :: Event -> T3 (Event -> t) -> tSource

Match on event types, in sequence: s_new, n_set, rest.

e_type_match' :: Event -> T3 t -> tSource

const variant of e_type_match.

e_dur :: Maybe Int -> Event -> DurSource

Generate Dur from Event.

 D.delta (e_dur Nothing mempty) == 1
 D.fwd (e_dur Nothing (e_from_list [(K_dur,1),(K_stretch,2)])) == 2
 let e = e_from_list [(K_dur,1),(K_legato,0.5)]
 in D.occ (e_dur Nothing e) == 0.5

e_pitch :: Maybe Int -> Event -> PitchSource

Generate Pitch from Event.

 P.midinote (e_pitch Nothing mempty) == 60
 P.freq (e_pitch Nothing (e_from_list [(K_degree,5)])) == 440
 let e = e_from_list [(K_degree,5),(K_scale,f_array [0,2,3,5,7,8,10])]
 in P.midinote (e_pitch Nothing e) == 68
 let e = e_from_list [(K_degree,5),(K_scale,f_ref (f_array [0,2,3,5,7,8,10]))]
 in P.midinote (e_pitch (Just 0) (e_mce_expand e)) == 68
 P.freq (e_pitch Nothing (e_from_list [(K_midinote,69)])) == 440

e_id :: Maybe Int -> Event -> Maybe IntSource

Event identifier.

e_db :: Maybe Int -> Event -> DoubleSource

Lookup db field of Event.

 e_db Nothing mempty == (-20)

e_amp :: Maybe Int -> Event -> DoubleSource

The linear amplitude of the amplitude model at e.

 e_amp Nothing (e_from_list [(K_db,-60)]) == 0.001
 e_amp Nothing (e_from_list [(K_amp,0.01)]) == 0.01
 e_amp Nothing mempty == 0.1

e_latency :: Event -> DoubleSource

Message latency of event.

 e_latency mempty == 0.1

e_parameters :: Maybe Int -> Event -> [(String, Double)]Source

Extract non-reserved Keys from Event.

 let e = e_from_list [(K_freq,1),(K_param "p",1),(K_scale,f_ref (f_array [0,3,7]))]
 in e_parameters Nothing e == [("p",1)]

e_edit :: Key -> Field -> (Field -> Field) -> Event -> EventSource

Value editor for Key at Event, with default value in case Key is not present.

e_edit' :: Key -> (Field -> Field) -> Event -> EventSource

Variant of edit_v with no default value.

Event temporal

e_merge' :: (Time, [Event]) -> (Time, [Event]) -> [(Time, Event)]Source

Merge two time-stamped Event sequences. Note that this uses fwd to calculate start times.

e_add_fwd :: [(Time, Event)] -> [Event]Source

Insert fwd Keys into a time-stamped Event sequence.

e_merge :: (Time, [Event]) -> (Time, [Event]) -> [Event]Source

Composition of add_fwd and merge'.

e_par :: [(Time, [Event])] -> [Event]Source

N-ary variant of e_merge.

 e_par [(0,repeat (e_from_list [(K_id,1)]))
       ,(0,repeat (e_from_list [(K_param "b",2)]))
       ,(0,repeat (e_from_list [(K_param "c",3)]))]

e_rest :: EventSource

mempty with rest.

e_is_rest :: Event -> BoolSource

Does Event have a True rest key.

 e_is_rest mempty == False
 e_is_rest (e_from_list [(K_rest,1)]) == True

MCE

e_mce_depth :: Event -> Maybe IntSource

Maximum vector length at Event.

 e_mce_depth (e_from_list [(K_id,1)]) == Nothing
 e_mce_depth (e_from_list [(K_id,1),(K_param "b",f_array [2,3])]) == Just 2

e_mce_extend :: Event -> Maybe (Int, Event)Source

Extend vectors at Event if required, returning e_mce_depth.

 let {e = e_from_list [(K_id,f_array [1,2]),(K_param "b",f_array [2,3,4])]
     ;r = e_from_list [(K_id,f_array [1,2,1]),(K_param "b",f_array [2,3,4])]}
 in e_mce_extend e == Just (3,r)
 let e = e_from_list [(K_id,1)]
 in e_mce_extend e == Nothing

e_un_mce :: Event -> Maybe [Event]Source

Parallel Events, if required.

 let {e = e_from_list [(K_id,1),(K_param "b",f_array [2,3])]
     ;r = [e_from_list [(K_id,1),(K_param "b",2)],e_from_list [(K_id,1),(K_param "b",3)]]}
 in e_un_mce e == Just r
 let {e = e_from_list [(K_id,f_array [1,2]),(K_param "b",f_array [3,4,5])]
     ;r = e_from_list [(K_id,1),(K_param "b",5)]}
 in fmap (!! 2) (e_un_mce e) == Just r
 e_un_mce (e_from_list [(K_id,1)]) == Nothing

SC3

e_messages :: Dur -> Event -> Int -> Maybe Int -> Maybe (T2 [Message])Source

Generate SC3 (on,off) Message sets describing Event.

e_messages_mce :: Dur -> Event -> Int -> (Maybe (T2 [Message]), Int)Source

MCE variant of e_messages.

e_bundles :: Time -> Int -> Dur -> Event -> (Maybe (T2 Bundle), Int)Source

Generate SC3 (on,off) Bundles describing Event.

newtype Event_Seq Source

Ordered sequence of Event.

Constructors

Event_Seq 

Fields

e_seq_events :: [Event]
 

Instances

e_bundle_seq :: Time -> Event_Seq -> [T2 Bundle]Source

Transform Event_Seq into a sequence of SC3 (on,off) Bundles.

 e_bundle_seq 0 (Event_Seq (replicate 5 mempty))

e_nrt :: Event_Seq -> NRTSource

Transform (productively) an Event_Seq into an NRT score.

 let {n1 = nrt_bundles (e_nrt (Event_Seq (replicate 5 mempty)))
     ;n2 = take 10 (nrt_bundles (e_nrt (Event_Seq (repeat mempty))))}
 in n1 == n2

e_play :: Transport m => Event_Seq -> m ()Source

Audition Event_Seq.

Aliases

e_empty :: EventSource

Type-specialised mempty.

e_union :: Event -> Event -> EventSource

Type-specialised mappend.

 let {l = [(K_id,0)];r = [(K_degree,1)]}
 in e_from_list l <> e_from_list r == e_from_list (l <> r)

Temporal

t_merge :: Ord t => [(t, a)] -> [(t, a)] -> [(t, a)]Source

Left-biased merge of two sorted sequence of temporal values.

 let m = t_merge (zip [0,2,4,6] ['a'..]) (zip [0,3,6] ['A'..])
 in m == [(0,'a'),(0,'A'),(2,'b'),(3,'B'),(4,'c'),(6,'d'),(6,'C')]

Tuple

type T2 n = (n, n)Source

Two tuple of n.

type T3 n = (n, n, n)Source

Three tuple of n.

List

mcons :: Maybe a -> [a] -> [a]Source

Maybe variant of :.