hsc3-0.21: Sound/Sc3/Server/Command/Enum.hs
-- | Enumeration of SC3 server commands.
module Sound.Sc3.Server.Command.Enum where
import Data.List {- base -}
import Data.Maybe {- base -}
import qualified Sound.Osc.Packet as Osc {- hosc -}
-- | SC3 server commands are strings.
type SC3_Command = String
-- | Enumerate server command numbers.
sc3_cmd_enumeration :: [(SC3_Command, Int)]
sc3_cmd_enumeration =
[ ("/notify", 1)
, ("/status", 2)
, ("/quit", 3)
, ("/cmd", 4)
, -- /d = synthdef
("/d_recv", 5)
, ("/d_load", 6)
, ("/d_loadDir", 7)
, ("/d_freeAll", 8)
, -- /s = synth
("/s_new", 9)
, -- /n = node
("/n_trace", 10)
, ("/n_free", 11)
, ("/n_run", 12)
, ("/n_cmd", 13)
, ("/n_map", 14)
, ("/n_set", 15)
, ("/n_setn", 16)
, ("/n_fill", 17)
, ("/n_before", 18)
, ("/n_after", 19)
, -- /u = ugen
("/u_cmd", 20)
, -- /g = group
("/g_new", 21)
, ("/g_head", 22)
, ("/g_tail", 23)
, ("/g_freeAll", 24)
, -- /c = control
("/c_set", 25)
, ("/c_setn", 26)
, ("/c_fill", 27)
, -- /b = buffer
("/b_alloc", 28)
, ("/b_allocRead", 29)
, ("/b_read", 30)
, ("/b_write", 31)
, ("/b_free", 32)
, ("/b_close", 33)
, ("/b_zero", 34)
, ("/b_set", 35)
, ("/b_setn", 36)
, ("/b_fill", 37)
, ("/b_gen", 38)
, --
("/dumpOSC", 39)
, -- _get
("/c_get", 40)
, ("/c_getn", 41)
, ("/b_get", 42)
, ("/b_getn", 43)
, ("/s_get", 44)
, ("/s_getn", 45)
, -- _query
("/n_query", 46)
, ("/b_query", 47)
, --
("/n_mapn", 48)
, ("/s_noid", 49)
, --
("/g_deepFree", 50)
, ("/clearSched", 51)
, --
("/sync", 52)
, --
("/d_free", 53)
, -- _channel
("/b_allocReadChannel", 54)
, ("/b_readChannel", 55)
, -- _tree
("/g_dumpTree", 56)
, ("/g_queryTree", 57)
, -- error
("/error", 58)
, -- _args
("/s_newargs", 59)
, --
("/n_mapa", 60)
, ("/n_mapan", 61)
, ("/n_order", 62)
]
{- | Lookup command number in 'sc3_cmd_enumeration'.
>>> map sc3_cmd_number ["/b_alloc","/s_new"]
[Just 28,Just 9]
-}
sc3_cmd_number :: SC3_Command -> Maybe Int
sc3_cmd_number = flip lookup sc3_cmd_enumeration
-- | 'isJust' of 'sc3_cmd_number'.
known_sc3_cmd :: SC3_Command -> Bool
known_sc3_cmd = isJust . sc3_cmd_number
-- | List of asynchronous server commands, ie. commands that reply with @/done@.
async_cmds :: [SC3_Command]
async_cmds =
[ "/b_alloc"
, "/b_allocRead"
, "/b_allocReadChannel"
, "/b_close"
, "/b_free"
, "/b_read"
, "/b_readChannel"
, "/b_write"
, "/b_zero"
, "/d_load"
, "/d_loadDir"
, "/d_recv"
, "/notify"
, "/quit"
, "/sync"
]
{- | 'True' if 'Message' is an asynchronous 'Message'.
> import Sound.Sc3.Server.Command.Plain
> map isAsync [b_close 0,n_set1 0 "0" 0,status] == [True,False,False]
-}
isAsync :: Osc.Message -> Bool
isAsync (Osc.Message a _) = a `elem` async_cmds
{- | Asynchronous commands are at the left.
This function should preserve the ordering of both branches.
> partition_async [b_close 0,n_set1 0 "0" 0]
-}
partition_async :: [Osc.Message] -> ([Osc.Message], [Osc.Message])
partition_async = partition isAsync
-- | Types & names for @b_info@ message fields.
b_info_fields :: [(String, String)]
b_info_fields =
[ ("int", "buffer-id")
, ("int", "frame-count")
, ("int", "channels-count")
, ("float", "sample-rate")
]
-- | Type, name and value descriptors for fields of @n_info@ message.
n_info_fields :: [(String, String, String)]
n_info_fields =
[ ("int", "node-id", "")
, ("int", "parent group-id", "-1 = nil")
, ("int", "previous node-id", "-1 = nil")
, ("int", "next node-id", "-1 = nil")
, ("int", "node-type", "0 = synth,1 = group")
, ("int", "head node-id", "-1 = nil")
, ("int", "tail node-id", "-1 = nil")
]