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.Enum
import Sound.SC3.UGen.Filter
import Sound.SC3.UGen.Identifier
import Sound.SC3.UGen.Information
import Sound.SC3.UGen.IO
import Sound.SC3.UGen.Math
import Sound.SC3.UGen.Noise.ID
import Sound.SC3.UGen.Oscillator
import Sound.SC3.UGen.Panner
import Sound.SC3.UGen.Rate
import Sound.SC3.UGen.Type
dynKlang :: Rate -> UGen -> UGen -> UGen -> UGen
dynKlang r fs fo s =
let gen (f:a:ph:xs) = sinOsc r (f * fs + fo) ph * a + gen xs
gen _ = 0
in gen (mceChannels s)
dynKlank :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen
dynKlank i fs fo ds s =
let gen (f:a:d:xs) = ringz i (f * fs + fo) (d * ds) * a + gen xs
gen _ = 0
in gen (mceChannels s)
freqShift :: UGen -> UGen -> UGen -> UGen
freqShift i f p =
let o = sinOsc AR f (mce [p + 0.5 * pi, p])
h = hilbert i
in mix (h * o)
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
linLin :: UGen -> UGen -> UGen -> UGen -> UGen -> UGen
linLin i sl sr dl dr =
let m = (dr dl) / (sr sl)
a = dl (m * sl)
in mulAdd i m a
mix :: UGen -> UGen
mix = sum . mceChannels
mixN :: Int -> UGen -> UGen
mixN n u =
let xs = transpose (chunksOf n (mceChannels u))
in mce (map sum xs)
mixFill :: Integral n => Int -> (n -> UGen) -> UGen
mixFill n f = mix (mce (map f [0 .. fromIntegral n 1]))
mixFillM :: (Integral n,Monad m) => Int -> (n -> m UGen) -> m UGen
mixFillM n f = liftM sum (mapM f [0 .. fromIntegral n 1])
mouseButton' :: Rate -> UGen -> UGen -> UGen -> UGen
mouseButton' rt l r tm =
let o = lfClipNoise 'z' rt 1
in lag (linLin o (1) 1 l r) tm
mouseR :: ID a => a -> Rate -> UGen -> UGen -> Warp -> UGen -> UGen
mouseR z rt l r ty tm =
let f = case ty of
Linear -> linLin
Exponential -> linExp
_ -> undefined
in lag (f (lfNoise1 z rt 1) (1) 1 l r) tm
mouseX' :: Rate -> UGen -> UGen -> Warp -> UGen -> UGen
mouseX' = mouseR 'x'
mouseY' :: Rate -> UGen -> UGen -> Warp -> UGen -> UGen
mouseY' = mouseR 'y'
pmOsc :: Rate -> UGen -> UGen -> UGen -> UGen -> UGen
pmOsc r cf mf pm mp = sinOsc r cf (sinOsc r mf mp * pm)
urange :: Fractional c => c -> c -> c -> c
urange l r =
let m = r l
in (+ l) . (* m)
range :: Fractional c => c -> c -> c -> c
range l r =
let m = (r l) * 0.5
a = m + l
in (+ a) . (* m)
selectX :: UGen -> UGen -> UGen
selectX ix xs =
let s0 = select (roundTo ix 2) xs
s1 = select (trunc ix 2 + 1) xs
in xFade2 s0 s1 (fold2 (ix * 2 1) 1) 1
silent :: Int -> UGen
silent n = let s = dc AR 0 in mce (replicate n s)
soundIn :: UGen -> UGen
soundIn u =
let r = in' 1 AR (numOutputBuses + u)
in case u of
MCE_U m ->
let n = mceProxies m
in if all (==1) (zipWith () (tail n) n)
then in' (length n) AR (numOutputBuses + head n)
else r
_ -> r
splay :: UGen -> UGen -> UGen -> UGen -> Bool -> UGen
splay i s l c lc =
let n = fromIntegral (mceDegree i)
m = n 1
p = map ( (+ (1.0)) . (* (2 / m)) ) [0 .. m]
a = if lc then sqrt (1 / n) else 1
in mix (pan2 i (mce p * s + c) 1) * l * a