packages feed

hsc3-graphs-0.12: gr/feedr.hs

-- feedr (rd)
-- warning: input/output feedback loop

import Sound.OSC.FD {- hosc -}
import Sound.SC3.Monad.FD {- hsc3 -}

delayWr :: UGen -> UGen -> UGen
delayWr b = recordBuf AR b 0 1 0 1 Loop 0 DoNothing

tap :: Int -> UGen -> UGen -> UGen
tap nc b dt = playBuf nc AR b 1 0 (dt * (- sampleRate)) Loop DoNothing

type State = (UGen,Double)

feedr :: (UId m) => State -> Int -> m UGen
feedr (ch,dl) n = do
  t <- sequence (replicate n (rand 0.0 (constant dl)))
  g <- sequence (replicate n (rand 0.4 1.0))
  f <- sequence (replicate n (rand 0.9 0.95))
  let d = zipWith (\p q -> tap 2 10 p * q) t g
      x = mouseX KR 0.02 1.0 Exponential 0.1
      s = clip2 (leakDC (hpf (sum d) 20) 0.995) 1
      i = soundIn ch
      r = i + sum (map (* x) (zipWith (*) d f))
  return (mrg [out 0 s, delayWr 10 r])

run :: Transport t => State -> t -> IO ()
run (ch,dl) fd = do
  nf <- fmap (* dl) (serverSampleRateActual fd)
  send fd (b_alloc 10 (floor nf) 2)
  audition =<< feedr (ch,dl) 18

main :: IO ()
main = withSC3 (run (mce2 4 5,6))

-- withSC3 (\fd -> send fd (b_zero 10))