packages feed

supercollider-ht-0.1: src/Sound/SC3/Example/Timing.hs

{-
Rohan Drape: Haskell-Cafe, 2006-11-08
-}

import Sound.OpenSoundControl(OSC(Bundle))
import Sound.OpenSoundControl.Time(utc)
import Rhs.Schedule(at, pauseThread)
import Sound.OpenSoundControl.Transport.Monad(send)
import Sound.SC3
import qualified Sound.SC3.Server.Play as Play
import Control.Concurrent (forkIO)
import Control.Monad.Trans (liftIO)

ping f a = out 0 (sinOsc AR f 0 * e)
     where c = EnvNum (-4.0)
           e = envGen KR 1 a 0 1 RemoveSynth (envPerc 0.1 0.6 1 [c,c])

latency = 0.05

bundle t m = Bundle (t + latency) m

scPutStrLn = liftIO . putStrLn

pinger = do now <- utc
            at (fromIntegral (ceiling now)) f
    where f t = withSC3 $
                do send (bundle t [s_new "ping" 42 AddToTail 1])
--                   send (n_run (-1) True)
                   send (bundle (t+0.1) [n_run 42 False, n_free 42])
--                   send (bundle (t+0.1) [])
--                   send (n_free 101)
--                   send (bundle (t+0.1) [s_new "pong" 5 AddToTail 1])
                   scPutStrLn "Sending ping"
                   return 1.0

main = withSC3 $
       do scPutStrLn "Sending Ping Instrument"
          Play.sync (Play.d_recv' "ping" (ping 880 0.1))
--          sync (d_recv' "pong" (ping 660 0.1))
          scPutStrLn "Resetting scsynth"
          reset
          scPutStrLn "Starting schedule thread"
          liftIO $ forkIO pinger
          scPutStrLn "Delaying main thread"
          liftIO $ pauseThread 30
          scPutStrLn "End of delay, exiting"