{-# LANGUAGE DataKinds #-}

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

module Vivid.UGens.Triggers (
     -- in UGens.Filters:
   --   changed
---     gate
     -- in UGens.InOut
   -- , inTrig
---   , lastValue
     latch
     -- In UGens.Buffer:
   -- , phasor
   , pulseCount
   , pulseDivider
---   , sendReply
---   , sendTrig
---   , setResetFF
---   , stepper
   , sweep
     -- in UGens.Conversions:
   -- , t2a
   -- , t2k
---   , tChoose
     -- In UGens.Delays:
   -- , tDelay
---   , tExpRand
---   , tIRand
---   , tRand
---   , tWChoose
---   , tWIndex
---   , timer
---   , toggleFF
---   , trig
---   , trig1
   ) where

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

--- gate ::
--- gate =
--- lastValue ::
--- lastValue =

latch :: (Args '["in", "trigger"] '[] a) => a -> SDBody a Signal
latch = makeUGen
   "Latch" AR
   (Vs::Vs '["in", "trigger"])
   NoDefaults

pulseCount :: Args '[] '["trigger", "reset"] a => a -> SDBody a Signal
pulseCount = makeUGen
   "PulseCount" AR
   (Vs::Vs '["trigger", "reset"])
   (trig_ (0::Float), reset_ (0::Float))

-- | \"Outputs one inpulse each time it receives a certain number of triggers at its input\"
-- 
--   The trigger \"can be any signal. A trigger happens when the signal changes from
--   non-positive to positive\"
-- 
--   \"div\" is the number of pulses to divide by. Default is 2.
-- 
--   \"start\" is the starting value of the count
-- 
--   Can be 'AR' or 'KR'
pulseDivider :: Args '["trigger"] '["div", "start"] a => a -> SDBody a Signal
pulseDivider = makeUGen
   "PulseDivider" AR
   (Vs::Vs '["trigger", "div", "start"])
   (div_ (2::Float), start_ (0::Float))

--- sendReply ::
--- sendReply =
--- sendTrig ::
--- sendTrig =
--- setResetFF ::
--- setResetFF =
--- stepper ::
--- stepper =

sweep :: Args '["trigger"] '["rate"] a => a -> SDBody a Signal
sweep = makeUGen
   "Sweep" AR
   (Vs::Vs '["trigger", "rate"])
   (rate_ (1::Float))

--- tChoose ::
--- tChoose =
--- tExpRand ::
--- tExpRand =
--- tIRand ::
--- tIRand =
--- tRand ::
--- tRand =
--- tWChoose ::
--- tWChoose =
--- tWIndex ::
--- tWIndex =
--- timer ::
--- timer =
--- toggleFF ::
--- toggleFF =
--- trig ::
--- trig =
--- trig1 ::
--- trig1 =