module Csound.Typed.Plugins.ZeroDelayConvolution(  
	 ZConvSpec(..), zconv, zconv'
) where
import Data.Boolean
import Data.Default
import Control.Monad.Trans.Class
import Control.Applicative
import Csound.Dynamic
import Csound.Typed.Types
import Csound.Typed.GlobalState
import qualified Csound.Typed.GlobalState.Elements as E(zeroDelayConvolutionPlugin)
data ZConvSpec = ZConvSpec
    { zconvPartSize :: D 
    , zconvRatio    :: D 
    , zconvNp       :: D 
    }
instance Default ZConvSpec where
    def = ZConvSpec 64 4 6
zconv :: Tab -> Sig -> Sig
zconv = zconv' def
zconv' :: ZConvSpec -> Tab -> Sig -> Sig
zconv' (ZConvSpec ipart irat inp) ifn ain = fromGE $ do
    addUdoPlugin E.zeroDelayConvolutionPlugin
    f <$> toGE ain <*> toGE ipart <*> toGE irat <*> toGE inp <*> toGE ifn
    where f ain ipart irat inp ifn = opcs "ZConv" [(Ar, [Ar, Ir, Ir, Ir, Ir])] [ain, ipart, irat, inp, ifn]