{-# LANGUAGE DataKinds #-}

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

module Vivid.UGens.Generators.Chaotic (
     cuspL
   , cuspN
---   , fbSineC
---   , fbSineL
---   , fbSineN
---   , gbmanL
---   , gbmanN
---   , henonC
---   , henonL
---   , henonN
---   , latoocarfianC
---   , latoocarfianL
---   , latoocarfianN
   , linCongC
   , linCongL
   , linCongN
---   , logistic
---   , lorenzL
---   , quadC
---   , quadL
---   , quadN
---   , sinOscFB
---   , standardL
---   , standardN
   ) where

import Vivid.UGens.Args
import Vivid.SynthDef
import Vivid.SynthDef.FromUA

-- | "A linear-interpolating sound generator based on the difference equation:
-- 
--   x[n+1] = a - b * sqrt(abs(x[n]))"
-- 
--   Only has an AR instance
cuspL :: (Args '[] '["freq", "a", "b", "xi"] a) => a -> SDBody a Signal
cuspL = makeUGen
   "CuspL" AR
   (Vs::Vs '["freq", "a", "b", "xi"])
   (freq_ (22050::Float), a_ (1::Float), b_ (1.9::Float), xi_ (0::Float))

-- | "A non-interpolating sound generator based on the difference equation:
-- 
--    x[n+1] = a - b * sqrt(abs(x[n]))"
-- 
--    Only has an AR instance.
cuspN :: (Args '[] '["freq", "a", "b", "xi"] a) => a -> SDBody a Signal
cuspN = makeUGen
   "CuspN" AR
   (Vs::Vs '["freq", "a", "b", "xi"])
   (freq_ (22050::Float), a_ (1::Float), b_ (1.9::Float), xi_ (0::Float))

--- fbSineC ::
--- fbSineC =
--- fbSineL ::
--- fbSineL =
--- fbSineN ::
--- fbSineN =
--- gbmanL ::
--- gbmanL =
--- gbmanN ::
--- gbmanN =
--- henonC ::
--- henonC =
--- henonL ::
--- henonL =
--- henonN ::
--- henonN =
--- latoocarfianC ::
--- latoocarfianC =
--- latoocarfianL ::
--- latoocarfianL =
--- latoocarfianN ::
--- latoocarfianN =

-- | "A cubic-interpolating sound generator based on the difference equation:
-- 
--   x[n+1] = (a * x[n] + c) % m
-- 
--   The output signal is automatically scaled to a range of [-1, 1]."
--  
--   Only has a "AR" method
linCongC :: (Args '[] '["freq", "a", "c", "m", "xi"] a) => a -> SDBody a Signal
linCongC = makeUGen
   "LinCongC" AR
   (Vs::Vs '["freq", "a", "c", "m", "xi"])
   (freq_ (22050::Float), a_ (1.1::Float), c_ (0.13::Float), m_ (1::Float), xi_ (0::Float))

-- | "A linear-interpolating sound generator based on the difference equation:
-- 
--   x[n+1] = (a * x[n] + c) % m
-- 
--   The output signal is automatically scaled to a range of [-1, 1]."
-- 
--   Only has a "AR" method
linCongL :: (Args '[] '["freq", "a", "c", "m", "xi"] a) => a -> SDBody a Signal
linCongL = makeUGen
   "LinCongL" AR
   (Vs::Vs '["freq", "a", "c", "m", "xi"])
   (freq_ (22050::Float), a_ (1.1::Float), c_ (0.13::Float), m_ (1::Float), xi_ (0::Float))

-- | "A non-interpolating sound generator based on the difference equation:
-- 
--   x[n+1] = (a * x[n] + c) % m
-- 
--   The output signal is automatically scaled to a range of [-1, 1]."
-- 
--   Only has a "AR" method
linCongN :: (Args '[] '["freq", "a", "c", "m", "xi"] a) => a -> SDBody a Signal
linCongN = makeUGen
   "LinCongN" AR
   (Vs::Vs '["freq", "a", "c", "m", "xi"])
   (freq_ (22050::Float), a_ (1.1::Float), c_ (0.13::Float), m_ (1::Float), xi_ (0::Float))

--- logistic ::
--- logistic =
--- lorenzL ::
--- lorenzL =
--- quadC ::
--- quadC =
--- quadL ::
--- quadL =
--- quadN ::
--- quadN =
--- sinOscFB ::
--- sinOscFB =
--- standardL ::
--- standardL =
--- standardN ::
--- standardN =