content: -- | Most of these only run at audio rate ('AR')
  
  {-# LANGUAGE DataKinds #-}
  
  {-# LANGUAGE NoIncoherentInstances #-}
  {-# LANGUAGE NoMonomorphismRestriction #-}
  {-# LANGUAGE NoUndecidableInstances #-}
  
  module Vivid.UGens.Convolution (
       convolution
     , convolution2
     , convolution2L
     , convolution3
     , partConv
  ---   , stereoConvolution2L
     ) where
  
  import Vivid.SC.SynthDef.Types (CalculationRate(..))
  import Vivid.UGens.Args
  import Vivid.SynthDef
  import Vivid.SynthDef.FromUA
  
  convolution :: (Args '["in", "kernel"] '["frameSize"] a) => a -> SDBody a Signal
  convolution = makeUGen
     "Convolution" AR
     (Vs::Vs '["in", "kernel", "frameSize"])
     (frameSize_ ((512)::Float))
  
  convolution2 :: (Args '["in", "kernel"] '["trigger", "frameSize"] a) => a -> SDBody a Signal
  convolution2 = makeUGen
     "Convolution2" AR
     (Vs::Vs '["in", "kernel", "trigger", "frameSize"])
     (trigger_ ((0)::Float), frameSize_ ((2048)::Float))
  
  convolution2L :: (Args '["in", "kernel"] '["trigger", "frameSize", "crossFade"] a) => a -> SDBody a Signal
  convolution2L = makeUGen
     "Convolution2L" AR
     (Vs::Vs '["in", "kernel", "trigger", "frameSize", "crossFade"])
     (trigger_ ((0)::Float), frameSize_ ((2048)::Float), crossFade_ (((1)::Float)))
  
  -- | This one can run at control rate ('KR').
  --   It's inefficient so only useful for very small kernels or control rate.
  convolution3 :: (Args '["in", "kernel"] '["trigger", "frameSize"] a) => a -> SDBody a Signal
  convolution3 = makeUGen
     "Convolution3" AR
     (Vs::Vs '["in", "kernel", "trigger", "frameSize"])
     (trigger_ ((0)::Float), frameSize_ ((2048)::Float))
  
  partConv :: (Args '["in", "fftSize", "irBufNum"] '[] a) => a -> SDBody a Signal
  partConv = makeUGen
     "PartConv" AR
     (Vs::Vs '["in", "fftSize", "ifBufNum"])
     NoDefaults
  
  --- stereoConvolution2L ::
  --- stereoConvolution2L =
  