-- | 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 :: Time -> UGen -> NRT
nrt_ugen_rec Time
dur UGen
u =
    let sg :: UGen
sg = case UGen -> Rate
rateOf UGen
u of
               Rate
AR -> UGen
u
               Rate
KR -> UGen -> UGen
k2a UGen
u
               Rate
_ -> [Char] -> UGen
forall a. HasCallStack => [Char] -> a
error [Char]
"nrt_ugen_rec: rate?"
        sy :: Synthdef
sy = [Char] -> UGen -> Synthdef
synthdef [Char]
"anonymous" (UGen -> UGen -> UGen
out UGen
0 UGen
sg)
        m0 :: Message
m0 = Synthdef -> Message
d_recv Synthdef
sy
        m1 :: Message
m1 = [Char] -> Synth_Id -> AddAction -> Synth_Id -> Message
s_new0 [Char]
"anonymous" Synth_Id
1 AddAction
AddToHead Synth_Id
0
    in [Bundle] -> NRT
NRT [Time -> [Message] -> Bundle
bundle Time
0 [Message
m0,Message
m1],Time -> [Message] -> Bundle
bundle Time
dur [Message
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 :: ([Char], [Char], Synth_Id, SampleFormat, [[Char]])
-> Time -> UGen -> IO ()
nrt_ugen_render ([Char]
osc_fn,[Char]
sf_fn,Synth_Id
sample_rate,SampleFormat
fmt,[[Char]]
opt) Time
dur UGen
u = do
  let sc :: NRT
sc = Time -> UGen -> NRT
nrt_ugen_rec Time
dur UGen
u
      nc :: Synth_Id
nc = [UGen] -> Synth_Id
forall (t :: * -> *) a. Foldable t => t a -> Synth_Id
length (UGen -> [UGen]
mceChannels UGen
u)
  NRT_Render_Plain -> NRT -> IO ()
nrt_render_plain ([Char]
osc_fn,[Char]
sf_fn,Synth_Id
nc,Synth_Id
sample_rate,SampleFormat
fmt,[[Char]]
opt) NRT
sc