module Sound.SC3.UGen.Composite where
import Control.Monad
import Data.List
import Data.List.Split
import Sound.SC3.UGen.Buffer
import Sound.SC3.UGen.Filter
import Sound.SC3.UGen.Information
import Sound.SC3.UGen.IO
import Sound.SC3.UGen.Math
import Sound.SC3.UGen.Oscillator
import Sound.SC3.UGen.Panner
import Sound.SC3.UGen.Rate
import Sound.SC3.UGen.UGen
dynKlank :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen
dynKlank i fs fo ds s = gen (mceChannels s)
where gen (f:a:d:xs) = ringz i (f * fs + fo) (d * ds) * a + gen xs
gen _ = 0
freqShift :: UGen -> UGen -> UGen -> UGen
freqShift i f p = mix (h * o)
where o = sinOsc AR f (mce [p + 0.5 * pi, p])
h = hilbert i
indexL :: UGen -> UGen -> UGen
indexL b i =
let x = index b i
y = index b (i + 1)
in linLin (frac i) 0 1 x y
mix :: UGen -> UGen
mix = foldl1 (+) . mceChannels
mixN :: Int -> UGen -> UGen
mixN n u =
let xs = transpose (splitEvery n (mceChannels u))
in mce (map (foldl1 (+)) xs)
mixFill :: Int -> (Int -> UGen) -> UGen
mixFill n f = mix (mce (map f [0..n1]))
mixFillM :: (Monad m) => Int -> (Int -> m UGen) -> m UGen
mixFillM n f = liftM sum (mapM f [0 .. n 1])
pmOsc :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen
pmOsc r cf mf pm mp = sinOsc r cf (sinOsc r mf mp * pm)
soundIn :: UGen -> UGen
soundIn (MCE ns) | all (==1) $ zipWith () (tail ns) ns =
in' (length ns) AR (numOutputBuses + head ns)
soundIn n =
in' 1 AR (numOutputBuses + n)
splay :: UGen -> UGen -> UGen -> UGen -> UGen
splay i s l c = mix (pan2 i (mce p * s + c) 1) * l * sqrt (1 / n)
where n = fromIntegral (mceDegree i)
m = n 1
p = map ( (+ (1.0)) . (* (2 / m)) ) [0 .. m]