-- | 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 =