module Csound.Typed.Types(
-- * Primitives
module Csound.Typed.Types.Prim,
module Csound.Typed.Types.Lift,
-- * Init values
-- | In Csound we can supply an opcodes with initialization arguments.
-- They are optional. To imitate this functionality in haskell we
-- can use these functions.
withInits, withDs, withSigs, withTabs, withD, withSig, withTab, withSeed,
-- * Tuples
module Csound.Typed.Types.Tuple,
-- * Events
module Csound.Typed.Types.Evt,
-- * Arrays
module Csound.Typed.Types.Array,
-- * Arguments for monophonic synths
module Csound.Typed.Types.MonoArg,
-- * Signal space (generic signal transformers)
module Csound.Typed.Types.SigSpace,
-- * Tab helpers
getNextGlobalGenId
) where
import qualified Csound.Dynamic as D
import Csound.Typed.Types.Prim
import Csound.Typed.Types.Tuple
import Csound.Typed.Types.Evt
import Csound.Typed.Types.Lift
import Csound.Typed.Types.Array
import Csound.Typed.Types.MonoArg
import Csound.Typed.Types.SigSpace
import Csound.Typed.GlobalState(evalSE, SE, geToSe)
import qualified Csound.Typed.GlobalState as G(getNextGlobalGenId)
getNextGlobalGenId :: SE Int
getNextGlobalGenId = geToSe G.getNextGlobalGenId
-- appends inits
-- | Appends initialisation arguments. It's up to user to supply arguments with the right types. For example:
--
-- > oscil 0.5 440 sinWave `withInits` (0.5 :: D)
withInits :: (Tuple a, Tuple b) => a -> b -> a
withInits a b = genWithInits a (fromTuple b)
-- | A special case of @withInits@. Here all inits are numbers.
withDs :: Tuple a => a -> [D] -> a
withDs a ds = genWithInits a (mapM toGE ds)
-- | Appends an init value which is a number.
withD :: Tuple a => a -> D -> a
withD = withInits
-- | A special case of @withInits@. Here all inits are signals.
withSigs :: Tuple a => a -> [Sig] -> a
withSigs a sigs = genWithInits a (mapM toGE sigs)
-- | Appends an init value which is a signal.
withSig :: Tuple a => a -> Sig -> a
withSig = withInits
-- | A special case of @withInits@. Here all inits are arrays.
withTabs :: Tuple a => a -> [Tab] -> a
withTabs a tabs = genWithInits a (mapM toGE tabs)
-- | Appends an init value which is a table.
withTab :: Tuple a => a -> Tab -> a
withTab = withInits
-- | Applies a seed to the random value.
-- It's equivalent to the @withD@ but it has a special
-- meaning of canceling the side effect. When random
-- opcode is provided with seed value it's no longer
-- contains a side effect so we don't need to restrict it.
withSeed :: SE Sig -> D -> Sig
withSeed a d = hideGE $ evalSE $ fmap (flip withD d) a
genWithInits :: (Tuple a) => a -> GE [E] -> a
genWithInits a vals = toTuple $ do
as <- fromTuple a
vs <- vals
return $ fmap (\x -> D.withInits x vs) as