packages feed

hsc3-0.18: Sound/SC3/Server/NRT/UGen.hs

-- | NRT / UGen
module Sound.SC3.Server.NRT.UGen where

import Sound.OSC {- hosc -}

import Sound.SC3.Common.Rate
import Sound.SC3.Server.Command.Plain
import Sound.SC3.Server.Enum
import Sound.SC3.Server.NRT
import Sound.SC3.Server.Synthdef
import Sound.SC3.UGen.Bindings.DB
import Sound.SC3.UGen.Type

-- | Make NRT score that runs /u/ for /dur/ seconds to output bus zero.
--   If /u/ is at KR insert 'k2a' UGen.
nrt_ugen_rec :: Time -> UGen -> NRT
nrt_ugen_rec dur u =
    let sg = case rateOf u of
               AR -> u
               KR -> k2a u
               _ -> error "nrt_ugen_rec: rate?"
        sy = synthdef "anonymous" (out 0 sg)
        m0 = d_recv sy
        m1 = s_new0 "anonymous" 1 AddToHead 0
    in NRT [bundle 0 [m0,m1],bundle dur [nrt_end]]

-- | 'nrt_render_plain' of 'ugen_rec_nrt'.
--   The number of channels is equal to the degree of /u/.
nrt_ugen_render :: (FilePath, FilePath, Int, SampleFormat, [String]) -> Time -> UGen -> IO ()
nrt_ugen_render (osc_fn,sf_fn,sample_rate,fmt,opt) dur u = do
  let sc = nrt_ugen_rec dur u
      nc = length (mceChannels u)
  nrt_render_plain (osc_fn,sf_fn,nc,sample_rate,fmt,opt) sc