content: -- | These UGens only run at audio rate ('AR')
  -- 
  --   They also can cause CPU spikes when their parameters are changed!
  
  {-# LANGUAGE DataKinds #-}
  
  {-# LANGUAGE NoIncoherentInstances #-}
  {-# LANGUAGE NoMonomorphismRestriction #-}
  {-# LANGUAGE NoUndecidableInstances #-}
  
  module Vivid.UGens.Filters.BEQSuite (
       bAllpass
     , bBandPass
     , bBandStop
     , bHiPass
  ---   , bHiPass4
     , bHiShelf
     , bLowPass
     , bLowPass4
     , bLowShelf
     , bPeakEQ
     ) where
  
  import Vivid.SC.SynthDef.Types (CalculationRate(..))
  import Vivid.SynthDef
  import Vivid.SynthDef.FromUA
  import Vivid.UGens.Args
  
  import Vivid.UGens.Algebraic
  import Vivid.UGens.Filters.Linear (sos)
  import Vivid.UGens.Info (sampleRate, sampleDur)
  
  -- import qualified Data.List as L
  -- import Data.Maybe
  import Data.Proxy
  
  bAllpass :: (Args '["in"] '["freq", "rq"] a) => a -> SDBody a Signal
  bAllpass = makeUGen
     "BAllPass" AR
     (Vs::Vs '["in", "freq", "rq"])
     (freq_ (1200::Float), rq_ (1::Float))
  
  -- | Band-pass filter
  bBandPass :: (Args '["in"] '["freq", "bw"] a) => a -> SDBody a Signal
  bBandPass = makeUGen
     "BBandPass" AR
     (Vs::Vs '["in", "freq", "bw"])
     (freq_ (1200::Float), bw_ (1::Float))
  
  bBandStop :: (Args '["in"] '["freq", "bw"] a) => a -> SDBody a Signal
  bBandStop = makeUGen
     "BBandStop" AR
     (Vs::Vs '["in", "freq", "bw"])
     (freq_ (1200::Float), bw_ (1::Float))
  
  -- | This is only in AR
  bHiPass :: (Args '["in"] '["freq", "rq"] a) => a -> SDBody a Signal
  bHiPass = makeUGen
     "BHiPass" AR
     (Vs::Vs '["in", "freq", "rq"])
     (freq_ (1200::Float), rq_ (1::Float))
  
  -- bHiPass4 :: (Args '["in"] '["freq", "rq"] a) => a -> SDBody a Signal
  --- bHiPass4 ::
  --- bHiPass4 =
  
  bHiShelf :: (Args '["in"] '["freq", "rs", "db"] a) => a -> SDBody a Signal
  bHiShelf = makeUGen
     "BHiShelf" AR
     (Vs::Vs '["in", "freq", "rs", "db"])
     (freq_ (1200::Float), rs_ (1::Float), db_ (0::Float))
  
  bLowPass :: (Args '["in"] '["freq", "rq"] a) => a -> SDBody a Signal
  bLowPass = makeUGen
     "BLowPass" AR
     (Vs::Vs '["in", "freq", "rq"])
     (freq_ (1200::Float), rq_ (1::Float))
  
  -- Checked this w/ 2 different inputs:
  bLowPass4 :: (Args '["in"] '["freq","rq"] a) => a -> SDBody a Signal
  bLowPass4 as = do
     freq <- uaArgValWDefault (1200::Float) as (Proxy::Proxy "freq")
     rq <- uaArgValWDefault (1::Float) as (Proxy::Proxy "rq")
     in' <- as `uaArgVal` (Proxy::Proxy "in")
  
     -- We don't actually use 'sRate' -- why?:
     _sRate <- sampleRate
     sDur <- sampleDur
     four <- (Constant $ 2*pi)~*sDur~*freq
     five <- uOp Cos four
     six <- {- 1 ~- five -} (Constant 1) ~- five
     seven <- six ~* (Constant 0.5)
     eight <- five ~* (Constant 2)
     nine <- uOp Sin four
     ten <- nine ~* (Constant 0.5)
     eleven <- ten ~* uOp Sqrt rq
     twelve <- Constant 1 ~+ eleven
     thirteen <- uOp Recip twelve
     fourteen <- seven ~* thirteen
     fifteen <- six ~* thirteen
     sixteen <- eight ~* thirteen
     seventeen <- uOp Neg thirteen
     eighteen <- Constant 1 ~- eleven
     nineteen <- eighteen ~* seventeen
     twenty <- sos (in_ in', a0_ fourteen, a1_ fifteen, a2_ fourteen, b1_ sixteen, b2_ nineteen)
     twentyOne <- sos (in_ twenty, a0_ fourteen, a1_ fifteen, a2_ fourteen, b1_ sixteen, b2_ nineteen)
     return twentyOne
  
  bLowShelf :: (Args '["in"] '["freq", "rs", "db"] a) => a -> SDBody a Signal
  bLowShelf = makeUGen
     "BLowShelf" AR
     (Vs::Vs '["in", "freq", "rs", "db"])
     (freq_ (1200::Float), rs_ (1::Float), db_ (0::Float))
  
  
  bPeakEQ :: (Args '["in"] '["freq", "rq", "db"] a) => a -> SDBody a Signal
  bPeakEQ = makeUGen
     "BPeakEQ" AR
     (Vs::Vs '["in", "freq", "rq", "db"])
     (freq_ (1200::Float), rq_ (1::Float), db_ (0::Float))
  