module Sound.SC3.UGen.Name where
import Data.Char
import Data.List.Split
import Sound.SC3.Common.Prelude
import Sound.SC3.UGen.Rate
toSC3Name :: String -> String
toSC3Name nm =
case nm of
"in'" -> "In"
"bpz2" -> "BPZ2"
"brz2" -> "BRZ2"
"ifft" -> "IFFT"
"out" -> "Out"
"rhpf" -> "RHPF"
"rlpf" -> "RLPF"
'f':'b':nm' -> "FB" ++ nm'
'h':'p':'z':nm' -> "HPZ" ++ nm'
'l':'f':'d':nm' -> "LFD" ++ nm'
'l':'p':'z':nm' -> "LPZ" ++ nm'
'l':'f':nm' -> "LF" ++ nm'
'p':'v':'_':nm' -> "PV_" ++ nm'
p:q -> if all isLower nm && length nm <= 3
then map toUpper nm
else toUpper p : q
[] -> []
fromSC3Name :: String -> String
fromSC3Name nm =
case nm of
"In" -> "in'"
"BPZ2" -> "bpz2"
"BRZ2" -> "brz2"
"IFFT" -> "ifft"
"RHPF" -> "rhpf"
"RLPF" -> "rlpf"
'F':'B':nm' -> "fb" ++ nm'
'H':'P':'Z':nm' -> "hpz" ++ nm'
'L':'F':'D':nm' -> "lfd" ++ nm'
'L':'P':'Z':nm' -> "lpz" ++ nm'
'L':'F':nm' -> "lf" ++ nm'
'P':'V':'_':nm' -> "pv_" ++ nm'
p:q -> if all isUpper nm && length nm <= 3
then map toLower nm
else toLower p : q
[] -> []
sc3_name_edges :: String -> [Bool]
sc3_name_edges =
let f t = case t of
(Nothing,_,_) -> False
(Just p,q,Just r) ->
(isLower p && isUpper q) ||
(isUpper p && isUpper q && isLower r && [p,q,r] /= "UGe")
(Just p,q,Nothing) -> isLower p && isUpper q
in map f . pcn_triples
sc3_name_to_lisp_name :: String -> String
sc3_name_to_lisp_name s =
let f (c,e) = if e then ['-',c] else if c == '_' then "-" else [c]
in concatMap f (zip (map toLower s) (sc3_name_edges s))
sc3_ugen_name_sep :: String -> Maybe (String,Maybe Rate)
sc3_ugen_name_sep u =
case splitOn "." u of
[nm,rt] -> Just (nm,rate_parse (map toUpper rt))
[nm] -> Just (nm,Nothing)
_ -> Nothing