packages feed

hsc3-server-0.4.0: examples/hello.hs

import           Control.Monad.IO.Class (liftIO)
import           Sound.SC3.UGen
import           Sound.SC3.Server.Monad
import           Sound.SC3.Server.Monad.Command
-- You need the hsc3-server-internal package in order to use the internal server
--import           Sound.SC3.Server.Monad.Process.Internal (withDefaultInternal)
import           Sound.SC3.Server.Monad.Process (withDefaultSynth)
import           Sound.SC3.Server.Monad.Request ((!>), async, extract, resource, whenDone)
import           Sound.SC3.Server.Notification
import           Sound.OpenSoundControl (immediately)
import qualified Sound.OpenSoundControl as OSC

sine = out 0 $ pan2 x (sinOsc KR 1 0) 1
    where x = sinOsc AR (control KR "freq" 440) 0
                * control KR "amp" 1
                * envGen KR (control KR "gate" 1) 1 0 1 RemoveSynth (envASR 1 1 1 EnvLin)

pauseThread = liftIO . OSC.pauseThread

statusLoop = do
    immediately !> status >>= extract >>= liftIO . print
    pauseThread 1
    statusLoop

-- You need the hsc3-server-internal package in order to use the internal server
--run = withDefaultInternal
run = withDefaultSynth

latency = 0.03
 
main = run $ do
    immediately !> dumpOSC TextPrinter
    r <- rootNode
    synth <- extract =<< immediately !> do
        d_recv "hsc3-server:sine" sine `whenDone`
            \sd -> resource =<< s_new sd AddToTail r [("freq", 440), ("amp", 0.2)]
    fork statusLoop
    pauseThread 10
    immediately !> s_release 0 synth
    pauseThread 2