Summary

The Allen & Heath Dx88 P is a network-controllable audio processor (AHM family) that accepts external control via TCP/IP using MIDI-format messages. This spec covers the MIDI-over-TCP control protocol — channel mute, level, trim, preamp, send routing, preset recall, audio playback, source selection, room combiners, and channel naming.

Transport

protocols:
  - tcp
addressing:
  port: 51325  # plain (Rendezvous). TLS alternative: 51327.
auth:
  type: password  # TLS socket requires UserProfile,UserPassword handshake; unit replies "AuthOK" or drops.

Traits

powerable: false  # UNRESOLVED: no power commands in source; do not infer
routable: true  # inferred from input-to-zone / zone-to-zone send and source selector commands
queryable: true  # inferred from "Get" SysEx queries
levelable: true  # inferred from channel-level, zone-level, trim, preamp commands

Actions

- id: channel_mute_on
  label: Channel Mute On
  kind: action
  command: "9{N} {CH} 7F  9{N} {CH} 00"  # NOTE ON vel>40 then NOTE OFF
  params:
    - {name: N, type: integer, description: "MIDI channel (0=inputs, 1=zones, 2=control groups)"}
    - {name: CH, type: hex, description: "Note number per channel-selection table"}

- id: channel_mute_off
  label: Channel Mute Off
  kind: action
  command: "9{N} {CH} 3F  9{N} {CH} 00"  # NOTE ON vel<40 then NOTE OFF
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: get_channel_mute
  label: Get Channel Mute
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 01 09 {CH} F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: channel_level_set
  label: Channel Level Set
  kind: action
  command: "B{N} 63 {CH}  B{N} 62 17  B{N} 06 {LV}"  # NRPN 17; LV 00..7F = -Inf..+10 dB
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: LV, type: hex}

- id: get_channel_level
  label: Get Channel Level
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 01 0B 17 {CH} F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: channel_level_increment
  label: Channel Level Increment
  kind: action
  command: "B{N} 63 {CH}  B{N} 62 20  B{N} 06 7F"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: channel_level_decrement
  label: Channel Level Decrement
  kind: action
  command: "B{N} 63 {CH}  B{N} 62 20  B{N} 06 3F"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: input_trim_set
  label: Input Trim Set
  kind: action
  command: "B{N} 63 {CH}  B{N} 62 18  B{N} 06 {LV}"  # NRPN 18; LV 00..7F = -24..+24 dB
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: LV, type: hex}

- id: get_input_trim
  label: Get Input Trim
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 01 0B 18 {CH} F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: input_preamp_gain_set
  label: Input Preamp Gain Set
  kind: action
  command: "B{N} 63 {CH}  B{N} 62 19  B{N} 06 {GN}"  # NRPN 19; GN 00..7F = +5..+60 dB
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: GN, type: hex}

- id: get_input_preamp_gain
  label: Get Input Preamp Gain
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 01 0B 19 {CH} F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: input_preamp_pad_set
  label: Input Preamp Pad Set
  kind: action
  command: "B{N} 63 {CH}  B{N} 62 1A  B{N} 06 {VL}"  # NRPN 1A; 00..3F=off, 40..7F=on
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: VL, type: hex}

- id: get_input_preamp_pad
  label: Get Input Preamp Pad
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 01 0B 1A {CH} F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: input_preamp_phantom_set
  label: Input Preamp Phantom Power Set
  kind: action
  command: "B{N} 63 {CH}  B{N} 62 1B  B{N} 06 {VL}"  # NRPN 1B; 00..3F=off, 40..7F=on
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: VL, type: hex}

- id: get_input_preamp_phantom
  label: Get Input Preamp Phantom Power
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 01 0B 1B {CH} F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: send_level_set
  label: Input-to-Zone / Zone-to-Zone Send Level Set
  kind: action
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 02 {CH} {SndN} {SndCH} {LV} F7"  # LV 00..7F = -Inf..+10 dB
  params:
    - {name: N, type: integer, description: "Source MIDI channel (0 inputs / 1 zones)"}
    - {name: CH, type: hex, description: "Source channel number"}
    - {name: SndN, type: integer, description: "Destination MIDI channel"}
    - {name: SndCH, type: hex, description: "Destination note number"}
    - {name: LV, type: hex}

- id: get_send_level
  label: Get Send Level
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 01 0F 02 {CH} {SndN} {SndCH} F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: SndN, type: integer}
    - {name: SndCH, type: hex}

- id: send_level_increment
  label: Send Level Increment
  kind: action
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 04 {CH} {SndN} {SndCH} 7F F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: SndN, type: integer}
    - {name: SndCH, type: hex}

- id: send_level_decrement
  label: Send Level Decrement
  kind: action
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 04 {CH} {SndN} {SndCH} 3F F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: SndN, type: integer}
    - {name: SndCH, type: hex}

- id: send_mute_on
  label: Send Mute On
  kind: action
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 03 {CH} {SndN} {SndCH} 7F F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: SndN, type: integer}
    - {name: SndCH, type: hex}

- id: send_mute_off
  label: Send Mute Off
  kind: action
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 03 {CH} {SndN} {SndCH} 3F F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: SndN, type: integer}
    - {name: SndCH, type: hex}

- id: get_send_mute
  label: Get Send Mute
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 01 0F 03 {CH} {SndN} {SndCH} F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}
    - {name: SndN, type: integer}
    - {name: SndCH, type: hex}

- id: preset_recall_bank0
  label: Preset Recall (Bank 0, Presets 1-128)
  kind: action
  command: "B0 00 00  C0 {SS}"  # SS 00..7F = presets 1..128
  params:
    - {name: SS, type: hex}

- id: preset_recall_bank1
  label: Preset Recall (Bank 1, Presets 129-256)
  kind: action
  command: "B0 00 01  C0 {SS}"  # SS 00..7F = presets 129..256
  params:
    - {name: SS, type: hex}

- id: preset_recall_bank2
  label: Preset Recall (Bank 2, Presets 257-384)
  kind: action
  command: "B0 00 02  C0 {SS}"  # SS 00..7F = presets 257..384
  params:
    - {name: SS, type: hex}

- id: preset_recall_bank3
  label: Preset Recall (Bank 3, Presets 385-500)
  kind: action
  command: "B0 00 03  C0 {SS}"  # SS 00..73 = presets 385..500
  params:
    - {name: SS, type: hex}

- id: audio_playback
  label: Audio File Playback
  kind: action
  command: "F0 00 00 1A 50 12 {MV} {mV} 00 06 {PlaybackChannel} {TrackID} F7"
  params:
    - {name: PlaybackChannel, type: hex, description: "00=Mono 1, 01=Mono 2, 02=stereo"}
    - {name: TrackID, type: hex, description: "00..7F"}

- id: source_selector_set
  label: Source Selector (Zone)
  kind: action
  command: "F0 00 00 1A 50 12 {MV} {mV} 00 08 {CH} {SourceNumber} F7"  # SourceNumber 00..13
  params:
    - {name: CH, type: hex, description: "Zone channel number"}
    - {name: SourceNumber, type: hex}

- id: get_source_selector
  label: Get Source Selector
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 01 0F 08 {CH} F7"
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: room_source_selector_set
  label: Room Source Selector
  kind: action
  command: "F0 00 00 1A 50 12 {MV} {mV} 00 0D {CH} {SourceNumber} F7"  # SourceNumber 00..13
  params:
    - {name: CH, type: hex, description: "Room channel number"}
    - {name: SourceNumber, type: hex}

- id: room_combiners_set
  label: Room Combiners (Combine/Divide)
  kind: action
  command: "F0 00 00 1A 50 12 {MV} {mV} 00 0E {RoomNumber1} {RoomNumber2} {VL} F7"  # 00..3F=Combined, 40..7F=Divided
  params:
    - {name: RoomNumber1, type: hex}
    - {name: RoomNumber2, type: hex}
    - {name: VL, type: hex}

- id: get_channel_name
  label: Get Channel Name
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 09 {CH} F7"  # reply: SysEx 0{N} 0A {CH} {Name} F7; Name = hex ASCII up to 8 chars
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: get_channel_colour
  label: Get Channel Colour
  kind: query
  command: "F0 00 00 1A 50 12 {MV} {mV} 0{N} 0B {CH} F7"  # reply: SysEx 0{N} 0C {CH} {Colour} F7
  params:
    - {name: N, type: integer}
    - {name: CH, type: hex}

- id: authenticate
  label: TLS Authentication Handshake
  kind: action
  command: "{UserProfile} {UserPassword}"  # first data on TLS socket; UserProfile 00..1F; reply "AuthOK" or drop
  params:
    - {name: UserProfile, type: hex, description: "00..1F"}
    - {name: UserPassword, type: string}

Feedbacks

- id: channel_mute_state
  type: enum
  values: [on, off]
  description: Received: velocity 01..3F=off, 40..7F=on; velocity 00 and NOTE OFF ignored.

- id: channel_level
  type: integer
  range: [0, 127]
  description: 00..7F mapping -Inf..+10 dB.

- id: input_trim
  type: integer
  range: [0, 127]
  description: 00..7F mapping -24..+24 dB.

- id: input_preamp_gain
  type: integer
  range: [0, 127]
  description: 00..7F mapping +5..+60 dB.

- id: input_preamp_pad
  type: enum
  values: [off, on]
  description: VL 00..3F=off, 40..7F=on.

- id: input_preamp_phantom
  type: enum
  values: [off, on]
  description: VL 00..3F=off, 40..7F=on.

- id: send_level
  type: integer
  range: [0, 127]
  description: 00..7F mapping -Inf..+10 dB.

- id: send_mute_state
  type: enum
  values: [on, off]

- id: preset_recalled
  type: string
  description: Unit emits Bank Select + Program Change sequence on local preset recall.

- id: source_changed
  type: string
  description: "SysEx 00 08 {CH} {SourceNumber} {SourceColour} {SourceName} F7 emitted on local source select."

- id: room_source_changed
  type: string
  description: "SysEx 00 0D {CH} {SourceNumber} {SourceColour} {SourceName} F7 emitted on local room-source select."

- id: rooms_combiner_state
  type: string
  description: "SysEx 00 0E {RoomNumber1} {RoomNumber2} {VL} F7 emitted when combiners change."

- id: channel_name
  type: string
  description: Hex ASCII, up to 8 chars (SysEx 0{N} 0A {CH} {Name} F7).

- id: channel_colour
  type: integer
  description: Colour value (SysEx 0{N} 0C {CH} {Colour} F7).

- id: auth_ok
  type: string
  description: "Six-character literal 'AuthOK' on successful TLS authentication."

Variables

# UNRESOLVED: source does not define continuous settable parameters outside the action list.

Events

# Captured under Feedbacks (preset_recalled, source_changed, room_source_changed, rooms_combiner_state).
# No additional unsolicited notifications documented in source.

Macros

# UNRESOLVED: source documents no multi-step macro sequences.

Safety

confirmation_required_for: []
interlocks: []
# Phantom power can damage passive or ribbon microphones; pad and phantom toggles are operator-driven with no source-documented interlock.

Notes

"Known protocol" supplied as RS-232C, but refined source document is titled "AHM TCP/IP Protocol Firmware V1.5" and exclusively describes TCP/IP control via MIDI-format messages on port 51325 (plain) or 51327 (TLS). No RS-232 framing, baud, or wiring present in source — populate those as UNRESOLVED if a separate RS-232 manual exists.

SysEx Header template F0 00 00 1A 50 12 MV mV is shared by every SysEx message; MV=01 (major), mV=00 (minor) per source. Channel selection: inputs (N=0), zones (N=1), control groups (N=2, 32 channels), rooms (N=3, 16 channels).

A value table referenced at the end of the source PDF existed as an image only and was not extracted; inline textual ranges used in the actions above.


Saved to `/tmp/allen_heath_dx88_p_spec.md` and surfaced above.

## Provenance

```yaml
source_domains:
  - allen-heath.com
source_urls:
  - https://www.allen-heath.com/content/uploads/2024/10/AHM-TCP-Protocol-V1.5.pdf
  - https://www.allen-heath.com/content/uploads/2023/05/DX-GX-System-Guide-ISS_5.pdf
retrieved_at: 2026-07-13T19:02:16.952Z
last_checked_at: 2026-07-21T20:06:08.873Z

Verification Summary

verdict: verified
checked_at: 2026-07-21T20:06:08.873Z
matched_actions: 34
action_count: 34
confidence: medium
summary: "All 34 spec actions matched literal source commands; transport parameters (TCP ports, auth) verified; coverage is complete and one-to-one. (4 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "source PDF referenced an end-of-document value table that was image-only and could not be extracted; inline parameter ranges used."
- "no power commands in source; do not infer"
- "source does not define continuous settable parameters outside the action list."
- "source documents no multi-step macro sequences."

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