Between hosts

Three things cross between hosts: a bundle of data, a program, and a running machine.

They all come in through one door. Whatever arrives at a host goes into the machine’s input register and the machine runs it; the door checks only that it is a well-formed bundle. So every arrival is a program followed by a verb: data followed by what to do with it, source followed by the verb that parses and runs it, a machine followed by /continue/admit. The verb is the sender’s, and what a host does with what it is handed is its own.

Trust

The door checks one thing: that what arrived is a well-formed bundle. Nothing else about it is inspected, neither who sent it nor what it will do. A host then runs what it is sent, with every capability it has bound. That assumes a network you trust: a studio, a stage, a lab. A host reachable from beyond one belongs behind whatever you put any listening service behind.

A bundle of data

Any OSC tool can send one to a host’s port. The command line receives on a port it opens, and hands each arrival to a function:

/show : ({ (/b) /o/println }, ["/b"]) /o/defn, (7788, /show) /o/listen

The board listens on UDP 8888 and answers whoever sent to it; the Python host’s examples/udp.py --serve 7777 is a responder to try against.

A program

Source, or already parsed: the parsed form needs only a machine at the far end, the source needs osen there too and is smaller on the wire.

A running machine

("host:port") /continue/at moves the running program to that address; the rest of it runs on the far side, and a name it bound before the move is bound after it too. A program leaves one window and finishes in another shows it, and A line fails at the prompt, and you fix it there is the kept machine, looked at and repaired without leaving the prompt.

("/name", "host:port") /continue/copy sends a copy of a loop, its state with it; the far end files it under the same name, where it carries on from its count, and the original runs on. A loop whose period fails is parked where it is, as it was at the fault, and a copy of it goes anywhere a machine goes: fixed at a prompt or in a page, it returns with (machine, "/name", "host:port") /o/machine/resume into the parked loop of that name, which carries on from the step that failed. Fix a loop that failed on a board is the round trip, from a blank board.

Who is there

A node is anything on the network that answers the census: a program at a prompt, examples/census.osen in unix.o.se, that listens on UDP 19993, asks the network who is there, and keeps a list of who answered and for how long they said to hold them. Nothing on a node is built for it but two names, /node/id and /addr/here: the question is a program sent to the node, which reads its own list of loops and the count of its names and sends them home. A board announces itself when it boots, a prompt serving on 8888 says () /node/hello, and a patch with [o.se.node 7401] in it answers like either. The view draws that list as cards.

Transports

From → to

from \ to command line Max browser board Python
command line machine program machine, via the bridge machine program
Max program program program, via the bridge program program
browser machine, via the bridge program, via the bridge — machine, via the bridge program, via the bridge
board machine program machine, via the bridge machine program
Python program program program program program
any OSC tool data data data, via the bridge data data

machine: a running machine crosses and continues; program: a bundle that runs at the far end; data: a bundle arrives as data; —: no transport both ends share. A board on a USB cable is the board column reached as serial:// instead of over WiFi.

Recipes


Overview · The hosts · Examples