module Sound.SC3.UGen.DB.Bindings where
import Data.List
import Data.Maybe
import Sound.SC3.UGen.Name
import Text.Printf
import Sound.SC3.UGen.DB.Record
ugen_mce_sane :: U -> Bool
ugen_mce_sane u =
case ugen_mce_input u of
Just n -> n == length (ugen_inputs u) 1
Nothing -> True
u_input_names :: U -> [String]
u_input_names = map input_name . ugen_inputs
unenumerator :: String -> String
unenumerator en =
case en of
"Loop" -> "from_loop"
"Interpolation" -> "from_interpolation"
"DoneAction" -> "from_done_action"
"Warp" -> "from_warp"
_ -> error "unenumerator"
input_name_proc :: I -> String
input_name_proc i =
let nm = input_name i
in case input_enumeration i of
Just en -> printf "%s %s" (unenumerator en) nm
Nothing -> nm
u_input_names_proc :: U -> [String]
u_input_names_proc = map input_name_proc . ugen_inputs
about :: (a, a) -> [a] -> [a]
about (p,q) s = p : s ++ [q]
brckt :: String -> String
brckt = about ('[',']')
quote :: [Char] -> [Char]
quote = about ('"','"')
ppl_space :: [String] -> String
ppl_space = unwords'
ppl_list :: [String] -> String
ppl_list = brckt . intercalate ","
unwords' :: [String] -> String
unwords' = unwords . filter (not . null)
u_gen_type_sig :: U -> [String]
u_gen_type_sig u =
let i = ugen_inputs u
i_sig = map (fromMaybe "UGen" . input_enumeration) i
nm_h = ugen_name u
o = case ugen_outputs u of
Left _ -> ""
Right _ -> "Int ->"
r = if isNothing (ugen_filter u)
then "Rate ->"
else ""
i_sig' = intercalate " -> " i_sig
arr = if null i then "" else "->"
in [nm_h,"::",o,r,i_sig',arr,"UGen"]
u_outputs :: U -> (String,String)
u_outputs u =
case ugen_outputs u of
Left n -> ("",show n)
Right _ -> ("numChannels","numChannels")
u_gen_osc_f :: U -> [String]
u_gen_osc_f u =
let nm_h = ugen_name u
nm = toSC3Name nm_h
i_s = ppl_space (u_input_names u)
i_l = ppl_list (u_input_names_proc u)
r = ppl_list (map show (ugen_operating_rates u))
(o_lhs,o_rhs) = u_outputs u
in [nm_h,o_lhs,"rate",i_s,"= mkOscR",r,"rate",quote nm,i_l,o_rhs]
u_gen_filter_f :: U -> [String]
u_gen_filter_f u =
let nm_h = ugen_name u
nm = toSC3Name nm_h
i = u_input_names u
i_s = ppl_space i
i_l = ppl_list i
(o_lhs,o_rhs) = u_outputs u
in [nm_h,o_lhs,i_s,"= mkFilter",quote nm,i_l,o_rhs]
u_gen_binding :: U -> [String]
u_gen_binding u =
let c = ["-- |",ugen_summary u]
s = u_gen_type_sig u
b = case ugen_filter u of
Just _ -> u_gen_filter_f u
_ -> u_gen_osc_f u
in map unwords' [c,s,b]