-- http://article.gmane.org/gmane.comp.lang.haskell.art/993
import Sound.SC3 {- hsc3 -}
lp :: Synthdef
lp =
let in_bus = control KR "in_bus" 0
out_bus = control KR "out_bus" 0
buf_num = control KR "buf_num" 0
lp_frames = control KR "lp_frames" 48000
rec_level = control KR "rec_level" 1
mute = control KR "mute" 0
oct = control KR "oct" 1
dir = control KR "dir" 1
latency = control KR "latency" 256
t_reset = tr_control "t_reset" 0
lp_frames' = min (bufFrames KR buf_num) lp_frames
rec_ph = phasor AR t_reset (oct * dir) 0 lp_frames' 0
play_ph = wrap (rec_ph + latency) 0 (lp_frames' - 1)
play_rd = bufRdL 1 AR buf_num play_ph Loop
rec_rd = bufRdL 1 AR buf_num rec_ph Loop
in_sig = soundIn in_bus * rec_level
env = envGen KR (1 - mute) 1 0 1 DoNothing (envADSR 0.05 1 1 0.1 1 (EnvNum (-4)) 0)
wr = bufWr buf_num rec_ph Loop (in_sig + rec_rd)
in synthdef "lp" (mrg2 (out out_bus (play_rd * env)) wr)
node_id :: Int
node_id = 1000
set :: String -> Double -> IO ()
set k v = withSC3 (send (n_set1 node_id k v))
main :: IO ()
main =
withSC3$do
_ <- async (b_alloc 0 (48000 * 2) 1)
play_at (node_id,AddToHead,1) lp
{-
set "oct" 1.0
set "dir" 1.0
set "mute" 0.0
set "t_reset" 1.0
set "lp_frames" (48000 * 2.0)
set "rec_level" 1
set "latency" 300
-}