Theater System OSC Protocol

The various components of the theater system communicate using OSC messages transmitted via UDP packets either over the network or within the theater server. Following is a summary of available messages.

This is a work in progress.

Lighting Hardware

The lighting server is organized by logical fixtures. The following table describes each fixture and the associated hardware and DMX addressing. This is highly subject to change as the setup evolves. The current values can be found in the theater.config module.

Please note that DMX addresses are specified conventionally as 1-based following the physical device display settings, although internally the code uses zero-based addressing.

name

number

device

DMX addr

function

white

0

Dimmer 1

1

Soraa PAR30 aimed at disco ball

blue

1

Dimmer 1

2

Soraa PAR30 with blue gel

magenta

2

Dimmer 1

3

Soraa PAR30 with magenta gel

straw

3

Dimmer 1

4

Soraa PAR30 with straw-colored gel

black

4

Dimmer 2

5

LED black light

unused1

5

Dimmer 2

6

unused

unused2

6

Dimmer 2

7

unused

fan

7

Dimmer 2

8

box fan

rgba1

8

Slim Par Pro 1

9-12

Red-Green-Blue-Amber footlight

rgba2

9

Slim Par Pro 2

13-16

Red-Green-Blue-Amber footlight

Lighting OSC Messages

The system uses a single DMX output device so all fixtures are managed by a single lighting server.

/fixture

The /fixture message initiates a smooth change on a single fixture using a single-beat cubic spline with ease-in and ease-out. Each dimmer pack output is treated as a separate fixture. The first value is a fixture identifier, followed by one DMX value per fixture channel. E.g., a mono dimmer pack output uses one value between 0 and 255, or a RGBA color fixture uses four.

The fixture identifier may be either a name (recommended) or a number.

Examples:

/fixture white 255
/fixture rgba1 255 255 255 0
/fixture fan 128
/fixture 0 128

/spline

Animated lighting effects can be achieved using the /spline message which appends a multi-segment cubic Bezier spline path to the interpolator buffer for a single fixture.

The first message value specifies a fixture identifier, followed by a row-major array representing a matrix of Bezier spline knots. The matrix has one column per fixture channel and three rows per spline segment, and specifies DMX output values. The implicit first knot is the current fixture state (not included in the message).

Example:

/spline white 0 255 255
/spline white 255 180 180 180 0 0
/spline rgba1 0 0 0 0 255 255 255 0 255 255 255 0

The first example is a single-segment spline for a mono segment smoothly ending at 255 (full on) The second example is a two-segment spline which smoothly transitions to half-on and then off. The third example is a single-segment spline for a four-channel RGBA fixture which smoothly transitions to pure white (with the fourth amber channel off). Each grouping of four values represents a single row of the knot matrix.

/tempo

The lighting spline execution rate is set by the /tempo message which accepts a fixture identifier followed by a rate in segments/minute. This value is applied to all subsequent paths on that fixture. The initial default is 60 segments/minute, i.e. one second per segment.

Examples:

/tempo white 60
/tempo white 30
/tempo rgba1 120

Deprecated Messages

Several other messages are still in the code but are not recommended for current use.

Examples:

/set 0 0 0 0
/fade 0 0 0 0
/channel 0 0

Motion OSC Messages

Each motion server operates a single device. Currently, we have up to four systems running the ArduinoSpline firmware, each of which can drive up to four stepper motors. The motion units use sequential UDP ports.

/spline

The essential motion primitive is the /spline message which appends a multi-segment cubic Bezier spline path to the motion buffer for a single axis. The spline is specified in degrees of rotation relative to the starting position. The first knot is implicitly zero and is omitted, so each segment requires three knot values. The firmware buffer is limited to 20 segments, so overly-long sequences may be silently truncated.

Example:

/spline x 0 360 360 180 180 180 0 0 0

This is interpreted as a three-segment spline to be executed by the X axis motor. The first segment has an implicit zero followed by the first three values: [0, 0, 360, 360], which moves one full rotation with smooth boundary conditions at start and end. The second segment begins with the same endpoint and adds three more values: [360, 180, 180, 180], which produces a half-rotation backwards with an initial velocity discontinuity and a smooth end. The third segment is similar: [180, 0, 0, 0], finishing with a smooth deceleration to the starting position.

Format:

/spline <axis> k01 k02 k03 [k11 k12 k13 ...]

The axis specifier may be either a letter chosen from xyza or a number from 0 to 3. The implicit first knot of zero is omitted, then each segment adds three knot values, with the end point of one segment always used as the initial point of the next.

/tempo

The spline execution rate is set by the /tempo message which accepts a an axis identifier followed by a rate in segments/minute. This value is applied to all subsequent paths on that axis. The power-on default is 60 segments/minute, i.e. one second per segment.

Examples:

/tempo x 60
/tempo x 30
/tempo y 120.0

Other Messages

Several other messages are available for system testing but are not recommended for performance scripts as they are subject to change.

Examples:

/goto 0 0 0 0
/goto 0 90 0 360
/channel 0 360
/channel x 360