Skip to main content

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 (0009)
  • 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

  1. On the SP4, open Network Settings and enable IP control. Note the IP address and the control port the processor reports.
  2. In GEM, open Devices and choose Add a Device.
  3. Give it a Name (lowercase letters, numbers, and underscores — e.g. theater_sp4) and an optional friendly Label.
  4. Under Driver, pick Bryston SP4 Processor. Choose a Type (for example av_receiver).
  5. In the Device Attributes section, set Processor IP to the SP4's address.
  6. 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.
  7. Save. On connect, GEM opens the control connection and begins polling power and volume; the device's power_state and volume fill 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:

  1. Open AV Zones and edit (or create) the zone for the room the SP4 serves.
  2. Set the Volume Device field to this Bryston device.
  3. 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.
note

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 levelApprox. 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

AttributeTypeDescription
ipstringThe SP4's LAN IP (shown in the form as Processor IP).

Device — optional

AttributeTypeDefaultDescription
portint(none)The SP4 IP-control TCP Port. Required in practice — the port varies by firmware and there is no default.
monitor_intervalint30000How 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:

AttributeTypeDescription
power_statestringon / off, refreshed on each poll.
volumeintCurrent level on the 0–100 scale, refreshed on each poll.
note

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

CommandSendsNotes
power_on#10MPWR01Main-zone power on.
power_off#10MPWR00Main-zone power off.
get_power#10MPWRQSQuery power state (populates power_state).

Volume and mute

CommandSendsNotes
volume#10MVOL + levelSet 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 / #10MVOLDNStep the volume up / down.
get_volume#10MVOLQSQuery volume (populates volume).
mute_on / mute_off#10MMUT01 / #10MMUT00Mute / unmute.
mute_toggle#10MMUT02Native mute toggle (see the note above about mute not being reported back).
get_mute#10MMUTQSQuery mute state (not stored as an attribute).

Input

CommandSendsNotes
input#10MSRC + inputSelect an input. input is a two-digit string, 0009.
get_input#10MSRCQSQuery 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

SymptomCheck
Device won't connectConfirm 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 ownThe 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 oneExpected — the 0–100 ↔ dB translation rounds in each direction. The difference is one step (≈ 0.9 dB) and inaudible.
Connection keeps dropping and reconnectingSome 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 stateInput 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.