module Sound.SC3.UGen.Analysis where
import Data.List
import qualified Sound.SC3.UGen.Bindings.DB as DB
import qualified Sound.SC3.UGen.MCE as MCE
import Sound.SC3.UGen.Type
ugen_primitive_set :: UGen -> [Primitive]
ugen_primitive_set u =
case u of
Constant_U _ -> []
Control_U _ -> []
Label_U _ -> []
Primitive_U p -> [p]
Proxy_U p -> [proxySource p]
MCE_U m -> concatMap ugen_primitive_set (MCE.mce_elem m)
MRG_U m -> ugen_primitive_set (mrgLeft m)
primitive_is_pv_rate :: String -> Bool
primitive_is_pv_rate nm = nm == "FFT" || "PV_" `isPrefixOf` nm
ugen_is_pv_rate :: UGen -> Bool
ugen_is_pv_rate = any (primitive_is_pv_rate . ugenName) . ugen_primitive_set
pv_track_buffer :: UGen -> Either String UGen
pv_track_buffer u =
case ugen_primitive_set u of
[] -> Left "pv_track_buffer: not located"
p:_ -> case ugenName p of
"FFT" -> Right (ugenInputs p !! 0)
"PV_Split" -> Right (ugenInputs p !! 1)
_ -> pv_track_buffer (ugenInputs p !! 0)
buffer_nframes :: UGen -> UGen
buffer_nframes u =
case ugen_primitive_set u of
[] -> DB.bufFrames (rateOf u) u
p:_ -> case ugenName p of
"LocalBuf" -> ugenInputs p !! 1
_ -> DB.bufFrames (rateOf u) u
pv_track_nframes :: UGen -> Either String UGen
pv_track_nframes u = pv_track_buffer u >>= Right . buffer_nframes