module Sound.SC3.Server.Synthdef where
import qualified Data.ByteString.Lazy as L
import System.FilePath
import Sound.SC3.UGen.Graph
import Sound.SC3.UGen.Help.Graph
import Sound.SC3.UGen.Type
import qualified Sound.SC3.Server.Graphdef as Graphdef
import qualified Sound.SC3.Server.Graphdef.Graph as Graph
data Synthdef = Synthdef {synthdefName :: String
,synthdefUGen :: UGen}
deriving (Eq,Show)
synthdef :: String -> UGen -> Synthdef
synthdef = Synthdef
defaultSynthdef :: Synthdef
defaultSynthdef = synthdef "default" default_ugen_graph
defaultSampler :: Bool -> Synthdef
defaultSampler use_gate =
let nm = "default-sampler-" ++ if use_gate then "gate" else "fixed"
in synthdef nm (default_sampler_ugen_graph use_gate)
synthdefGraph :: Synthdef -> U_Graph
synthdefGraph = ugen_to_graph . synthdefUGen
synthdefParam :: Synthdef -> [String]
synthdefParam = map u_node_k_name . ug_controls . synthdefGraph
synthdef_to_graphdef :: Synthdef -> Graphdef.Graphdef
synthdef_to_graphdef (Synthdef nm u) = Graph.graph_to_graphdef nm (ugen_to_graph u)
synthdefData :: Synthdef -> L.ByteString
synthdefData = Graphdef.encode_graphdef . synthdef_to_graphdef
synthdefWrite :: Synthdef -> FilePath -> IO ()
synthdefWrite s dir =
let nm = dir </> synthdefName s <.> "scsyndef"
in L.writeFile nm (synthdefData s)
synthstat_ln :: UGen -> [String]
synthstat_ln = ug_stat_ln . ugen_to_graph
synthstat :: UGen -> String
synthstat = unlines . synthstat_ln
synthstat_concise :: UGen -> String
synthstat_concise = unlines . reverse . drop 1 . reverse . synthstat_ln