-- | Explicit identifier demand rate 'UGen' functions.
module Sound.SC3.UGen.Demand.ID where

import Sound.SC3.UGen.Enum
import Sound.SC3.UGen.Identifier
import Sound.SC3.UGen.Rate
import Sound.SC3.UGen.Type
import Sound.SC3.UGen.UGen

-- | Buffer demand ugen.
dbufrd :: ID i => i -> UGen -> UGen -> Loop -> UGen
dbufrd z b p l = mkOscId z DR "Dbufrd" [b, p, from_loop l] 1

-- | Buffer write on demand unit generator.
dbufwr :: ID i => i -> UGen -> UGen -> UGen -> Loop -> UGen
dbufwr z b p i l = mkOscId z DR "Dbufwr" [b, p, i, from_loop l] 1

-- | Demand rate white noise.
dwhite :: ID i => i -> UGen -> UGen -> UGen -> UGen
dwhite z l lo hi = mkOscId z DR "Dwhite" [l, lo, hi] 1

-- | Demand rate integer white noise.
diwhite :: ID i => i -> UGen -> UGen -> UGen -> UGen
diwhite z l lo hi = mkOscId z DR "Diwhite" [l, lo, hi] 1

-- | Demand rate brown noise.
dbrown :: ID i => i -> UGen -> UGen -> UGen -> UGen -> UGen
dbrown z l lo hi step = mkOscId z DR "Dbrown" [l, lo, hi, step] 1

-- | Demand rate integer brown noise.
dibrown :: ID i => i -> UGen -> UGen -> UGen -> UGen -> UGen
dibrown z l lo hi step = mkOscId z DR "Dibrown" [l, lo, hi, step] 1

-- | Demand rate random selection.
drand :: ID i => i -> UGen -> UGen -> UGen
drand z l array = mkOscMCEId z DR "Drand" [l] array 1

-- | Demand rate random selection with no immediate repetition.
dxrand :: ID i => i -> UGen -> UGen -> UGen
dxrand z l array = mkOscMCEId z DR "Dxrand" [l] array 1

-- | Demand rate weighted random sequence generator.
dwrand :: ID i => i -> UGen -> UGen -> UGen -> UGen
dwrand z l a w =
    let n = mceDegree a
        w' = mceExtend n w
    in mkOscMCEId z DR "Dxrand" (l:w') a 1

-- | Demand rate arithmetic series.
dseries :: ID i => i -> UGen -> UGen -> UGen -> UGen
dseries z l i n = mkOscId z DR "Dseries" [l, i, n] 1

-- | Demand rate geometric series.
dgeom :: ID i => i -> UGen -> UGen -> UGen -> UGen
dgeom z l i n = mkOscId z DR "Dgeom" [l, i, n] 1

-- | Demand rate sequence generator.
dseq :: ID i => i -> UGen -> UGen -> UGen
dseq z l array = mkOscMCEId z DR "Dseq" [l] array 1

-- | Demand rate series generator.
dser :: ID i => i -> UGen -> UGen -> UGen
dser z l array = mkOscMCEId z DR "Dser" [l] array 1

-- | Demand rate sequence shuffler.
dshuf :: ID i => i -> UGen -> UGen -> UGen
dshuf z l array = mkOscMCEId z DR "Dshuf" [l] array 1

-- | Demand input replication
dstutter :: ID i => i -> UGen -> UGen -> UGen
dstutter z n i = mkOscId z DR "Dstutter" [n,i] 1

-- | Demand rate input switching.
dswitch1 :: ID i => i -> UGen -> UGen -> UGen
dswitch1 z l array = mkOscMCEId z DR "Dswitch1" [l] array 1

-- | Demand rate input switching.
dswitch :: ID i => i -> UGen -> UGen -> UGen
dswitch z l array = mkOscMCEId z DR "Dswitch" [l] array 1