-- | 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 :: a -> SDBody a Signal
convolution = String
-> CalculationRate
-> Vs '["in", "kernel", "frameSize"]
-> UA "frameSize" (SDBodyArgs a)
-> a
-> SDBody a Signal
forall (tags :: [Symbol]) optional userSupplied (args :: [Symbol]).
(GetSymbolVals (Vs tags), FromUA optional, FromUA userSupplied,
 SDBodyArgs optional ~ SDBodyArgs userSupplied,
 SDBodyArgs optional ~ args) =>
String
-> CalculationRate
-> Vs tags
-> optional
-> userSupplied
-> SDBody' args Signal
makeUGen
   String
"Convolution" CalculationRate
AR
   (Vs '["in", "kernel", "frameSize"]
forall (a :: [Symbol]). Vs a
Vs::Vs '["in", "kernel", "frameSize"])
   (Float -> UA "frameSize" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "frameSize" as
frameSize_ ((Float
512)::Float))

convolution2 :: (Args '["in", "kernel"] '["trigger", "frameSize"] a) => a -> SDBody a Signal
convolution2 :: a -> SDBody a Signal
convolution2 = String
-> CalculationRate
-> Vs '["in", "kernel", "trigger", "frameSize"]
-> (UA "trigger" (SDBodyArgs a), UA "frameSize" (SDBodyArgs a))
-> a
-> SDBody a Signal
forall (tags :: [Symbol]) optional userSupplied (args :: [Symbol]).
(GetSymbolVals (Vs tags), FromUA optional, FromUA userSupplied,
 SDBodyArgs optional ~ SDBodyArgs userSupplied,
 SDBodyArgs optional ~ args) =>
String
-> CalculationRate
-> Vs tags
-> optional
-> userSupplied
-> SDBody' args Signal
makeUGen
   String
"Convolution2" CalculationRate
AR
   (Vs '["in", "kernel", "trigger", "frameSize"]
forall (a :: [Symbol]). Vs a
Vs::Vs '["in", "kernel", "trigger", "frameSize"])
   (Float -> UA "trigger" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "trigger" as
trigger_ ((Float
0)::Float), Float -> UA "frameSize" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "frameSize" as
frameSize_ ((Float
2048)::Float))

convolution2L :: (Args '["in", "kernel"] '["trigger", "frameSize", "crossFade"] a) => a -> SDBody a Signal
convolution2L :: a -> SDBody a Signal
convolution2L = String
-> CalculationRate
-> Vs '["in", "kernel", "trigger", "frameSize", "crossFade"]
-> (UA "trigger" (SDBodyArgs a), UA "frameSize" (SDBodyArgs a),
    UA "crossFade" (SDBodyArgs a))
-> a
-> SDBody a Signal
forall (tags :: [Symbol]) optional userSupplied (args :: [Symbol]).
(GetSymbolVals (Vs tags), FromUA optional, FromUA userSupplied,
 SDBodyArgs optional ~ SDBodyArgs userSupplied,
 SDBodyArgs optional ~ args) =>
String
-> CalculationRate
-> Vs tags
-> optional
-> userSupplied
-> SDBody' args Signal
makeUGen
   String
"Convolution2L" CalculationRate
AR
   (Vs '["in", "kernel", "trigger", "frameSize", "crossFade"]
forall (a :: [Symbol]). Vs a
Vs::Vs '["in", "kernel", "trigger", "frameSize", "crossFade"])
   (Float -> UA "trigger" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "trigger" as
trigger_ ((Float
0)::Float), Float -> UA "frameSize" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "frameSize" as
frameSize_ ((Float
2048)::Float), Float -> UA "crossFade" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "crossFade" as
crossFade_ (((Float
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 :: a -> SDBody a Signal
convolution3 = String
-> CalculationRate
-> Vs '["in", "kernel", "trigger", "frameSize"]
-> (UA "trigger" (SDBodyArgs a), UA "frameSize" (SDBodyArgs a))
-> a
-> SDBody a Signal
forall (tags :: [Symbol]) optional userSupplied (args :: [Symbol]).
(GetSymbolVals (Vs tags), FromUA optional, FromUA userSupplied,
 SDBodyArgs optional ~ SDBodyArgs userSupplied,
 SDBodyArgs optional ~ args) =>
String
-> CalculationRate
-> Vs tags
-> optional
-> userSupplied
-> SDBody' args Signal
makeUGen
   String
"Convolution3" CalculationRate
AR
   (Vs '["in", "kernel", "trigger", "frameSize"]
forall (a :: [Symbol]). Vs a
Vs::Vs '["in", "kernel", "trigger", "frameSize"])
   (Float -> UA "trigger" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "trigger" as
trigger_ ((Float
0)::Float), Float -> UA "frameSize" (SDBodyArgs a)
forall s (as :: [Symbol]). ToSig s as => s -> UA "frameSize" as
frameSize_ ((Float
2048)::Float))

partConv :: (Args '["in", "fftSize", "irBufNum"] '[] a) => a -> SDBody a Signal
partConv :: a -> SDBody a Signal
partConv = String
-> CalculationRate
-> Vs '["in", "fftSize", "ifBufNum"]
-> NoDefaults (SDBodyArgs a)
-> a
-> SDBody a Signal
forall (tags :: [Symbol]) optional userSupplied (args :: [Symbol]).
(GetSymbolVals (Vs tags), FromUA optional, FromUA userSupplied,
 SDBodyArgs optional ~ SDBodyArgs userSupplied,
 SDBodyArgs optional ~ args) =>
String
-> CalculationRate
-> Vs tags
-> optional
-> userSupplied
-> SDBody' args Signal
makeUGen
   String
"PartConv" CalculationRate
AR
   (Vs '["in", "fftSize", "ifBufNum"]
forall (a :: [Symbol]). Vs a
Vs::Vs '["in", "fftSize", "ifBufNum"])
   NoDefaults (SDBodyArgs a)
forall (args :: [Symbol]). NoDefaults args
NoDefaults

--- stereoConvolution2L ::
--- stereoConvolution2L =