module Csound.Typed.Types.MonoArg(
    MonoArg(..), MonoAdsr, adsrMonoSynt, monoAdsr
) where
import Csound.Typed.Types.Prim
import Csound.Typed.Types.Tuple
import Csound.Typed.Plugins.Adsr140
data MonoArg = MonoArg
    { monoAmp  :: Sig
    , monoCps  :: Sig
    , monoGate :: Sig
    , monoTrig :: Sig }
instance Tuple MonoArg where
    tupleMethods = makeTupleMethods to from
        where
            to :: Sig4 -> MonoArg
            to (amp, cps, gate, trig) = MonoArg amp cps gate trig
            from :: MonoArg -> Sig4
            from (MonoArg amp cps gate trig) = (amp, cps, gate, trig)
type MonoAdsr = Sig -> Sig -> Sig -> Sig -> Sig
adsrMonoSynt :: (MonoAdsr -> (Sig, Sig) -> a) -> (MonoArg -> a)
adsrMonoSynt f arg = f env (monoAmp arg, monoCps arg) 
    where env = monoAdsr arg
monoAdsr :: MonoArg -> MonoAdsr
monoAdsr arg = adsr140 (monoGate arg) (monoTrig arg)