{-# Language TypeFamilies, TypeSynonymInstances, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts #-}
-- | Argument modifiers. Functions to transform arguments of the function with flexibility.
module Csound.Air.ModArg(
    -- * Basic class
    ModArg1(..), ModArg2(..), ModArg3(..), ModArg4(..),
    -- ** Delayed
    delModArg1, delModArg2, delModArg3, delModArg4,

    -- * Oscillators
    oscArg1, oscArg2, oscArg3, oscArg4,    
    triArg1, triArg2, triArg3, triArg4,
    sqrArg1, sqrArg2, sqrArg3, sqrArg4,
    sawArg1, sawArg2, sawArg3, sawArg4,

    -- ** Random phase
    rndOscArg1, rndOscArg2, rndOscArg3, rndOscArg4,    
    rndTriArg1, rndTriArg2, rndTriArg3, rndTriArg4,
    rndSqrArg1, rndSqrArg2, rndSqrArg3, rndSqrArg4,
    rndSawArg1, rndSawArg2, rndSawArg3, rndSawArg4,

    -- ** Delayed
    delOscArg1, delOscArg2, delOscArg3, delOscArg4,    
    delTriArg1, delTriArg2, delTriArg3, delTriArg4,
    delSqrArg1, delSqrArg2, delSqrArg3, delSqrArg4,
    delSawArg1, delSawArg2, delSawArg3, delSawArg4,

    -- ** Delayed with Random phase
    delRndOscArg1, delRndOscArg2, delRndOscArg3, delRndOscArg4,    
    delRndTriArg1, delRndTriArg2, delRndTriArg3, delRndTriArg4,
    delRndSqrArg1, delRndSqrArg2, delRndSqrArg3, delRndSqrArg4,
    delRndSawArg1, delRndSawArg2, delRndSawArg3, delRndSawArg4,

    -- * Noise
    noiseArg1, noiseArg2, noiseArg3, noiseArg4,
    jitArg1, jitArg2, jitArg3, jitArg4,
    gaussArg1, gaussArg2, gaussArg3, gaussArg4,
    gaussiArg1, gaussiArg2, gaussiArg3, gaussiArg4,

    -- ** Delayed
    delNoiseArg1, delNoiseArg2, delNoiseArg3, delNoiseArg4,
    delJitArg1, delJitArg2, delJitArg3, delJitArg4,
    delGaussArg1, delGaussArg2, delGaussArg3, delGaussArg4,
    delGaussiArg1, delGaussiArg2, delGaussiArg3, delGaussiArg4,

    -- * Envelopes
    adsrArg1, adsrArg2, adsrArg3, adsrArg4,
    xadsrArg1, xadsrArg2, xadsrArg3, xadsrArg4,

    -- ** Delayed
    delAdsrArg1, delAdsrArg2, delAdsrArg3, delAdsrArg4,
    delXadsrArg1, delXadsrArg2, delXadsrArg3, delXadsrArg4

) where

import Csound.Typed
import Csound.Typed.Opcode(gauss, gaussi, jitter, linseg, linsegr, expsegr)
import Csound.Air.Wave
import Csound.Air.Envelope
import Csound.SigSpace

-- trumpet:
-- dac $ mul 1.3 $ mixAt 0.15 largeHall2 $ midi $ onMsg (\cps -> (mul (linsegr [0,0.01, 1, 3, 0.2] 0.2 0) . at (jitterArg1 (0.15 + 0.05 * uosc 0.2) 3 20  alp1 (mul (fades 0.2 0.2) $ 2700 + 0.6 * cps) 0.2) . gaussArg1 0.03 (\x -> return (saw x) + mul (0.12 * expseg [1, 2, 0.1]) (bat (alp1 cps 0.4) white))) cps)

delEnv :: SigSpace a => D -> D -> a -> a
delEnv delTime riseTime asig = mul (linseg [0, delTime, 0, riseTime, 1]) asig

delModArg1 :: (SigSpace a, ModArg1 a b) => D -> D -> Sig -> a -> b -> ModArgOut1 a b
delModArg1 delTime riseTime depth modSig f = modArg1 (delEnv delTime riseTime depth) modSig f

delModArg2 :: (SigSpace a, ModArg2 a b) => D -> D -> Sig -> a -> b -> ModArgOut2 a b
delModArg2 delTime riseTime depth modSig f = modArg2 (delEnv delTime riseTime depth) modSig f

delModArg3 :: (SigSpace a, ModArg3 a b) => D -> D -> Sig -> a -> b -> ModArgOut3 a b
delModArg3 delTime riseTime depth modSig f = modArg3 (delEnv delTime riseTime depth) modSig f

delModArg4 :: (SigSpace a, ModArg4 a b) => D -> D -> Sig -> a -> b -> ModArgOut4 a b
delModArg4 delTime riseTime depth modSig f = modArg4 (delEnv delTime riseTime depth) modSig f

-- adsr mod

adsrArg1 :: (ModArg1 Sig b) => Sig -> D -> D -> D -> D -> b -> ModArgOut1 Sig b
adsrArg1 depth a d s r f = modArg1 depth (leg a d s r) f

adsrArg2 :: (ModArg2 Sig b) => Sig -> D -> D -> D -> D -> b -> ModArgOut2 Sig b
adsrArg2 depth a d s r f = modArg2 depth (leg a d s r) f

adsrArg3 :: (ModArg3 Sig b) => Sig -> D -> D -> D -> D -> b -> ModArgOut3 Sig b
adsrArg3 depth a d s r f = modArg3 depth (leg a d s r) f

adsrArg4 :: (ModArg4 Sig b) => Sig -> D -> D -> D -> D -> b -> ModArgOut4 Sig b
adsrArg4 depth a d s r f = modArg4 depth (leg a d s r) f

-- delayed adsr mod

delLeg :: D -> D -> D -> D -> D -> Sig
delLeg delTime a d s r = linsegr [0, delTime, 0, a, 1, d, s] r 0

delAdsrArg1 :: (ModArg1 Sig b) => D -> Sig -> D -> D -> D -> D -> b -> ModArgOut1 Sig b
delAdsrArg1 delTime depth a d s r f = modArg1 depth (delLeg delTime a d s r) f

delAdsrArg2 :: (ModArg2 Sig b) => D -> Sig -> D -> D -> D -> D -> b -> ModArgOut2 Sig b
delAdsrArg2 delTime depth a d s r f = modArg2 depth (delLeg delTime a d s r) f

delAdsrArg3 :: (ModArg3 Sig b) => D -> Sig -> D -> D -> D -> D -> b -> ModArgOut3 Sig b
delAdsrArg3 delTime depth a d s r f = modArg3 depth (delLeg delTime a d s r) f

delAdsrArg4 :: (ModArg4 Sig b) => D -> Sig -> D -> D -> D -> D -> b -> ModArgOut4 Sig b
delAdsrArg4 delTime depth a d s r f = modArg4 depth (delLeg delTime a d s r) f

-- expon adsr mod

xadsrArg1 :: (ModArg1 Sig b) => Sig -> D -> D -> D -> D -> b -> ModArgOut1 Sig b
xadsrArg1 depth a d s r f = modArg1 depth (xeg a d s r) f

xadsrArg2 :: (ModArg2 Sig b) => Sig -> D -> D -> D -> D -> b -> ModArgOut2 Sig b
xadsrArg2 depth a d s r f = modArg2 depth (xeg a d s r) f

xadsrArg3 :: (ModArg3 Sig b) => Sig -> D -> D -> D -> D -> b -> ModArgOut3 Sig b
xadsrArg3 depth a d s r f = modArg3 depth (xeg a d s r) f

xadsrArg4 :: (ModArg4 Sig b) => Sig -> D -> D -> D -> D -> b -> ModArgOut4 Sig b
xadsrArg4 depth a d s r f = modArg4 depth (xeg a d s r) f

-- delayed expon adsr mod

delXeg :: D -> D -> D -> D -> D -> Sig
delXeg delTime a d s r = expsegr [0.001, delTime, 0.001, a, 1, d, s] r 0.001

delXadsrArg1 :: (ModArg1 Sig b) => D -> Sig -> D -> D -> D -> D -> b -> ModArgOut1 Sig b
delXadsrArg1 delTime depth a d s r f = modArg1 depth (delXeg delTime a d s r) f

delXadsrArg2 :: (ModArg2 Sig b) => D -> Sig -> D -> D -> D -> D -> b -> ModArgOut2 Sig b
delXadsrArg2 delTime depth a d s r f = modArg2 depth (delXeg delTime a d s r) f

delXadsrArg3 :: (ModArg3 Sig b) => D -> Sig -> D -> D -> D -> D -> b -> ModArgOut3 Sig b
delXadsrArg3 delTime depth a d s r f = modArg3 depth (delXeg delTime a d s r) f

delXadsrArg4 :: (ModArg4 Sig b) => D -> Sig -> D -> D -> D -> D -> b -> ModArgOut4 Sig b
delXadsrArg4 delTime depth a d s r f = modArg4 depth (delXeg delTime a d s r) f

-- oscil lfo

oscArg1 :: (ModArg1 Sig b) => Sig -> Sig -> b -> ModArgOut1 Sig b
oscArg1 depth rate f = modArg1 depth (osc rate) f

oscArg2 :: (ModArg2 Sig b) => Sig -> Sig -> b -> ModArgOut2 Sig b
oscArg2 depth rate f = modArg2 depth (osc rate) f

oscArg3 :: (ModArg3 Sig b) => Sig -> Sig -> b -> ModArgOut3 Sig b
oscArg3 depth rate f = modArg3 depth (osc rate) f

oscArg4 :: (ModArg4 Sig b) => Sig -> Sig -> b -> ModArgOut4 Sig b
oscArg4 depth rate f = modArg4 depth (osc rate) f

-- delayed oscil lfo

delOscArg1 :: (ModArg1 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut1 Sig b
delOscArg1 delTime riseTime depth rate f = delModArg1 delTime riseTime depth (osc rate) f

delOscArg2 :: (ModArg2 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut2 Sig b
delOscArg2 delTime riseTime depth rate f = delModArg2 delTime riseTime depth (osc rate) f

delOscArg3 :: (ModArg3 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut3 Sig b
delOscArg3 delTime riseTime depth rate f = delModArg3 delTime riseTime depth (osc rate) f

delOscArg4 :: (ModArg4 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut4 Sig b
delOscArg4 delTime riseTime depth rate f = delModArg4 delTime riseTime depth (osc rate) f

-- tri lfo

triArg1 :: (ModArg1 Sig b) => Sig -> Sig -> b -> ModArgOut1 Sig b
triArg1 depth rate f = modArg1 depth (tri rate) f

triArg2 :: (ModArg2 Sig b) => Sig -> Sig -> b -> ModArgOut2 Sig b
triArg2 depth rate f = modArg2 depth (tri rate) f

triArg3 :: (ModArg3 Sig b) => Sig -> Sig -> b -> ModArgOut3 Sig b
triArg3 depth rate f = modArg3 depth (tri rate) f

triArg4 :: (ModArg4 Sig b) => Sig -> Sig -> b -> ModArgOut4 Sig b
triArg4 depth rate f = modArg4 depth (tri rate) f

-- delayed tri lfo

delTriArg1 :: (ModArg1 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut1 Sig b
delTriArg1 delTime riseTime depth rate f = delModArg1 delTime riseTime depth (tri rate) f

delTriArg2 :: (ModArg2 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut2 Sig b
delTriArg2 delTime riseTime depth rate f = delModArg2 delTime riseTime depth (tri rate) f

delTriArg3 :: (ModArg3 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut3 Sig b
delTriArg3 delTime riseTime depth rate f = delModArg3 delTime riseTime depth (tri rate) f

delTriArg4 :: (ModArg4 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut4 Sig b
delTriArg4 delTime riseTime depth rate f = delModArg4 delTime riseTime depth (tri rate) f

-- sqr lfo

sqrArg1 :: (ModArg1 Sig b) => Sig -> Sig -> b -> ModArgOut1 Sig b
sqrArg1 depth rate f = modArg1 depth (sqr rate) f

sqrArg2 :: (ModArg2 Sig b) => Sig -> Sig -> b -> ModArgOut2 Sig b
sqrArg2 depth rate f = modArg2 depth (sqr rate) f

sqrArg3 :: (ModArg3 Sig b) => Sig -> Sig -> b -> ModArgOut3 Sig b
sqrArg3 depth rate f = modArg3 depth (sqr rate) f

sqrArg4 :: (ModArg4 Sig b) => Sig -> Sig -> b -> ModArgOut4 Sig b
sqrArg4 depth rate f = modArg4 depth (sqr rate) f

-- sqr lfo

delSqrArg1 :: (ModArg1 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut1 Sig b
delSqrArg1 delTime riseTime depth rate f = delModArg1 delTime riseTime depth (sqr rate) f

delSqrArg2 :: (ModArg2 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut2 Sig b
delSqrArg2 delTime riseTime depth rate f = delModArg2 delTime riseTime depth (sqr rate) f

delSqrArg3 :: (ModArg3 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut3 Sig b
delSqrArg3 delTime riseTime depth rate f = delModArg3 delTime riseTime depth (sqr rate) f

delSqrArg4 :: (ModArg4 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut4 Sig b
delSqrArg4 delTime riseTime depth rate f = delModArg4 delTime riseTime depth (sqr rate) f

-- saw lfo

sawArg1 :: (ModArg1 Sig b) => Sig -> Sig -> b -> ModArgOut1 Sig b
sawArg1 depth rate f = modArg1 depth (saw rate) f

sawArg2 :: (ModArg2 Sig b) => Sig -> Sig -> b -> ModArgOut2 Sig b
sawArg2 depth rate f = modArg2 depth (saw rate) f

sawArg3 :: (ModArg3 Sig b) => Sig -> Sig -> b -> ModArgOut3 Sig b
sawArg3 depth rate f = modArg3 depth (saw rate) f

sawArg4 :: (ModArg4 Sig b) => Sig -> Sig -> b -> ModArgOut4 Sig b
sawArg4 depth rate f = modArg4 depth (saw rate) f

-- delayed saw lfo

delSawArg1 :: (ModArg1 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut1 Sig b
delSawArg1 delTime riseTime depth rate f = delModArg1 delTime riseTime depth (saw rate) f

delSawArg2 :: (ModArg2 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut2 Sig b
delSawArg2 delTime riseTime depth rate f = delModArg2 delTime riseTime depth (saw rate) f

delSawArg3 :: (ModArg3 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut3 Sig b
delSawArg3 delTime riseTime depth rate f = delModArg3 delTime riseTime depth (saw rate) f

delSawArg4 :: (ModArg4 Sig b) => D -> D -> Sig -> Sig -> b -> ModArgOut4 Sig b
delSawArg4 delTime riseTime depth rate f = delModArg4 delTime riseTime depth (saw rate) f

-- oscil lfo rnd phase

rndOscArg1 :: (ModArg1 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
rndOscArg1 depth rate f = modArg1 depth (rndOsc rate) f

rndOscArg2 :: (ModArg2 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
rndOscArg2 depth rate f = modArg2 depth (rndOsc rate) f

rndOscArg3 :: (ModArg3 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
rndOscArg3 depth rate f = modArg3 depth (rndOsc rate) f

rndOscArg4 :: (ModArg4 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
rndOscArg4 depth rate f = modArg4 depth (rndOsc rate) f

-- delayed oscil lfo rnd phase

delRndOscArg1 :: (ModArg1 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
delRndOscArg1 delTime riseTime depth rate f = delModArg1 delTime riseTime depth (rndOsc rate) f

delRndOscArg2 :: (ModArg2 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
delRndOscArg2 delTime riseTime depth rate f = delModArg2 delTime riseTime depth (rndOsc rate) f

delRndOscArg3 :: (ModArg3 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
delRndOscArg3 delTime riseTime depth rate f = delModArg3 delTime riseTime depth (rndOsc rate) f

delRndOscArg4 :: (ModArg4 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
delRndOscArg4 delTime riseTime depth rate f = delModArg4 delTime riseTime depth (rndOsc rate) f

-- tri lfo rnd phase

rndTriArg1 :: (ModArg1 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
rndTriArg1 depth rate f = modArg1 depth (rndTri rate) f

rndTriArg2 :: (ModArg2 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
rndTriArg2 depth rate f = modArg2 depth (rndTri rate) f

rndTriArg3 :: (ModArg3 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
rndTriArg3 depth rate f = modArg3 depth (rndTri rate) f

rndTriArg4 :: (ModArg4 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
rndTriArg4 depth rate f = modArg4 depth (rndTri rate) f

-- delayed tri lfo rnd phase

delRndTriArg1 :: (ModArg1 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
delRndTriArg1 delTime riseTime depth rate f = delModArg1 delTime riseTime depth (rndTri rate) f

delRndTriArg2 :: (ModArg2 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
delRndTriArg2 delTime riseTime depth rate f = delModArg2 delTime riseTime depth (rndTri rate) f

delRndTriArg3 :: (ModArg3 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
delRndTriArg3 delTime riseTime depth rate f = delModArg3 delTime riseTime depth (rndTri rate) f

delRndTriArg4 :: (ModArg4 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
delRndTriArg4 delTime riseTime depth rate f = delModArg4 delTime riseTime depth (rndTri rate) f

-- sqr lfo rnd phase

rndSqrArg1 :: (ModArg1 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
rndSqrArg1 depth rate f = modArg1 depth (rndSqr rate) f

rndSqrArg2 :: (ModArg2 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
rndSqrArg2 depth rate f = modArg2 depth (rndSqr rate) f

rndSqrArg3 :: (ModArg3 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
rndSqrArg3 depth rate f = modArg3 depth (rndSqr rate) f

rndSqrArg4 :: (ModArg4 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
rndSqrArg4 depth rate f = modArg4 depth (rndSqr rate) f

-- sqr lfo rnd phase

delRndSqrArg1 :: (ModArg1 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
delRndSqrArg1 delTime riseTime depth rate f = delModArg1 delTime riseTime depth (rndSqr rate) f

delRndSqrArg2 :: (ModArg2 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
delRndSqrArg2 delTime riseTime depth rate f = delModArg2 delTime riseTime depth (rndSqr rate) f

delRndSqrArg3 :: (ModArg3 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
delRndSqrArg3 delTime riseTime depth rate f = delModArg3 delTime riseTime depth (rndSqr rate) f

delRndSqrArg4 :: (ModArg4 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
delRndSqrArg4 delTime riseTime depth rate f = delModArg4 delTime riseTime depth (rndSqr rate) f

-- sqr lfo rnd phase

rndSawArg1 :: (ModArg1 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
rndSawArg1 depth rate f = modArg1 depth (rndSaw rate) f

rndSawArg2 :: (ModArg2 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
rndSawArg2 depth rate f = modArg2 depth (rndSaw rate) f

rndSawArg3 :: (ModArg3 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
rndSawArg3 depth rate f = modArg3 depth (rndSaw rate) f

rndSawArg4 :: (ModArg4 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
rndSawArg4 depth rate f = modArg4 depth (rndSaw rate) f

-- delayed sqr lfo rnd phase

delRndSawArg1 :: (ModArg1 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
delRndSawArg1 delTime riseTime depth rate f = delModArg1 delTime riseTime depth (rndSaw rate) f

delRndSawArg2 :: (ModArg2 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
delRndSawArg2 delTime riseTime depth rate f = delModArg2 delTime riseTime depth (rndSaw rate) f

delRndSawArg3 :: (ModArg3 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
delRndSawArg3 delTime riseTime depth rate f = delModArg3 delTime riseTime depth (rndSaw rate) f

delRndSawArg4 :: (ModArg4 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
delRndSawArg4 delTime riseTime depth rate f = delModArg4 delTime riseTime depth (rndSaw rate) f

-- white noise

noiseArg1 :: (ModArg1 (SE Sig) b) => Sig -> b -> ModArgOut1 (SE Sig) b
noiseArg1 depth f = modArg1 depth white f

noiseArg2 :: (ModArg2 (SE Sig) b) => Sig -> b -> ModArgOut2 (SE Sig) b
noiseArg2 depth f = modArg2 depth white f

noiseArg3 :: (ModArg3 (SE Sig) b) => Sig -> b -> ModArgOut3 (SE Sig) b
noiseArg3 depth f = modArg3 depth white f

noiseArg4 :: (ModArg4 (SE Sig) b) => Sig -> b -> ModArgOut4 (SE Sig) b
noiseArg4 depth f = modArg4 depth white f

-- delayed white noise

delNoiseArg1 :: (ModArg1 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut1 (SE Sig) b
delNoiseArg1 delTime riseTime depth f = delModArg1 delTime riseTime depth white f

delNoiseArg2 :: (ModArg2 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut2 (SE Sig) b
delNoiseArg2 delTime riseTime depth f = delModArg2 delTime riseTime depth white f

delNoiseArg3 :: (ModArg3 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut3 (SE Sig) b
delNoiseArg3 delTime riseTime depth f = delModArg3 delTime riseTime depth white f

delNoiseArg4 :: (ModArg4 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut4 (SE Sig) b
delNoiseArg4 delTime riseTime depth f = delModArg4 delTime riseTime depth white f

-- pink noise

pinkArg1 :: (ModArg1 (SE Sig) b) => Sig -> b -> ModArgOut1 (SE Sig) b
pinkArg1 depth f = modArg1 depth pink f

pinkArg2 :: (ModArg2 (SE Sig) b) => Sig -> b -> ModArgOut2 (SE Sig) b
pinkArg2 depth f = modArg2 depth pink f

pinkArg3 :: (ModArg3 (SE Sig) b) => Sig -> b -> ModArgOut3 (SE Sig) b
pinkArg3 depth f = modArg3 depth pink f

pinkArg4 :: (ModArg4 (SE Sig) b) => Sig -> b -> ModArgOut4 (SE Sig) b
pinkArg4 depth f = modArg4 depth pink f

-- pink noise

delPinkArg1 :: (ModArg1 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut1 (SE Sig) b
delPinkArg1 delTime riseTime depth f = delModArg1 delTime riseTime depth pink f

delPinkArg2 :: (ModArg2 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut2 (SE Sig) b
delPinkArg2 delTime riseTime depth f = delModArg2 delTime riseTime depth pink f

delPinkArg3 :: (ModArg3 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut3 (SE Sig) b
delPinkArg3 delTime riseTime depth f = delModArg3 delTime riseTime depth pink f

delPinkArg4 :: (ModArg4 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut4 (SE Sig) b
delPinkArg4 delTime riseTime depth f = delModArg4 delTime riseTime depth pink f


-- jitter noise

jitArg1 :: (ModArg1 (SE Sig) b) => Sig -> Sig -> Sig -> b -> ModArgOut1 (SE Sig) b 
jitArg1 depth cpsMin cpsMax f = modArg1 depth (jitter 1 cpsMin cpsMax) f

jitArg2 :: (ModArg2 (SE Sig) b) => Sig -> Sig -> Sig -> b -> ModArgOut2 (SE Sig) b 
jitArg2 depth cpsMin cpsMax f = modArg2 depth (jitter 1 cpsMin cpsMax) f

jitArg3 :: (ModArg3 (SE Sig) b) => Sig -> Sig -> Sig -> b -> ModArgOut3 (SE Sig) b 
jitArg3 depth cpsMin cpsMax f = modArg3 depth (jitter 1 cpsMin cpsMax) f

jitArg4 :: (ModArg4 (SE Sig) b) => Sig -> Sig -> Sig -> b -> ModArgOut4 (SE Sig) b 
jitArg4 depth cpsMin cpsMax f = modArg4 depth (jitter 1 cpsMin cpsMax) f

-- jitter noise

delJitArg1 :: (ModArg1 (SE Sig) b) => D -> D -> Sig -> Sig -> Sig -> b -> ModArgOut1 (SE Sig) b 
delJitArg1 delTime riseTime depth cpsMin cpsMax f = delModArg1 delTime riseTime depth (jitter 1 cpsMin cpsMax) f

delJitArg2 :: (ModArg2 (SE Sig) b) => D -> D -> Sig -> Sig -> Sig -> b -> ModArgOut2 (SE Sig) b 
delJitArg2 delTime riseTime depth cpsMin cpsMax f = delModArg2 delTime riseTime depth (jitter 1 cpsMin cpsMax) f

delJitArg3 :: (ModArg3 (SE Sig) b) => D -> D -> Sig -> Sig -> Sig -> b -> ModArgOut3 (SE Sig) b 
delJitArg3 delTime riseTime depth cpsMin cpsMax f = delModArg3 delTime riseTime depth (jitter 1 cpsMin cpsMax) f

delJitArg4 :: (ModArg4 (SE Sig) b) => D -> D -> Sig -> Sig -> Sig -> b -> ModArgOut4 (SE Sig) b 
delJitArg4 delTime riseTime depth cpsMin cpsMax f = delModArg4 delTime riseTime depth (jitter 1 cpsMin cpsMax) f

-- gauss noise

gaussArg1 :: (ModArg1 (SE Sig) b) => Sig -> b -> ModArgOut1 (SE Sig) b
gaussArg1 depth f = modArg1 depth (gauss 1) f

gaussArg2 :: (ModArg2 (SE Sig) b) => Sig -> b -> ModArgOut2 (SE Sig) b
gaussArg2 depth f = modArg2 depth (gauss 1) f

gaussArg3 :: (ModArg3 (SE Sig) b) => Sig -> b -> ModArgOut3 (SE Sig) b
gaussArg3 depth f = modArg3 depth (gauss 1) f

gaussArg4 :: (ModArg4 (SE Sig) b) => Sig -> b -> ModArgOut4 (SE Sig) b
gaussArg4 depth f = modArg4 depth (gauss 1) f

-- delayed gauss noise

delGaussArg1 :: (ModArg1 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut1 (SE Sig) b
delGaussArg1 delTime riseTime depth f = delModArg1 delTime riseTime depth (gauss 1) f

delGaussArg2 :: (ModArg2 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut2 (SE Sig) b
delGaussArg2 delTime riseTime depth f = delModArg2 delTime riseTime depth (gauss 1) f

delGaussArg3 :: (ModArg3 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut3 (SE Sig) b
delGaussArg3 delTime riseTime depth f = delModArg3 delTime riseTime depth (gauss 1) f

delGaussArg4 :: (ModArg4 (SE Sig) b) => D -> D -> Sig -> b -> ModArgOut4 (SE Sig) b
delGaussArg4 delTime riseTime depth f = delModArg4 delTime riseTime depth (gauss 1) f

-- gauss noise with frequency

gaussiArg1 :: (ModArg1 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
gaussiArg1 depth rate f = modArg1 depth (gaussi 1 1 rate) f

gaussiArg2 :: (ModArg2 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
gaussiArg2 depth rate f = modArg2 depth (gaussi 1 1 rate) f

gaussiArg3 :: (ModArg3 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
gaussiArg3 depth rate f = modArg3 depth (gaussi 1 1 rate) f

gaussiArg4 :: (ModArg4 (SE Sig) b) => Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
gaussiArg4 depth rate f = modArg4 depth (gaussi 1 1 rate) f

-- delayed gauss noise with frequency

delGaussiArg1 :: (ModArg1 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut1 (SE Sig) b
delGaussiArg1 delTime riseTime depth rate f = delModArg1 delTime riseTime depth (gaussi 1 1 rate) f

delGaussiArg2 :: (ModArg2 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut2 (SE Sig) b
delGaussiArg2 delTime riseTime depth rate f = delModArg2 delTime riseTime depth (gaussi 1 1 rate) f

delGaussiArg3 :: (ModArg3 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut3 (SE Sig) b
delGaussiArg3 delTime riseTime depth rate f = delModArg3 delTime riseTime depth (gaussi 1 1 rate) f

delGaussiArg4 :: (ModArg4 (SE Sig) b) => D -> D -> Sig -> Sig -> b -> ModArgOut4 (SE Sig) b
delGaussiArg4 delTime riseTime depth rate f = delModArg4 delTime riseTime depth (gaussi 1 1 rate) f

--------------------------------------------
--------------------------------------------
-- modArg1

class ModArg1 a b where
    type ModArgOut1 a b :: *
    modArg1 :: Sig -> a -> b -> ModArgOut1 a b

--------------------------------------------
-- pure in, pure mono out

instance ModArg1 Sig (Sig -> Sig) where
    type ModArgOut1 Sig (Sig -> Sig) = Sig -> Sig
    modArg1 depth a f = \x -> f (x * (1 + depth * a))

instance ModArg1 Sig (Sig -> a -> Sig) where
    type ModArgOut1 Sig (Sig -> a -> Sig) = Sig -> a -> Sig
    modArg1 depth a f = \x1 x2 -> f (x1 * (1 + depth * a)) x2

instance ModArg1 Sig (Sig -> a -> b -> Sig) where
    type ModArgOut1 Sig (Sig -> a -> b -> Sig) = Sig -> a -> b -> Sig
    modArg1 depth a f = \x1 x2 x3 -> f (x1 * (1 + depth * a)) x2 x3

instance ModArg1 Sig (Sig -> a -> b -> c -> Sig) where
    type ModArgOut1 Sig (Sig -> a -> b -> c -> Sig) = Sig -> a -> b -> c -> Sig
    modArg1 depth a f = \x1 x2 x3 x4 -> f (x1 * (1 + depth * a)) x2 x3 x4

--------------------------------------------
-- pure in, pure stereo out

instance ModArg1 Sig (Sig -> Sig2) where
    type ModArgOut1 Sig (Sig -> Sig2) = Sig -> Sig2
    modArg1 depth a f = \x -> f (x * (1 + depth * a))

instance ModArg1 Sig (Sig -> a -> Sig2) where
    type ModArgOut1 Sig (Sig -> a -> Sig2) = Sig -> a -> Sig2
    modArg1 depth a f = \x1 x2 -> f (x1 * (1 + depth * a)) x2

instance ModArg1 Sig (Sig -> a -> b -> Sig2) where
    type ModArgOut1 Sig (Sig -> a -> b -> Sig2) = Sig -> a -> b -> Sig2
    modArg1 depth a f = \x1 x2 x3 -> f (x1 * (1 + depth * a)) x2 x3

instance ModArg1 Sig (Sig -> a -> b -> c -> Sig2) where
    type ModArgOut1 Sig (Sig -> a -> b -> c -> Sig2) = Sig -> a -> b -> c -> Sig2
    modArg1 depth a f = \x1 x2 x3 x4 -> f (x1 * (1 + depth * a)) x2 x3 x4

--------------------------------------------
-- pure in, dirty mono out

instance ModArg1 Sig (Sig -> SE Sig) where
    type ModArgOut1 Sig (Sig -> SE Sig) = Sig -> SE Sig
    modArg1 depth a f = \x -> f (x * (1 + depth * a))

instance ModArg1 Sig (Sig -> a -> SE Sig) where
    type ModArgOut1 Sig (Sig -> a -> SE Sig) = Sig -> a -> SE Sig
    modArg1 depth a f = \x1 x2 -> f (x1 * (1 + depth * a)) x2

instance ModArg1 Sig (Sig -> a -> b -> SE Sig) where
    type ModArgOut1 Sig (Sig -> a -> b -> SE Sig) = Sig -> a -> b -> SE Sig
    modArg1 depth a f = \x1 x2 x3 -> f (x1 * (1 + depth * a)) x2 x3

instance ModArg1 Sig (Sig -> a -> b -> c -> SE Sig) where
    type ModArgOut1 Sig (Sig -> a -> b -> c -> SE Sig) = Sig -> a -> b -> c -> SE Sig
    modArg1 depth a f = \x1 x2 x3 x4 -> f (x1 * (1 + depth * a)) x2 x3 x4

--------------------------------------------
-- pure in, dirty stereo out

instance ModArg1 Sig (Sig -> SE Sig2) where
    type ModArgOut1 Sig (Sig -> SE Sig2) = Sig -> SE Sig2
    modArg1 depth a f = \x -> f (x * (1 + depth * a))

instance ModArg1 Sig (Sig -> a -> SE Sig2) where
    type ModArgOut1 Sig (Sig -> a -> SE Sig2) = Sig -> a -> SE Sig2
    modArg1 depth a f = \x1 x2 -> f (x1 * (1 + depth * a)) x2

instance ModArg1 Sig (Sig -> a -> b -> SE Sig2) where
    type ModArgOut1 Sig (Sig -> a -> b -> SE Sig2) = Sig -> a -> b -> SE Sig2
    modArg1 depth a f = \x1 x2 x3 -> f (x1 * (1 + depth * a)) x2 x3

instance ModArg1 Sig (Sig -> a -> b -> c -> SE Sig2) where
    type ModArgOut1 Sig (Sig -> a -> b -> c -> SE Sig2) = Sig -> a -> b -> c -> SE Sig2
    modArg1 depth a f = \x1 x2 x3 x4 -> f (x1 * (1 + depth * a)) x2 x3 x4

--------------------------------------------
-- dirty in, pure mono out

instance ModArg1 (SE Sig) (Sig -> Sig) where
    type ModArgOut1 (SE Sig) (Sig -> Sig) = Sig -> SE Sig
    modArg1 depth ma f = \x -> fmap (\a -> f (x * (1 + depth * a))) ma

instance ModArg1 (SE Sig) (Sig -> a -> Sig) where
    type ModArgOut1 (SE Sig) (Sig -> a -> Sig) = Sig -> a -> SE Sig
    modArg1 depth ma f = \x1 x2 -> fmap (\a -> f (x1 * (1 + depth * a)) x2) ma

instance ModArg1 (SE Sig) (Sig -> a -> b -> Sig) where
    type ModArgOut1 (SE Sig) (Sig -> a -> b -> Sig) = Sig -> a -> b -> SE Sig
    modArg1 depth ma f = \x1 x2 x3 -> fmap (\a -> f (x1 * (1 + depth * a)) x2 x3) ma

instance ModArg1 (SE Sig) (Sig -> a -> b -> c -> Sig) where
    type ModArgOut1 (SE Sig) (Sig -> a -> b -> c -> Sig) = Sig -> a -> b -> c -> SE Sig
    modArg1 depth ma f = \x1 x2 x3 x4 -> fmap (\a -> f (x1 * (1 + depth * a)) x2 x3 x4) ma

--------------------------------------------
-- dirty in, pure stereo out

instance ModArg1 (SE Sig) (Sig -> Sig2) where
    type ModArgOut1 (SE Sig) (Sig -> Sig2) = Sig -> SE Sig2
    modArg1 depth ma f = \x -> fmap (\a -> f (x * (1 + depth * a))) ma

instance ModArg1 (SE Sig) (Sig -> a -> Sig2) where
    type ModArgOut1 (SE Sig) (Sig -> a -> Sig2) = Sig -> a -> SE Sig2
    modArg1 depth ma f = \x1 x2 -> fmap (\a -> f (x1 * (1 + depth * a)) x2) ma

instance ModArg1 (SE Sig) (Sig -> a -> b -> Sig2) where
    type ModArgOut1 (SE Sig) (Sig -> a -> b -> Sig2) = Sig -> a -> b -> SE Sig2
    modArg1 depth ma f = \x1 x2 x3 -> fmap (\a -> f (x1 * (1 + depth * a)) x2 x3) ma

instance ModArg1 (SE Sig) (Sig -> a -> b -> c -> Sig2) where
    type ModArgOut1 (SE Sig) (Sig -> a -> b -> c -> Sig2) = Sig -> a -> b -> c -> SE Sig2
    modArg1 depth ma f = \x1 x2 x3 x4 -> fmap (\a -> f (x1 * (1 + depth * a)) x2 x3 x4) ma

--------------------------------------------
-- dirty in, dirty mono out

instance ModArg1 (SE Sig) (Sig -> SE Sig) where
    type ModArgOut1 (SE Sig) (Sig -> SE Sig) = Sig -> SE Sig
    modArg1 depth ma f = \x -> ma >>= (\a -> f (x * (1 + depth * a)))

instance ModArg1 (SE Sig) (Sig -> a -> SE Sig) where
    type ModArgOut1 (SE Sig) (Sig -> a -> SE Sig) = Sig -> a -> SE Sig
    modArg1 depth ma f = \x1 x2 -> ma >>= (\a -> f (x1 * (1 + depth * a)) x2)

instance ModArg1 (SE Sig) (Sig -> a -> b -> SE Sig) where
    type ModArgOut1 (SE Sig) (Sig -> a -> b -> SE Sig) = Sig -> a -> b -> SE Sig
    modArg1 depth ma f = \x1 x2 x3 -> ma >>= (\a -> f (x1 * (1 + depth * a)) x2 x3)

instance ModArg1 (SE Sig) (Sig -> a -> b -> c -> SE Sig) where
    type ModArgOut1 (SE Sig) (Sig -> a -> b -> c -> SE Sig) = Sig -> a -> b -> c -> SE Sig
    modArg1 depth ma f = \x1 x2 x3 x4 -> ma >>= (\a -> f (x1 * (1 + depth * a)) x2 x3 x4)

--------------------------------------------
-- dirty in, dirty stereo out

instance ModArg1 (SE Sig) (Sig -> SE Sig2) where
    type ModArgOut1 (SE Sig) (Sig -> SE Sig2) = Sig -> SE Sig2
    modArg1 depth ma f = \x -> ma >>= (\a -> f (x * (1 + depth * a)))

instance ModArg1 (SE Sig) (Sig -> a -> SE Sig2) where
    type ModArgOut1 (SE Sig) (Sig -> a -> SE Sig2) = Sig -> a -> SE Sig2
    modArg1 depth ma f = \x1 x2 -> ma >>= (\a -> f (x1 * (1 + depth * a)) x2)

instance ModArg1 (SE Sig) (Sig -> a -> b -> SE Sig2) where
    type ModArgOut1 (SE Sig) (Sig -> a -> b -> SE Sig2) = Sig -> a -> b -> SE Sig2
    modArg1 depth ma f = \x1 x2 x3 -> ma >>= (\a -> f (x1 * (1 + depth * a)) x2 x3)

instance ModArg1 (SE Sig) (Sig -> a -> b -> c -> SE Sig2) where
    type ModArgOut1 (SE Sig) (Sig -> a -> b -> c -> SE Sig2) = Sig -> a -> b -> c -> SE Sig2
    modArg1 depth ma f = \x1 x2 x3 x4 -> ma >>= (\a -> f (x1 * (1 + depth * a)) x2 x3 x4)

--------------------------------------------
--------------------------------------------
-- modArg2

class ModArg2 a b where
    type ModArgOut2 a b :: *
    modArg2 :: Sig -> a -> b -> ModArgOut2 a b

--------------------------------------------
-- pure in, pure mono out

instance ModArg2 Sig (a -> Sig -> Sig) where
    type ModArgOut2 Sig (a -> Sig -> Sig) = a -> Sig -> Sig
    modArg2 depth a f = \x1 x2 -> f x1 (x2 * (1 + depth * a))

instance ModArg2 Sig (a -> Sig -> b -> Sig) where
    type ModArgOut2 Sig (a -> Sig -> b -> Sig) = a -> Sig -> b -> Sig
    modArg2 depth a f = \x1 x2 x3 -> f x1 (x2 * (1 + depth * a)) x3

instance ModArg2 Sig (a -> Sig -> b -> c -> Sig) where
    type ModArgOut2 Sig (a -> Sig -> b -> c -> Sig) = a -> Sig -> b -> c -> Sig
    modArg2 depth a f = \x1 x2 x3 x4 -> f x1 (x2 * (1 + depth * a)) x3 x4

--------------------------------------------
-- pure in, pure stereo out

instance ModArg2 Sig (a -> Sig -> Sig2) where
    type ModArgOut2 Sig (a -> Sig -> Sig2) = a -> Sig -> Sig2
    modArg2 depth a f = \x1 x2 -> f x1 (x2 * (1 + depth * a))

instance ModArg2 Sig (a -> Sig -> b -> Sig2) where
    type ModArgOut2 Sig (a -> Sig -> b -> Sig2) = a -> Sig -> b -> Sig2
    modArg2 depth a f = \x1 x2 x3 -> f x1 (x2 * (1 + depth * a)) x3

instance ModArg2 Sig (a -> Sig -> b -> c -> Sig2) where
    type ModArgOut2 Sig (a -> Sig -> b -> c -> Sig2) = a -> Sig -> b -> c -> Sig2
    modArg2 depth a f = \x1 x2 x3 x4 -> f x1 (x2 * (1 + depth * a)) x3 x4

--------------------------------------------
-- pure in, dirty mono out

instance ModArg2 Sig (a -> Sig -> SE Sig) where
    type ModArgOut2 Sig (a -> Sig -> SE Sig) = a -> Sig -> SE Sig
    modArg2 depth a f = \x1 x2 -> f x1 (x2 * (1 + depth * a))

instance ModArg2 Sig (a -> Sig -> b -> SE Sig) where
    type ModArgOut2 Sig (a -> Sig -> b -> SE Sig) = a -> Sig -> b -> SE Sig
    modArg2 depth a f = \x1 x2 x3 -> f x1 (x2 * (1 + depth * a)) x3

instance ModArg2 Sig (a -> Sig -> b -> c -> SE Sig) where
    type ModArgOut2 Sig (a -> Sig -> b -> c -> SE Sig) = a -> Sig -> b -> c -> SE Sig
    modArg2 depth a f = \x1 x2 x3 x4 -> f x1 (x2 * (1 + depth * a)) x3 x4

--------------------------------------------
-- pure in, dirty stereo out

instance ModArg2 Sig (a -> Sig -> SE Sig2) where
    type ModArgOut2 Sig (a -> Sig -> SE Sig2) = a -> Sig -> SE Sig2
    modArg2 depth a f = \x1 x2 -> f x1 (x2 * (1 + depth * a))

instance ModArg2 Sig (a -> Sig -> b -> SE Sig2) where
    type ModArgOut2 Sig (a -> Sig -> b -> SE Sig2) = a -> Sig -> b -> SE Sig2
    modArg2 depth a f = \x1 x2 x3 -> f x1 (x2 * (1 + depth * a)) x3

instance ModArg2 Sig (a -> Sig -> b -> c -> SE Sig2) where
    type ModArgOut2 Sig (a -> Sig -> b -> c -> SE Sig2) = a -> Sig -> b -> c -> SE Sig2
    modArg2 depth a f = \x1 x2 x3 x4 -> f x1 (x2 * (1 + depth * a)) x3 x4

--------------------------------------------
-- dirty in, pure mono out

instance ModArg2 (SE Sig) (a -> Sig -> Sig) where
    type ModArgOut2 (SE Sig) (a -> Sig -> Sig) = a -> Sig -> SE Sig
    modArg2 depth ma f = \x1 x2 -> fmap (\a -> f x1 (x2 * (1 + depth * a))) ma

instance ModArg2 (SE Sig) (a -> Sig -> b -> Sig) where
    type ModArgOut2 (SE Sig) (a -> Sig -> b -> Sig) = a -> Sig -> b -> SE Sig
    modArg2 depth ma f = \x1 x2 x3 -> fmap (\a -> f x1 (x2 * (1 + depth * a)) x3) ma

instance ModArg2 (SE Sig) (a -> Sig -> b -> c -> Sig) where
    type ModArgOut2 (SE Sig) (a -> Sig -> b -> c -> Sig) = a -> Sig -> b -> c -> SE Sig
    modArg2 depth ma f = \x1 x2 x3 x4 -> fmap (\a -> f x1 (x2 * (1 + depth * a)) x3 x4) ma

--------------------------------------------
-- dirty in, pure stereo out

instance ModArg2 (SE Sig) (a -> Sig -> Sig2) where
    type ModArgOut2 (SE Sig) (a -> Sig -> Sig2) = a -> Sig -> SE Sig2
    modArg2 depth ma f = \x1 x2 -> fmap (\a -> f x1 (x2 * (1 + depth * a))) ma

instance ModArg2 (SE Sig) (a -> Sig -> b -> Sig2) where
    type ModArgOut2 (SE Sig) (a -> Sig -> b -> Sig2) = a -> Sig -> b -> SE Sig2
    modArg2 depth ma f = \x1 x2 x3 -> fmap (\a -> f x1 (x2 * (1 + depth * a)) x3) ma

instance ModArg2 (SE Sig) (a -> Sig -> b -> c -> Sig2) where
    type ModArgOut2 (SE Sig) (a -> Sig -> b -> c -> Sig2) = a -> Sig -> b -> c -> SE Sig2
    modArg2 depth ma f = \x1 x2 x3 x4 -> fmap (\a -> f x1 (x2 * (1 + depth * a)) x3 x4) ma    

--------------------------------------------
-- dirty in, dirty mono out

instance ModArg2 (SE Sig) (a -> Sig -> SE Sig) where
    type ModArgOut2 (SE Sig) (a -> Sig -> SE Sig) = a -> Sig -> SE Sig
    modArg2 depth ma f = \x1 x2 -> ma >>= (\a -> f x1 (x2 * (1 + depth * a)))

instance ModArg2 (SE Sig) (a -> Sig -> b -> SE Sig) where
    type ModArgOut2 (SE Sig) (a -> Sig -> b -> SE Sig) = a -> Sig -> b -> SE Sig
    modArg2 depth ma f = \x1 x2 x3 -> ma >>= (\a -> f x1 (x2 * (1 + depth * a)) x3)

instance ModArg2 (SE Sig) (a -> Sig -> b -> c -> SE Sig) where
    type ModArgOut2 (SE Sig) (a -> Sig -> b -> c -> SE Sig) = a -> Sig -> b -> c -> SE Sig
    modArg2 depth ma f = \x1 x2 x3 x4 -> ma >>= (\a -> f x1 (x2 * (1 + depth * a)) x3 x4)

--------------------------------------------
-- dirty in, dirty stereo out

instance ModArg2 (SE Sig) (a -> Sig -> SE Sig2) where
    type ModArgOut2 (SE Sig) (a -> Sig -> SE Sig2) = a -> Sig -> SE Sig2
    modArg2 depth ma f = \x1 x2 -> ma >>= (\a -> f x1 (x2 * (1 + depth * a)))

instance ModArg2 (SE Sig) (a -> Sig -> b -> SE Sig2) where
    type ModArgOut2 (SE Sig) (a -> Sig -> b -> SE Sig2) = a -> Sig -> b -> SE Sig2
    modArg2 depth ma f = \x1 x2 x3 -> ma >>= (\a -> f x1 (x2 * (1 + depth * a)) x3)

instance ModArg2 (SE Sig) (a -> Sig -> b -> c -> SE Sig2) where
    type ModArgOut2 (SE Sig) (a -> Sig -> b -> c -> SE Sig2) = a -> Sig -> b -> c -> SE Sig2
    modArg2 depth ma f = \x1 x2 x3 x4 -> ma >>= (\a -> f x1 (x2 * (1 + depth * a)) x3 x4)    

--------------------------------------------
--------------------------------------------
-- modArg3

class ModArg3 a b where
    type ModArgOut3 a b :: *
    modArg3 :: Sig -> a -> b -> ModArgOut3 a b

--------------------------------------------
-- pure in, pure mono out

instance ModArg3 Sig (a -> b -> Sig -> Sig) where
    type ModArgOut3 Sig (a -> b -> Sig -> Sig) = a -> b -> Sig -> Sig
    modArg3 depth a f = \x1 x2 x3 -> f x1 x2 (x3 * (1 + depth * a))

instance ModArg3 Sig (a -> b -> Sig -> c -> Sig) where
    type ModArgOut3 Sig (a -> b -> Sig -> c -> Sig) = a -> b -> Sig -> c -> Sig
    modArg3 depth a f = \x1 x2 x3 x4 -> f x1 x2 (x3 * (1 + depth * a)) x4

--------------------------------------------
-- pure in, pure stereo out

instance ModArg3 Sig (a -> b -> Sig -> Sig2) where
    type ModArgOut3 Sig (a -> b -> Sig -> Sig2) = a -> b -> Sig -> Sig2
    modArg3 depth a f = \x1 x2 x3 -> f x1 x2 (x3 * (1 + depth * a))

instance ModArg3 Sig (a -> b -> Sig -> c -> Sig2) where
    type ModArgOut3 Sig (a -> b -> Sig -> c -> Sig2) = a -> b -> Sig -> c -> Sig2
    modArg3 depth a f = \x1 x2 x3 x4 -> f x1 x2 (x3 * (1 + depth * a)) x4

--------------------------------------------
-- pure in, dirty mono out

instance ModArg3 Sig (a -> b -> Sig -> SE Sig) where
    type ModArgOut3 Sig (a -> b -> Sig -> SE Sig) = a -> b -> Sig -> SE Sig
    modArg3 depth a f = \x1 x2 x3 -> f x1 x2 (x3 * (1 + depth * a))

instance ModArg3 Sig (a -> b -> Sig -> c -> SE Sig) where
    type ModArgOut3 Sig (a -> b -> Sig -> c -> SE Sig) = a -> b -> Sig -> c -> SE Sig
    modArg3 depth a f = \x1 x2 x3 x4 -> f x1 x2 (x3 * (1 + depth * a)) x4    

--------------------------------------------
-- pure in, dirty stereo out

instance ModArg3 Sig (a -> b -> Sig -> SE Sig2) where
    type ModArgOut3 Sig (a -> b -> Sig -> SE Sig2) = a -> b -> Sig -> SE Sig2
    modArg3 depth a f = \x1 x2 x3 -> f x1 x2 (x3 * (1 + depth * a))

instance ModArg3 Sig (a -> b -> Sig -> c -> SE Sig2) where
    type ModArgOut3 Sig (a -> b -> Sig -> c -> SE Sig2) = a -> b -> Sig -> c -> SE Sig2
    modArg3 depth a f = \x1 x2 x3 x4 -> f x1 x2 (x3 * (1 + depth * a)) x4    

--------------------------------------------
-- dirty in, pure mono out

instance ModArg3 (SE Sig) (a -> b -> Sig -> Sig) where
    type ModArgOut3 (SE Sig) (a -> b -> Sig -> Sig) = a -> b -> Sig -> SE Sig
    modArg3 depth ma f = \x1 x2 x3 -> fmap (\a -> f x1 x2 (x3 * (1 + depth * a))) ma

instance ModArg3 (SE Sig) (a -> b -> Sig -> c -> Sig) where
    type ModArgOut3 (SE Sig) (a -> b -> Sig -> c -> Sig) = a -> b -> Sig -> c -> SE Sig
    modArg3 depth ma f = \x1 x2 x3 x4 -> fmap (\a -> f x1 x2 (x3 * (1 + depth * a)) x4) ma

--------------------------------------------
-- dirty in, pure stereo out

instance ModArg3 (SE Sig) (a -> b -> Sig -> Sig2) where
    type ModArgOut3 (SE Sig) (a -> b -> Sig -> Sig2) = a -> b -> Sig -> SE Sig2
    modArg3 depth ma f = \x1 x2 x3 -> fmap (\a -> f x1 x2 (x3 * (1 + depth * a))) ma

instance ModArg3 (SE Sig) (a -> b -> Sig -> c -> Sig2) where
    type ModArgOut3 (SE Sig) (a -> b -> Sig -> c -> Sig2) = a -> b -> Sig -> c -> SE Sig2
    modArg3 depth ma f = \x1 x2 x3 x4 -> fmap (\a -> f x1 x2 (x3 * (1 + depth * a)) x4) ma    

--------------------------------------------
-- dirty in, dirty mono out

instance ModArg3 (SE Sig) (a -> b -> Sig -> SE Sig) where
    type ModArgOut3 (SE Sig) (a -> b -> Sig -> SE Sig) = a -> b -> Sig -> SE Sig
    modArg3 depth ma f = \x1 x2 x3 -> ma >>= (\a -> f x1 x2 (x3 * (1 + depth * a)))

instance ModArg3 (SE Sig) (a -> b -> Sig -> c -> SE Sig) where
    type ModArgOut3 (SE Sig) (a -> b -> Sig -> c -> SE Sig) = a -> b -> Sig -> c -> SE Sig
    modArg3 depth ma f = \x1 x2 x3 x4 -> ma >>= (\a -> f x1 x2 (x3 * (1 + depth * a)) x4)

--------------------------------------------
-- dirty in, dirty stereo out

instance ModArg3 (SE Sig) (a -> b -> Sig -> SE Sig2) where
    type ModArgOut3 (SE Sig) (a -> b -> Sig -> SE Sig2) = a -> b -> Sig -> SE Sig2
    modArg3 depth ma f = \x1 x2 x3 -> ma >>= (\a -> f x1 x2 (x3 * (1 + depth * a)))

instance ModArg3 (SE Sig) (a -> b -> Sig -> c -> SE Sig2) where
    type ModArgOut3 (SE Sig) (a -> b -> Sig -> c -> SE Sig2) = a -> b -> Sig -> c -> SE Sig2
    modArg3 depth ma f = \x1 x2 x3 x4 -> ma >>= (\a -> f x1 x2 (x3 * (1 + depth * a)) x4)

--------------------------------------------
--------------------------------------------
-- modArg4

class ModArg4 a b where
    type ModArgOut4 a b :: *
    modArg4 :: Sig -> a -> b -> ModArgOut4 a b  

--------------------------------------------
-- pure in, pure mono out

instance ModArg4 Sig (a -> b -> c -> Sig -> Sig) where
    type ModArgOut4 Sig (a -> b -> c -> Sig -> Sig) = a -> b -> c -> Sig -> Sig
    modArg4 depth a f = \x1 x2 x3 x4 -> f x1 x2 x3 (x4 * (1 + depth * a))

--------------------------------------------
-- pure in, pure stereo out

instance ModArg4 Sig (a -> b -> c -> Sig -> Sig2) where
    type ModArgOut4 Sig (a -> b -> c -> Sig -> Sig2) = a -> b -> c -> Sig -> Sig2
    modArg4 depth a f = \x1 x2 x3 x4 -> f x1 x2 x3 (x4 * (1 + depth * a))    

--------------------------------------------
-- pure in, dirty mono out

instance ModArg4 Sig (a -> b -> c -> Sig -> SE Sig) where
    type ModArgOut4 Sig (a -> b -> c -> Sig -> SE Sig) = a -> b -> c -> Sig -> SE Sig
    modArg4 depth a f = \x1 x2 x3 x4 -> f x1 x2 x3 (x4 * (1 + depth * a))

--------------------------------------------
-- pure in, dirty stereo out

instance ModArg4 Sig (a -> b -> c -> Sig -> SE Sig2) where
    type ModArgOut4 Sig (a -> b -> c -> Sig -> SE Sig2) = a -> b -> c -> Sig -> SE Sig2
    modArg4 depth a f = \x1 x2 x3 x4 -> f x1 x2 x3 (x4 * (1 + depth * a))

--------------------------------------------
-- dirty in, pure mono out

instance ModArg4 (SE Sig) (a -> b -> c -> Sig -> Sig) where
    type ModArgOut4 (SE Sig) (a -> b -> c -> Sig -> Sig) = a -> b -> c -> Sig -> SE Sig
    modArg4 depth ma f = \x1 x2 x3 x4 -> fmap (\a -> f x1 x2 x3 (x4 * (1 + depth * a))) ma

--------------------------------------------
-- dirty in, pure stereo out

instance ModArg4 (SE Sig) (a -> b -> c -> Sig -> Sig2) where
    type ModArgOut4 (SE Sig) (a -> b -> c -> Sig -> Sig2) = a -> b -> c -> Sig -> SE Sig2
    modArg4 depth ma f = \x1 x2 x3 x4 -> fmap (\a -> f x1 x2 x3 (x4 * (1 + depth * a))) ma    

--------------------------------------------
-- dirty in, dirty mono out

instance ModArg4 (SE Sig) (a -> b -> c -> Sig -> SE Sig) where
    type ModArgOut4 (SE Sig) (a -> b -> c -> Sig -> SE Sig) = a -> b -> c -> Sig -> SE Sig
    modArg4 depth ma f = \x1 x2 x3 x4 -> ma >>= (\a -> f x1 x2 x3 (x4 * (1 + depth * a)))

--------------------------------------------
-- dirty in, dirty stereo out

instance ModArg4 (SE Sig) (a -> b -> c -> Sig -> SE Sig2) where
    type ModArgOut4 (SE Sig) (a -> b -> c -> Sig -> SE Sig2) = a -> b -> c -> Sig -> SE Sig2
    modArg4 depth ma f = \x1 x2 x3 x4 -> ma >>= (\a -> f x1 x2 x3 (x4 * (1 + depth * a)))