Bryston SP4 Processor
The Bryston SP4 surround processor, controlled over IP. The driver speaks the SP4's
serial-over-IP control protocol — short text messages that begin with #10M and end in a
carriage return — sent to the control port the processor exposes on your network. It gives you
power, input selection, volume, and mute, and it keeps GEM's picture of the room in sync by
polling the processor for its current power and volume on a timer.
Because the processor answers volume and power queries with its real state, a level change made on the SP4's own remote or front panel shows up in GEM within a poll cycle — you don't have to do anything to keep them aligned.
How GEM sees the unit
This driver represents one SP4's main zone as a single device. It does not create a GEM control zone of its own, and it is not a matrix or controller. To get a room-level volume slider and mute button, you bind the device to an AV zone (see Linking to an AV zone below). Input selection is a device command you send directly or wire into a source macro — the SP4 is a single-zone processor, so there is no second zone to configure.
What's controlled
- Main-zone power on / off, with live power-state read-back on each poll
- Volume as a 0–100 level (mapped to the processor's −80 … +12 dB range), plus one-step up / down
- Mute on / off, and a native mute toggle
- Input selection across the processor's ten inputs (
00–09) - Background polling (default every 30 s) that mirrors the processor's real power and volume back into GEM
Prerequisites
- A Bryston SP4 on the LAN with IP control enabled (SP4 front-panel Network Settings menu).
- A stable IP for the processor — set a DHCP reservation or a static address so the control connection doesn't move.
- The control port the SP4 exposes. This varies by firmware, and the SP4 does not use a fixed, well-known port — check the processor's Network Settings for the port its IP-control bridge listens on. You must supply this; the driver has no default and will not connect without it.
Setup
- On the SP4, open Network Settings and enable IP control. Note the IP address and the control port the processor reports.
- In GEM, open Devices and choose Add a Device.
- Give it a Name (lowercase letters, numbers, and underscores — e.g.
theater_sp4) and an optional friendly Label. - Under Driver, pick Bryston SP4 Processor. Choose a Type (for example
av_receiver). - In the Device Attributes section, set Processor IP to the SP4's address.
- Expand the optional attributes and set TCP Port to the control port from step 1 — this is required in practice even though it's listed as optional, because the SP4 has no default control port. Optionally lower Monitor Interval (ms) if you want faster resync.
- Save. On connect, GEM opens the control connection and begins polling power and volume; the
device's
power_stateandvolumefill in within a poll cycle.
Linking to an AV zone
The processor feeds volume and mute into an AV zone rather than appearing as its own controllable zone:
- Open AV Zones and edit (or create) the zone for the room the SP4 serves.
- Set the Volume Device field to this Bryston device.
- Save. From then on the zone's volume slider and mute button drive the SP4, and each time the processor reports a new volume the zone mirrors it back.
Selecting an input is a device command, not a zone source change. The SP4's selected input
is tracked separately from GEM's AV source routing — choosing a room's source on a touchpanel
does not switch the processor's input on its own unless you wire the input command into that
source's on-macro. See AV Sources for where that macro lives.
Volume: the 0–100 scale and dB
The SP4's protocol carries volume as a raw value from 0200 (−80 dB) to 1120 (+12 dB). The
driver hides that: you always give it a 0–100 level, and it translates in both directions —
so the room slider and any macro work in the same 0–100 units as every other GEM volume.
The mapping is linear in dB, which makes it easy to calibrate:
| GEM level | Approx. level |
|---|---|
| 0 | −80 dB (effectively off) |
| 25 | −57 dB |
| 50 | −34 dB |
| 75 | −11 dB |
| 87 | ≈ 0 dB (reference) |
| 100 | +12 dB |
Each step of one on the 0–100 scale is roughly 0.9 dB. Because the translation rounds to whole steps in each direction, setting a level and reading it back can differ by one — that's expected and inaudible.
Attributes
Device — required
| Attribute | Type | Description |
|---|---|---|
ip | string | The SP4's LAN IP (shown in the form as Processor IP). |
Device — optional
| Attribute | Type | Default | Description |
|---|---|---|---|
port | int | (none) | The SP4 IP-control TCP Port. Required in practice — the port varies by firmware and there is no default. |
monitor_interval | int | 30000 | How often, in milliseconds, GEM polls the processor for power then volume (minimum 5000). Each poll queries power, waits one second, then queries volume. |
Device — reported state (read-only)
The driver fills these in as the processor reports them — they are status, not values you set:
| Attribute | Type | Description |
|---|---|---|
power_state | string | on / off, refreshed on each poll. |
volume | int | Current level on the 0–100 scale, refreshed on each poll. |
Input and mute are command-only — the driver sends them but does not poll them back or store
them as state. So an input or mute indicator won't auto-resync the way power and volume do. If
you need deterministic mute in a macro, prefer explicit mute_on / mute_off over
mute_toggle, since the toggle's resulting state isn't reported.
Commands
Each command's exact protocol string is shown so you can match it against Bryston's control reference. Every message is sent carriage-return-terminated. Where a command takes a value, the argument name is the one you supply in a macro.
Power
| Command | Sends | Notes |
|---|---|---|
power_on | #10MPWR01 | Main-zone power on. |
power_off | #10MPWR00 | Main-zone power off. |
get_power | #10MPWRQS | Query power state (populates power_state). |
Volume and mute
| Command | Sends | Notes |
|---|---|---|
volume | #10MVOL + level | Set volume. You supply a 0–100 volume; the driver converts it to the processor's raw 4-digit value (e.g. level 50 → #10MVOL0660). |
volume_up / volume_down | #10MVOLUP / #10MVOLDN | Step the volume up / down. |
get_volume | #10MVOLQS | Query volume (populates volume). |
mute_on / mute_off | #10MMUT01 / #10MMUT00 | Mute / unmute. |
mute_toggle | #10MMUT02 | Native mute toggle (see the note above about mute not being reported back). |
get_mute | #10MMUTQS | Query mute state (not stored as an attribute). |
Input
| Command | Sends | Notes |
|---|---|---|
input | #10MSRC + input | Select an input. input is a two-digit string, 00–09. |
get_input | #10MSRCQS | Query the selected input (not stored as an attribute). |
Known limitations and quirks
- No default control port. The SP4's IP-control port varies by firmware and isn't a well-known number. You must read it from the processor's Network Settings and enter it as the TCP Port — without it, the device won't connect.
- Only power and volume are polled. The background poll refreshes power and volume; input and mute are sent but never read back. Don't expect a mute or input indicator to track changes made on the SP4's own remote.
- Single main zone only. The driver controls the SP4's main zone. It doesn't expose a second zone and doesn't create GEM zones automatically — you attach it to an AV zone yourself.
- Idle-connection drops on some firmware. A few firmware revisions close an idle control connection after about a minute. GEM reconnects automatically, but if you see the connection flapping, lower Monitor Interval (ms) so regular polling keeps the link busy.
Troubleshooting
| Symptom | Check |
|---|---|
| Device won't connect | Confirm IP control is enabled on the SP4, the Processor IP is correct, and — most commonly — that the TCP Port matches the control port the SP4 reports. There is no default port; a blank port means no connection. |
| Volume slider jumps on its own | The SP4 was adjusted from its front panel or remote outside GEM. The next poll re-reads the real level and the slider catches up. |
| Set level and read-back differ by one | Expected — the 0–100 ↔ dB translation rounds in each direction. The difference is one step (≈ 0.9 dB) and inaudible. |
| Connection keeps dropping and reconnecting | Some firmware closes idle connections after ~60 s. Lower Monitor Interval (ms) to keep traffic flowing. |
| A mute or input button doesn't reflect the real state | Input and mute aren't polled back. Drive them explicitly, and use mute_on / mute_off rather than mute_toggle where you need a known state. |
Related documentation
- AV Zones — set this processor as a zone's Volume Device for a room-level slider and mute.
- AV Sources — how room sources route, and where an input-switch macro belongs.
- Denon Receiver, Marantz Receiver, Onkyo Receiver, Storm Audio, Datasat — other AV processors and receivers bound to an AV zone the same way.
- Devices, Commands, Attributes — the underlying admin screens for this device.