module Sound.SC3.Server.Command where
import qualified Data.ByteString.Lazy as B
import Data.Word
import Sound.OpenSoundControl
import Sound.SC3.Server.Utilities
d_recv :: [Word8] -> OSC
d_recv b = message "/d_recv" [Blob b]
d_load :: String -> OSC
d_load p = message "/d_load" [String p]
d_loadDir :: String -> OSC
d_loadDir p = message "/d_loadDir" [String p]
d_free :: [String] -> OSC
d_free = message "/d_free" . map String
n_after :: [(Int, Int)] -> OSC
n_after = message "/n_after" . mk_duples Int Int
n_before :: [(Int, Int)] -> OSC
n_before = message "/n_before" . mk_duples Int Int
n_fill :: Int -> [(String, Int, Double)] -> OSC
n_fill nid l = message "/n_fill" (Int nid : mk_triples String Int Float l)
n_free :: [Int] -> OSC
n_free = message "/n_free" . map Int
n_map :: Int -> [(String, Int)] -> OSC
n_map nid l = message "/n_map" (Int nid : mk_duples String Int l)
n_mapn :: Int -> [(String, Int, Int)] -> OSC
n_mapn nid l = message "/n_mapn" (Int nid : mk_triples String Int Int l)
n_query :: [Int] -> OSC
n_query = message "/n_query" . map Int
n_run :: [(Int, Bool)] -> OSC
n_run = message "/n_run" . mk_duples Int (Int . fromEnum)
n_set :: Int -> [(String, Double)] -> OSC
n_set nid c = message "/n_set" (Int nid : mk_duples String Float c)
n_setn :: Int -> [(String, [Double])] -> OSC
n_setn nid l = message "/n_setn" (Int nid : concatMap f l)
where f (s,d) = String s : Int (length d) : map Float d
n_trace :: [Int] -> OSC
n_trace = message "/n_trace" . map Int
s_get :: Int -> [String] -> OSC
s_get nid i = message "/s_get" (Int nid : map String i)
s_getn :: Int -> [(String, Int)] -> OSC
s_getn nid l = message "/s_getn" (Int nid : mk_duples String Int l)
data AddAction = AddToHead
| AddToTail
| AddBefore
| AddAfter
| AddReplace
deriving (Eq, Show, Enum)
s_new :: String -> Int -> AddAction -> Int -> [(String, Double)] -> OSC
s_new n i a t c = message "/s_new" (String n : Int i : Int (fromEnum a) : Int t : mk_duples String Float c)
s_newargs :: String -> Int -> AddAction -> Int -> [(String, [Double])] -> OSC
s_newargs n i a t c = message "/s_newargs" (String n : Int i : Int (fromEnum a) : Int t : mk_duples_l Int String Float c)
s_noid :: [Int] -> OSC
s_noid = message "/s_noid" . map Int
g_deepFree :: [Int] -> OSC
g_deepFree = message "/g_deepFree" . map Int
g_freeAll :: [Int] -> OSC
g_freeAll = message "/g_freeAll" . map Int
g_head :: [(Int, Int)] -> OSC
g_head = message "/g_head" . mk_duples Int Int
g_new :: [(Int, AddAction, Int)] -> OSC
g_new = message "/g_new" . mk_triples Int (Int . fromEnum) Int
g_tail :: [(Int, Int)] -> OSC
g_tail = message "/g_tail" . mk_duples Int Int
u_cmd :: Int -> Int -> String -> [Datum] -> OSC
u_cmd nid uid cmd arg = message "/u_cmd" ([Int nid, Int uid, String cmd] ++ arg)
b_alloc :: Int -> Int -> Int -> OSC
b_alloc nid frames channels = message "/b_alloc" [Int nid, Int frames, Int channels]
b_allocRead :: Int -> String -> Int -> Int -> OSC
b_allocRead nid p f n = message "/b_allocRead" [Int nid, String p, Int f, Int n]
b_allocReadChannel :: Int -> String -> Int -> Int -> [Int] -> OSC
b_allocReadChannel nid p f n cs = message "/b_allocReadChannel" ([Int nid, String p, Int f, Int n] ++ map Int cs)
b_close :: Int -> OSC
b_close nid = message "/b_close" [Int nid]
b_fill :: Int -> [(Int, Int, Double)] -> OSC
b_fill nid l = message "/b_fill" (Int nid : mk_triples Int Int Float l)
b_free :: Int -> OSC
b_free nid = message "/b_free" [Int nid]
b_gen :: Int -> String -> [Double] -> OSC
b_gen bid cmd arg = message "/b_gen" (Int bid : String cmd : map Float arg)
b_get :: Int -> [Int] -> OSC
b_get nid i = message "/b_get" (Int nid : map Int i)
b_getn :: Int -> [(Int, Int)] -> OSC
b_getn nid l = message "/b_getn" (Int nid : mk_duples Int Int l)
b_query :: [Int] -> OSC
b_query = message "/b_query" . map Int
b_read :: Int -> String -> Int -> Int -> Int -> Int -> OSC
b_read nid p f n f' z = message "/b_read" [Int nid, String p, Int f, Int n, Int f', Int z]
b_readChannel :: Int -> String -> Int -> Int -> Int -> Int -> [Int] -> OSC
b_readChannel nid p f n f' z cs = message "/b_readChannel" ([Int nid, String p, Int f, Int n, Int f', Int z] ++ map Int cs)
b_set :: Int -> [(Int, Double)] -> OSC
b_set nid l = message "/b_set" (Int nid : mk_duples Int Float l)
b_setn :: Int -> [(Int, [Double])] -> OSC
b_setn nid l = message "/b_setn" (Int nid : concatMap f l)
where f (i,d) = Int i : Int (length d) : map Float d
b_write :: Int -> String -> Int -> Int -> Int -> Int -> Int -> OSC
b_write nid p h t f s z = message "/b_write" [Int nid, String p, Int h, Int t, Int f, Int s, Int z]
b_zero :: Int -> OSC
b_zero nid = message "/b_zero" [Int nid]
c_fill :: [(Int, Int, Double)] -> OSC
c_fill = message "/c_fill" . mk_triples Int Int Float
c_get :: [Int] -> OSC
c_get = message "/c_get" . map Int
c_getn :: [(Int, Int)] -> OSC
c_getn = message "/c_getn" . mk_duples Int Int
c_set :: [(Int, Double)] -> OSC
c_set = message "/c_set" . mk_duples Int Float
c_setn :: [(Int, [Double])] -> OSC
c_setn l = message "/c_setn" (concatMap f l)
where f (i,d) = Int i : Int (length d) : map Float d
clearSched :: OSC
clearSched = message "/clearSched" []
data PrintLevel = NoPrinter
| TextPrinter
| HexPrinter
| AllPrinter
deriving (Eq, Show, Enum)
dumpOSC :: PrintLevel -> OSC
dumpOSC c = message "/dumpOSC" [Int (fromEnum c)]
notify :: Bool -> OSC
notify c = message "/notify" [Int (fromEnum c)]
quit :: OSC
quit = message "/quit" []
status :: OSC
status = message "/status" []
sync :: Int -> OSC
sync sid = message "/sync" [Int sid]
b_set1 :: Int -> Int -> Double -> OSC
b_set1 nid i x = b_set nid [(i,x)]
b_setn1 :: Int -> Int -> [Double] -> OSC
b_setn1 nid i xs = b_setn nid [(i,xs)]
c_set1 :: Int -> Double -> OSC
c_set1 i x = c_set [(i, x)]
n_set1 :: Int -> String -> Double -> OSC
n_set1 nid k n = n_set nid [(k, n)]
async_cmds :: [String]
async_cmds = ["/d_recv", "/d_load", "/d_loadDir"
,"/b_alloc", "/b_allocRead", "/b_allocReadChannel"
,"/b_free", "/b_close"
,"/b_read", "/b_readChannel"
,"/b_write", "/b_zero"]
withCM :: OSC -> OSC -> OSC
withCM (Message c xs) cm =
if c `elem` async_cmds
then let xs' = xs ++ [Blob (B.unpack (encodeOSC cm))]
in message c xs'
else error ("withCM: not async: " ++ c)
withCM _ _ = error "withCM: not message"