{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies, NoMonoLocalBinds #-}

{-# LANGUAGE NoIncoherentInstances #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE NoUndecidableInstances #-}

module Vivid.UGens.Dynamics (
     compander
---   , companderD
   , limiter
   , normalizer
   ) where

import Vivid.SC.SynthDef.Types (CalculationRate(..))
import Vivid.SynthDef
import Vivid.SynthDef.FromUA
--- import Vivid.SynthDef.TypesafeArgs
import Vivid.UGens.Args

compander :: (Args '["in"] '["control","threshold","slopeBelow","slopeAbove","clampSecs","relaxSecs"] a) => a -> SDBody a Signal
compander :: a -> SDBody a Signal
compander = String
-> CalculationRate
-> Vs
     '["in", "control", "threshold", "slopeBelow", "slopeAbove",
       "clampSecs", "relaxSecs"]
-> (UA "control" (SDBodyArgs a), UA "threshold" (SDBodyArgs a),
    UA "slopeBelow" (SDBodyArgs a), UA "slopeAbove" (SDBodyArgs a),
    UA "clampSecs" (SDBodyArgs a), UA "relaxSecs" (SDBodyArgs a))
-> a
-> SDBody a Signal
forall (tags :: [Symbol]) optional userSupplied (args :: [Symbol]).
(GetSymbolVals (Vs tags), FromUA optional, FromUA userSupplied,
 SDBodyArgs optional ~ SDBodyArgs userSupplied,
 SDBodyArgs optional ~ args) =>
String
-> CalculationRate
-> Vs tags
-> optional
-> userSupplied
-> SDBody' args Signal
makeUGen
   String
"Compander" CalculationRate
AR
   (Vs
  '["in", "control", "threshold", "slopeBelow", "slopeAbove",
    "clampSecs", "relaxSecs"]
forall (a :: [Symbol]). Vs a
Vs::Vs '["in","control","threshold","slopeBelow","slopeAbove","clampSecs","relaxSecs"])
   (Float -> UA "control" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "control" as
control_ (Float
0::Float), Float -> UA "threshold" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "threshold" as
thresh_ (Float
0.5::Float), Float -> UA "slopeBelow" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "slopeBelow" as
slopeBelow_ (Float
1::Float), Float -> UA "slopeAbove" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "slopeAbove" as
slopeAbove_ (Float
1::Float), Float -> UA "clampSecs" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "clampSecs" as
clampTime_ (Float
0.01::Float), Float -> UA "relaxSecs" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "relaxSecs" as
relaxTime_ (Float
0.1::Float))


--- companderD ::
--- companderD =

-- | Note this can only run at "AR"
-- 
--   \"secs\" is the lookahead time -- if you're coming from SC you can use 'Vivid.UGens.Args.dur_' for consistency
limiter :: (Args '["in"] '["level", "secs"] a) => a -> SDBody a Signal
limiter :: a -> SDBody a Signal
limiter = String
-> CalculationRate
-> Vs '["in", "level", "secs"]
-> (UA "level" (SDBodyArgs a), UA "secs" (SDBodyArgs a))
-> a
-> SDBody a Signal
forall (tags :: [Symbol]) optional userSupplied (args :: [Symbol]).
(GetSymbolVals (Vs tags), FromUA optional, FromUA userSupplied,
 SDBodyArgs optional ~ SDBodyArgs userSupplied,
 SDBodyArgs optional ~ args) =>
String
-> CalculationRate
-> Vs tags
-> optional
-> userSupplied
-> SDBody' args Signal
makeUGen
   String
"Limiter" CalculationRate
AR
   (Vs '["in", "level", "secs"]
forall (a :: [Symbol]). Vs a
Vs::Vs '["in","level","secs"])
   (Float -> UA "level" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "level" as
level_ (Float
1::Float), Float -> UA "secs" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "secs" as
secs_ (Float
0.01::Float))

-- | Note this can only run at "AR"
-- 
--   \"secs\" is the lookahead time -- if you're coming from SC you can use 'Vivid.UGens.Args.dur_'
normalizer :: (Args '["in"] '["level", "secs"] a) => a -> SDBody a Signal
normalizer :: a -> SDBody a Signal
normalizer = String
-> CalculationRate
-> Vs '["in", "level", "secs"]
-> (UA "level" (SDBodyArgs a), UA "secs" (SDBodyArgs a))
-> a
-> SDBody a Signal
forall (tags :: [Symbol]) optional userSupplied (args :: [Symbol]).
(GetSymbolVals (Vs tags), FromUA optional, FromUA userSupplied,
 SDBodyArgs optional ~ SDBodyArgs userSupplied,
 SDBodyArgs optional ~ args) =>
String
-> CalculationRate
-> Vs tags
-> optional
-> userSupplied
-> SDBody' args Signal
makeUGen
   String
"Normalizer" CalculationRate
AR
   (Vs '["in", "level", "secs"]
forall (a :: [Symbol]). Vs a
Vs::Vs '["in","level","secs"])
   (Float -> UA "level" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "level" as
level_ (Float
1::Float), Float -> UA "secs" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "secs" as
secs_ (Float
0.01::Float))