-- | Monad constructors for 'UGen's.
module Sound.SC3.UGen.Bindings.Monad where

import Sound.SC3.UGen.Bindings.DB
import Sound.SC3.UGen.Bindings.HW
import Sound.SC3.UGen.Enum
import Sound.SC3.UGen.Rate
import Sound.SC3.UGen.Type
import Sound.SC3.UGen.UId

-- * Demand

-- | Buffer demand ugen.
dbufrdM :: (UId m) => UGen -> UGen -> Loop -> m UGen
dbufrdM = liftUId3 dbufrd

-- | Buffer write on demand unit generator.
dbufwrM :: (UId m) => UGen -> UGen -> UGen -> Loop -> m UGen
dbufwrM = liftUId4 dbufwr

-- | Demand rate white noise.
dwhiteM :: (UId m) => UGen -> UGen -> UGen -> m UGen
dwhiteM = liftUId3 dwhite

-- | Demand rate integer white noise.
diwhiteM :: (UId m) => UGen -> UGen -> UGen -> m UGen
diwhiteM = liftUId3 diwhite

-- | Demand rate brown noise.
dbrownM :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen
dbrownM = liftUId4 dbrown

-- | Demand rate integer brown noise.
dibrownM :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen
dibrownM = liftUId4 dibrown

-- | Demand rate random selection.
drandM :: (UId m) => UGen -> UGen -> m UGen
drandM = liftUId2 drand

-- | Demand rate weighted random sequence generator.
dwrandM :: (UId m) => UGen -> UGen -> UGen -> m UGen
dwrandM = liftUId3 dwrand

-- | Demand rate random selection with no immediate repetition.
dxrandM :: (UId m) => UGen -> UGen -> m UGen
dxrandM = liftUId2 dxrand

-- | Demand rate arithmetic series.
dseriesM :: (UId m) => UGen -> UGen -> UGen -> m UGen
dseriesM = liftUId3 dseries

-- | Demand rate geometric series.
dgeomM :: (UId m) => UGen -> UGen -> UGen -> m UGen
dgeomM = liftUId3 dgeom

-- | Demand rate sequence generator.
dseqM :: (UId m) => UGen -> UGen -> m UGen
dseqM = liftUId2 dseq

-- | Demand rate series generator.
dserM :: (UId m) => UGen -> UGen -> m UGen
dserM = liftUId2 dser

-- | Demand rate sequence shuffler.
dshufM :: (UId m) => UGen -> UGen -> m UGen
dshufM = liftUId2 dshuf

-- | Demand input replication
dstutterM :: (UId m) => UGen -> UGen -> m UGen
dstutterM = liftUId2 dstutter

-- | Demand rate input switching.
dswitch1M :: (UId m) => UGen -> UGen -> m UGen
dswitch1M = liftUId2 dswitch1

-- | Demand rate input switching.
dswitchM :: (UId m) => UGen -> UGen -> m UGen
dswitchM = liftUId2 dswitch

-- * FFT

-- | Randomize order of bins.
pv_BinScrambleM :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen
pv_BinScrambleM = liftUId4 pv_BinScramble

-- | Randomly clear bins.
pv_RandCombM :: (UId m) => UGen -> UGen -> UGen -> m UGen
pv_RandCombM = liftUId3 pv_RandComb

-- | Cross fade, copying bins in random order.
pv_RandWipeM :: (UId m) => UGen -> UGen -> UGen -> UGen -> m UGen
pv_RandWipeM = liftUId4 pv_RandWipe

-- * Noise

-- | Brown noise.
brownNoiseM :: (UId m) => Rate -> m UGen
brownNoiseM = liftUId brownNoise

-- | Clip noise.
clipNoiseM :: (UId m) => Rate -> m UGen
clipNoiseM = liftUId clipNoise

-- | Randomly pass or block triggers.
coinGateM :: (UId m) => UGen -> UGen -> m UGen
coinGateM = liftUId2 coinGate

-- | Random impulses in (-1, 1).
dust2M :: (UId m) => Rate -> UGen -> m UGen
dust2M = liftUId2 dust2

-- | Random impulse in (0,1).
dustM :: (UId m) => Rate -> UGen -> m UGen
dustM = liftUId2 dust

-- | Random value in exponential distribution.
expRandM :: (UId m) => UGen -> UGen -> m UGen
expRandM = liftUId2 expRand

-- | Gray noise.
grayNoiseM :: (UId m) => Rate -> m UGen
grayNoiseM = liftUId grayNoise

-- | Random integer in uniform distribution.
iRandM :: (UId m) => UGen -> UGen -> m UGen
iRandM = liftUId2 iRand

-- | Clip noise.
lfClipNoiseM :: (UId m) => Rate -> UGen -> m UGen
lfClipNoiseM = liftUId2 lfClipNoise

-- | Dynamic clip noise.
lfdClipNoiseM :: (UId m) => Rate -> UGen -> m UGen
lfdClipNoiseM = liftUId2 lfdClipNoise

-- | Dynamic step noise.
lfdNoise0M :: (UId m) => Rate -> UGen -> m UGen
lfdNoise0M = liftUId2 lfdNoise0

-- | Dynamic ramp noise.
lfdNoise1M :: (UId m) => Rate -> UGen -> m UGen
lfdNoise1M = liftUId2 lfdNoise1

-- | Dynamic cubic noise
lfdNoise3M :: (UId m) => Rate -> UGen -> m UGen
lfdNoise3M = liftUId2 lfdNoise3

-- | Step noise.
lfNoise0M :: (UId m) => Rate -> UGen -> m UGen
lfNoise0M = liftUId2 lfNoise0

-- | Ramp noise.
lfNoise1M :: (UId m) => Rate -> UGen -> m UGen
lfNoise1M = liftUId2 lfNoise1

-- | Quadratic noise.
lfNoise2M :: (UId m) => Rate -> UGen -> m UGen
lfNoise2M = liftUId2 lfNoise2

-- | Random value in skewed linear distribution.
linRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen
linRandM = liftUId3 linRand

-- | Random value in sum of n linear distribution.
nRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen
nRandM = liftUId3 nRand

-- | Pink noise.
pinkNoiseM :: (UId m) => Rate -> m UGen
pinkNoiseM = liftUId pinkNoise

-- | Random value in uniform distribution.
randM :: (UId m) => UGen -> UGen -> m UGen
randM = liftUId2 rand

-- | Random value in exponential distribution on trigger.
tExpRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen
tExpRandM = liftUId3 tExpRand

-- | Random integer in uniform distribution on trigger.
tIRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen
tIRandM = liftUId3 tIRand

-- | Random value in uniform distribution on trigger.
tRandM :: (UId m) => UGen -> UGen -> UGen -> m UGen
tRandM = liftUId3 tRand

-- | Triggered windex.
tWindexM :: (UId m) => UGen -> UGen -> UGen -> m UGen
tWindexM = liftUId3 tWindex

-- | White noise.
whiteNoiseM :: (UId m) => Rate -> m UGen
whiteNoiseM = liftUId whiteNoise