Summary

Soundweb London Analog Input Card controllable over Ethernet (TCP) and serial RS-232 via the London Direct Inject (DI) protocol. The protocol is a two-way binary message protocol allowing a third-party controller to SET, BUMP, SUBSCRIBE to, and recall presets on any device parameter or meter. This spec covers the DI message catalogue, addressing scheme, value encoding, and byte-substitution rules. Crown, JBL, and AKG devices do not respond to this protocol.

Transport

protocols:
  - tcp
  - serial
addressing:
  port: 1023  # Soundweb London devices listen on TCP port 1023, accept multiple connections
serial:
  baud_rate: null  # UNRESOLVED: baud rate not stated in source (set in Audio Architect Properties window)
  data_bits: null  # UNRESOLVED: not stated in source
  parity: null  # UNRESOLVED: not stated in source
  stop_bits: null  # UNRESOLVED: not stated in source
  flow_control: null  # UNRESOLVED: not stated in source
  connector: "9-pin D-type (pins 2,3,5 used)"
auth:
  type: none  # inferred: no auth procedure in source

Traits

traits:
  - queryable  # inferred: SUBSCRIBE / SUBSCRIBE PERCENT return parameter values
  - levelable  # inferred: SET PERCENT / BUMP PERCENT for gain/threshold/pan parameters
  - presettable  # inferred: RECALL PRESET message type documented

Actions

# All London DI message types from the source. Each opcode = one action.
# All messages framed: start 0x02 ... body ... checksum ... end 0x03.
# Checksum = single-byte XOR of all body bytes, computed before byte substitution.
# Byte substitution applied AFTER checksum: 0x02->1B 82, 0x03->1B 83, 0x06->1B 86,
# 0x15->1B 95, 0x1B->1B 9B. Substitution increases message length.
# Addressing fields (Node Address 2B, Virtual Device 1B, Object ID 3B, Parameter ID 2B)
# are common to all addressed messages; PRESET RECALL is unaddressed.

- id: set_raw
  label: SET (Raw Value)
  kind: action
  command: "02 88 {node_hi} {node_lo} {virtual_device} {obj_1} {obj_2} {obj_3} {param_hi} {param_lo} {val_1} {val_2} {val_3} {val_4} {checksum} 03"
  params:
    - name: node_address
      type: integer
      description: "Physical device node address, range 0x0001-0xFFFE (1-65534). Two bytes."
    - name: virtual_device
      type: integer
      description: "Processing object category (Audio 0x03, Logic 0x02). One byte."
    - name: object_id
      type: integer
      description: "Processing Object ID (Mixer, EQ, Source Selector, etc). Three bytes."
    - name: parameter_id
      type: integer
      description: "Parameter within object (Gain, Mute, Source, etc). Two bytes."
    - name: value
      type: integer
      description: "32-bit signed raw value (four bytes). Scaling depends on parameter type."
  notes: "Opcode 0x88. Set a parameter using its raw value."

- id: set_percent
  label: SET PERCENT
  kind: action
  command: "02 8D {node_hi} {node_lo} {virtual_device} {obj_1} {obj_2} {obj_3} {param_hi} {param_lo} {val_1} {val_2} {val_3} {val_4} {checksum} 03"
  params:
    - name: node_address
      type: integer
      description: "Physical device node address, 0x0001-0xFFFE."
    - name: virtual_device
      type: integer
      description: "Processing object category (Audio 0x03, Logic 0x02)."
    - name: object_id
      type: integer
      description: "Processing Object ID. Three bytes."
    - name: parameter_id
      type: integer
      description: "Parameter within object. Two bytes."
    - name: percent
      type: number
      description: "Percentage value 0-100. Raw = percentage x 65536."
  notes: "Opcode 0x8D. Set a parameter using a percentage value."

- id: bump_percent
  label: BUMP PERCENT
  kind: action
  command: "02 90 {node_hi} {node_lo} {virtual_device} {obj_1} {obj_2} {obj_3} {param_hi} {param_lo} {val_1} {val_2} {val_3} {val_4} {checksum} 03"
  params:
    - name: node_address
      type: integer
      description: "Physical device node address, 0x0001-0xFFFE."
    - name: virtual_device
      type: integer
      description: "Processing object category (Audio 0x03, Logic 0x02)."
    - name: object_id
      type: integer
      description: "Processing Object ID. Three bytes."
    - name: parameter_id
      type: integer
      description: "Parameter within object. Two bytes."
    - name: bump
      type: integer
      description: "Signed percentage delta to bump parameter up or down. 32-bit signed."
  notes: "Opcode 0x90. Bump the parameter up or down by a percentage value. NOTE: subscribed parameters changed via BUMP do not auto-return SET messages; a fresh SUBSCRIBE is required to read new value."

- id: set_string
  label: SET STRING
  kind: action
  command: "02 91 {node_hi} {node_lo} {virtual_device} {obj_1} {obj_2} {obj_3} {param_hi} {param_lo} {length} {ascii_bytes...} 00 {checksum} 03"
  params:
    - name: node_address
      type: integer
      description: "Physical device node address, 0x0001-0xFFFE."
    - name: virtual_device
      type: integer
      description: "Processing object category (Audio 0x03, Logic 0x02)."
    - name: object_id
      type: integer
      description: "Processing Object ID. Three bytes."
    - name: parameter_id
      type: integer
      description: "Parameter within object. Two bytes."
    - name: string
      type: string
      description: "ASCII string up to 32 characters. Value prefixed with byte-length and terminated with 0x00 suffix."
  notes: "Opcode 0x91. Set a parameter using a string of up to 32 ASCII characters. Length prefix + 0x00 termination suffix required."

- id: recall_preset
  label: Recall Parameter Preset
  kind: action
  command: "02 8C {preset_id_1} {preset_id_2} {preset_id_3} {preset_id_4} {checksum} 03"
  params:
    - name: preset_id
      type: integer
      description: "Parameter Preset ID number (four bytes). Displayed in the Parameter Preset window."
  notes: "Opcode 0x8C. Recalls a Parameter Preset using the Preset ID number. No addressing used. Not possible to subscribe to a Parameter Preset."

- id: subscribe
  label: SUBSCRIBE
  kind: query
  command: "02 89 {node_hi} {node_lo} {virtual_device} {obj_1} {obj_2} {obj_3} {param_hi} {param_lo} {checksum} 03"
  params:
    - name: node_address
      type: integer
      description: "Physical device node address, 0x0001-0xFFFE."
    - name: virtual_device
      type: integer
      description: "Processing object category (Audio 0x03, Logic 0x02)."
    - name: object_id
      type: integer
      description: "Processing Object ID. Three bytes."
    - name: parameter_id
      type: integer
      description: "Parameter within object. Two bytes."
  notes: "Opcode 0x89. Subscribe to a parameter. Immediately returns current value as SET or SET STRING; further SET/SET STRING messages sent on each value change until UNSUBSCRIBE or device reboot."

- id: subscribe_percent
  label: SUBSCRIBE PERCENT
  kind: query
  command: "02 8E {node_hi} {node_lo} {virtual_device} {obj_1} {obj_2} {obj_3} {param_hi} {param_lo} {checksum} 03"
  params:
    - name: node_address
      type: integer
      description: "Physical device node address, 0x0001-0xFFFE."
    - name: virtual_device
      type: integer
      description: "Processing object category (Audio 0x03, Logic 0x02)."
    - name: object_id
      type: integer
      description: "Processing Object ID. Three bytes."
    - name: parameter_id
      type: integer
      description: "Parameter within object. Two bytes."
  notes: "Opcode 0x8E. Subscribe to a parameter; returns SET PERCENT messages on value changes."

- id: unsubscribe
  label: UNSUBSCRIBE
  kind: action
  command: "02 8A {node_hi} {node_lo} {virtual_device} {obj_1} {obj_2} {obj_3} {param_hi} {param_lo} {checksum} 03"
  params:
    - name: node_address
      type: integer
      description: "Physical device node address, 0x0001-0xFFFE."
    - name: virtual_device
      type: integer
      description: "Processing object category (Audio 0x03, Logic 0x02)."
    - name: object_id
      type: integer
      description: "Processing Object ID. Three bytes."
    - name: parameter_id
      type: integer
      description: "Parameter within object. Two bytes."
  notes: "Opcode 0x8A. Unsubscribe from a parameter. Stops the device returning SET messages for that parameter."

- id: unsubscribe_percent
  label: UNSUBSCRIBE PERCENT
  kind: action
  command: "02 8F {node_hi} {node_lo} {virtual_device} {obj_1} {obj_2} {obj_3} {param_hi} {param_lo} {checksum} 03"
  params:
    - name: node_address
      type: integer
      description: "Physical device node address, 0x0001-0xFFFE."
    - name: virtual_device
      type: integer
      description: "Processing object category (Audio 0x03, Logic 0x02)."
    - name: object_id
      type: integer
      description: "Processing Object ID. Three bytes."
    - name: parameter_id
      type: integer
      description: "Parameter within object. Two bytes."
  notes: "Opcode 0x8F. Unsubscribe from a parameter. Stops the device returning SET PERCENT messages for that parameter."

Feedbacks

# Serial-only link-layer acknowledgements (Ethernet/TCP does not use these):
- id: serial_ack
  type: enum
  values: ["0x06"]
  description: "ACK - correctly formatted serial RS-232 message received, valid checksum."

- id: serial_nack
  type: enum
  values: ["0x15"]
  description: "NACK - invalid checksum on serial message. Soundweb re-transmits if waiting for acknowledgement and no 0x06/0x15 within 1 second."

# Application-layer responses returned from SUBSCRIBE / value-change events:
- id: set_response
  type: raw
  description: "SET message (opcode 0x88) returned carrying a parameter's 32-bit raw value. Sent immediately on SUBSCRIBE and on each subsequent value change."

- id: set_percent_response
  type: raw
  description: "SET PERCENT message (opcode 0x8D) returned carrying a parameter's percentage value. Sent on SUBSCRIBE PERCENT and on value changes."

- id: set_string_response
  type: string
  description: "SET STRING message (opcode 0x91) returned carrying a string parameter value (up to 32 ASCII chars). Sent on SUBSCRIBE for string parameters."

Variables

# Parameter value encodings documented in the source. Actual parameter set
# (specific Object/Parameter IDs) is device-configuration dependent and not
# enumerated in this protocol document.

- id: raw_value
  type: integer
  description: "32-bit signed value representing a parameter's raw state."

- id: percent_value
  type: number
  description: "Percentage 0-100. Raw = percentage x 65536. Two-state params use 0/1 (0%/100%). Multi-state params use discrete 0,1,2,3,4... mapped across 0-100%."

- id: gain_value
  type: integer
  description: "Gain parameter raw range -280617 (-80dB / 0%) to 100000 (+10dB / 100%). Unity gain = 0 (73.73%). Logarithmic scale from -inf to -10dB, linear above -10dB."

- id: meter_value
  type: integer
  description: "Meter parameter raw range -800000 (-80dB / 0%) to 400000 (+40dB / 100%). Linear scale. 0dB = 0 (66.66%). dB value = Raw / 10000."

- id: string_value
  type: string
  description: "Up to 32 ASCII bytes. Wire format: length-prefix byte + ASCII bytes + 0x00 termination suffix."

- id: node_address
  type: integer
  description: "Physical device node address. Range 0x0001-0xFFFE (1-65534). Two bytes. Shown in Venue Explorer / Room view."

- id: virtual_device
  type: integer
  description: "Processing object category. Audio=0x03, Logic=0x02. One byte."

- id: object_id
  type: integer
  description: "Processing Object identifier (Mixer, EQ, Source Selector, etc). Three bytes."

- id: parameter_id
  type: integer
  description: "Parameter within a Processing Object (Gain, Mute, Source, etc). Two bytes."

- id: preset_id
  type: integer
  description: "Parameter Preset ID number (four bytes). Displayed in Parameter Preset window."

Events

# Unsolicited notifications: when a controller has SUBSCRIBED/SUBSCRIBED PERCENT
# to a parameter, the device pushes SET / SET PERCENT / SET STRING messages on
# each value change until UNSUBSCRIBE or reboot. No other unsolicited events
# documented.
# UNRESOLVED: no event catalogue beyond subscription-driven value pushes.

Macros

# UNRESOLVED: no multi-step sequences described in source.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or
# power-on sequencing requirements. Do not infer.

Notes

  • London DI is a generic Soundweb London protocol; the same message catalogue applies to all Soundweb London devices (including the Analog Input Card). Crown, JBL, and AKG devices do NOT respond to this protocol.
  • BLU-Link, Dante, CobraNet, and AVB connections are not used for any form of control — control is Ethernet (RJ-45, 100Mb/s) or RS-232 (9-pin D-type, pins 2/3/5) only.
  • Ethernet control does not use 0x06/0x15 acknowledgements (TCP provides reliability). Serial control may optionally require acknowledgement with 1-second re-transmit timeout, configured in Audio Architect Properties.
  • Checksum is computed over the body BEFORE byte substitution; substitution is applied afterwards and grows message length. Any implementation must substitute 0x02/0x03/0x06/0x15/0x1B in the body and reverse-substitute on receive.
  • Percentage ↔ raw conversion: raw = percent × 65536.
  • Parameter Preset recall is the only unaddressed message; it uses the Preset ID directly as the four-byte value.
  • Soundweb devices are always listening; no enable step required for third-party control.

Provenance

source_domains:
  - bssaudio.com
source_urls:
  - https://bssaudio.com/en/site_elements/soundweb-london-third-party-control-application-guide
  - https://bssaudio.com/en/products/analog-input-card
  - https://bssaudio.com/en/support_downloads/product/blu-800
  - https://bssaudio.com/en/product_families/input-output-cards
  - https://bssaudio.com/en
retrieved_at: 2026-07-01T14:01:05.300Z
last_checked_at: 2026-07-07T11:05:55.749Z

Verification Summary

verdict: verified
checked_at: 2026-07-07T11:05:55.749Z
matched_actions: 9
action_count: 9
confidence: medium
summary: "All nine London DI protocol message types verified against source; opcodes and parameters match exactly; transport values confirmed. (11 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "no baud rate, data bits, parity, or stop bits stated for RS-232 (configured via Audio Architect Properties window)"
- "message body diagrams (figures) were image-only and omitted; exact per-message byte layouts for SET/SUBSCRIBE/SET STRING/UNSUBSCRIBE/PRESET RECALL not captured as text"
- "baud rate not stated in source (set in Audio Architect Properties window)"
- "not stated in source"
- "no event catalogue beyond subscription-driven value pushes."
- "no multi-step sequences described in source."
- "source contains no safety warnings, interlock procedures, or"
- "exact byte-by-byte layout of SET / SET STRING / UNSUBSCRIBE / PRESET RECALL message bodies shown only as figures (omitted). Field order above inferred from addressing description; verify against the London DI protocol PDF in the Audio Architect installation folder."
- "serial electrical config (baud/data bits/parity/stop bits/flow control) not stated — configured per-device in Audio Architect."
- "firmware version compatibility not stated."
- "full enumeration of Analog Input Card Object IDs / Parameter IDs not in this protocol document (configuration-dependent, shown in Venue Explorer at runtime)."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0