Getting started with the serialosc protocol

This is not a Haskell question; it is entirely about the serialosc protocol. (I say that to avoid losing the interest of any serialosc whiz who does not use Haskell.) However, it is motivated by some Haskell code, which is the subject of this thread.

Question 1: What are these symbols?

The serialosc protocol includes some mysterious symbols.

For instance, in /serialosc/list si <host> <port>, what does si represent? Is it even sent? (I ask because pymonome includes the line self.send('/serialosc/list',, self.port), which makes no mention of si.)

What about the i in /sys/port i <port>? The s in /sys/host s <host>? The ssi in /serialosc/device ssi <id> <type> <port>? The ii in /sys/size ii report grid device size?

Question 2: Am I trying to do the right thing?

Based on my interpretation of the serialosc protocol, this program seems like it ought to work. The function monomeMailbox starts a process listening on localhost port 0 which simply prints to screen any OSC messages it receives. requestMonomeInfo sends (when the user chooses, from a separate interpreter) the OSC message /sys/info localhost 0 (where “localhost” is a four-number address, not the word “localhost”) to localhost port 12002. If I understand the serialosc protocol correctly, that message should cause serialosc to send some data describing connected devices to localhost port 0.

I know serialosc is running, because I can run the first program in the monome Python tutorial. And I know the mailbox is working, because I can send to it with the function testMailbox.

For the port number in the /sys/info message I’ve tried sending both a string and an int.

pymonome uses aiosc, which sends OSC over UDP. And Wikipedia indicates that OSC uses UDP. So it seems clear that I should be using UDP, not TCPIP.

Running ifconfig from Bash indicates that the only other network address in use on my system is So for localhost I’ve tried using both and (If I’m reading the pymonome code correctly, is the one to use.)

I can’t think of any other variations to try. In all cases the mailbox reports nothing.

The si here describes the types of the following arguments (string, integer in this case).

Port 0 is a reserved port. You can’t send data to it. When listening on port 0, the operating system will try to find the first unused port for you.

If you can get the port number after opening a socket on port 0, you can send that to /sys/info. Otherwise just choose a fixed port number that is greater than 1024.

Since you’re receiving data on localhost (, do not use the network address (, or create a socket with address - this will make your program listen on both interfaces.

YES! It works now! Thanks, Art!