module Sound.SC3.UGen.UGen.MCE where
import Data.List (transpose)
import Sound.SC3.UGen.UGen
import Sound.SC3.UGen.UGen.Predicate
mceDegree :: UGen -> Int
mceDegree (MCE l) = length l
mceDegree _ = error "mceDegree: illegal ugen"
mceRequired :: UGen -> Bool
mceRequired (UGen _ _ i _ _ _) = not (null (filter isMCE i))
mceRequired (MCE l) = any mceRequired l
mceRequired _ = False
mceExtend :: Int -> UGen -> [UGen]
mceExtend n (MCE l) = take n (cycle l)
mceExtend n u = replicate n u
mceTransform :: UGen -> UGen
mceTransform (UGen r n i o s d) = MCE (map f i')
where f j = UGen r n j o s d
upr = maximum (map mceDegree (filter isMCE i))
i' = transpose (map (mceExtend upr) i)
mceTransform _ = error "mceTransform: illegal ugen"
mceExpand :: UGen -> UGen
mceExpand (MCE l) = MCE (map mceExpand l)
mceExpand u = if mceRequired u then mceExpand (mceTransform u) else u
mceEdit :: ([UGen] -> [UGen]) -> UGen -> UGen
mceEdit f (MCE l) = MCE (f l)
mceEdit _ _ = error "mceEdit: non MCE value"
mceReverse :: UGen -> UGen
mceReverse = mceEdit reverse
mceChannel :: Int -> UGen -> UGen
mceChannel n (MCE l) = l !! n
mceChannel _ _ = error "mceChannel: non MCE value"
mceChannels :: UGen -> [UGen]
mceChannels (MCE l) = l
mceChannels u = [u]