Summary

Allen & Heath AHM DSP matrix mixer, controlled over TCP/IP via MIDI-format messages (Note On, NRPN, SysEx, Program Change). Two rendezvous sockets: TCP 51325 (plaintext) and TCP 51327 (TLS/SSL). TLS socket requires UserProfile/UserPassword authentication.

Transport

protocols:
  - tcp
addressing:
  port: 51325
auth:
  type: credentials
  # Source: TLS socket (port 51327) requires first message "UserProfile, UserPassword"
  # where UserProfile = 00 to 1F. On match unit responds "AuthOK"; mismatch drops connection.
  # Plaintext socket (51325) auth procedure not explicitly documented.
notes:
  - "TLS/SSL rendezvous port: 51327"
  - "Messages sent in MIDI format (hex values)"

Traits

traits:
  - muteable     # Channel Mute On/Off
  - levelable    # Channel Level, Send Level, Trim, Preamp Gain
  - queryable    # Get Channel Mute/Level/Trim/Pad/Phantom, Get Send, Get Source Selector, Get Channel Name/Colour
  - routable     # Input to Zone / Zone to Zone sends; Source Selector; Room Combiners
  - presettable  # Preset Recall via Program Change

Actions

# Channel = MIDI channel N + note number CH:
#   Inputs 1-64:        N=0, CH=00..3F
#   Zones 1-64:         N=1, CH=00..3F
#   Control Groups 1-32: N=2, CH=00..1F
#   Rooms 1-16:         N=3, CH=00..0F
# SysEx Header (all SysEx msgs): F0 00 00 1A 50 12 01 00

- id: channel_mute_on
  label: Channel Mute On
  kind: action
  command: "9N, CH, 7F, 9N, CH, 00"
  params:
    - name: N
      type: integer
      description: MIDI channel number (0=input, 1=zone, 2=control group, 3=room)
    - name: CH
      type: integer
      description: Channel note number (hex)

- id: channel_mute_off
  label: Channel Mute Off
  kind: action
  command: "9N, CH, 3F, 9N, CH, 00"
  params:
    - name: N
      type: integer
    - name: CH
      type: integer

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

- id: set_channel_level
  label: Set Channel Level
  kind: action
  command: "BN, 63, CH, BN, 62, 17, BN, 06, LV"
  params:
    - name: N
      type: integer
    - name: CH
      type: integer
    - name: LV
      type: integer
      description: Level value 00..7F mapping to -Inf..+10dB (NRPN param ID 17)

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

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

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

- id: set_input_trim
  label: Set Input Trim
  kind: action
  command: "BN, 63, CH, BN, 62, 18, BN, 06, LV"
  params:
    - name: N
      type: integer
    - name: CH
      type: integer
    - name: LV
      type: integer
      description: Trim value 00..7F mapping to -24..+24dB (NRPN param ID 18)

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

- id: set_input_preamp_gain
  label: Set Input Preamp Gain
  kind: action
  command: "BN, 63, CH, BN, 62, 19, BN, 06, GN"
  params:
    - name: N
      type: integer
    - name: CH
      type: integer
    - name: GN
      type: integer
      description: Gain value 00..7F mapping to 5dB..+60dB (NRPN param ID 19)

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

- id: set_input_preamp_pad
  label: Set Input Preamp Pad
  kind: action
  command: "BN, 63, CH, BN, 62, 1A, BN, 06, VL"
  params:
    - name: N
      type: integer
    - name: CH
      type: integer
    - name: VL
      type: integer
      description: "VL 00..3F = Pad off, VL 40..7F = Pad on (NRPN param ID 1A)"

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

- id: set_input_preamp_phantom
  label: Set Input Preamp Phantom Power
  kind: action
  command: "BN, 63, CH, BN, 62, 1B, BN, 06, VL"
  params:
    - name: N
      type: integer
    - name: CH
      type: integer
    - name: VL
      type: integer
      description: "VL 00..3F = Phantom off, VL 40..7F = Phantom on (NRPN param ID 1B)"

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

- id: set_send_level
  label: Set Send Level (Input to Zone / Zone to Zone)
  kind: action
  command: "F0 00 00 1A 50 12 01 00, 0N, 02, CH, SndN, SndCH, LV, F7"
  params:
    - name: N
      type: integer
      description: Source channel MIDI channel
    - name: CH
      type: integer
      description: Source channel note
    - name: SndN
      type: integer
      description: Destination channel MIDI channel
    - name: SndCH
      type: integer
      description: Destination channel note
    - name: LV
      type: integer
      description: Send level 00..7F mapping to -Inf..+10dB

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

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

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

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

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

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

- id: preset_recall_bank_1
  label: Recall Preset 1-128
  kind: action
  command: "B0, 00, 00, C0, SS"
  params:
    - name: SS
      type: integer
      description: Preset 1..128 = 00..7F

- id: preset_recall_bank_2
  label: Recall Preset 129-256
  kind: action
  command: "B0, 00, 01, C0, SS"
  params:
    - name: SS
      type: integer
      description: Preset 129..256 = 00..7F

- id: preset_recall_bank_3
  label: Recall Preset 257-384
  kind: action
  command: "B0, 00, 02, C0, SS"
  params:
    - name: SS
      type: integer
      description: Preset 257..384 = 00..7F

- id: preset_recall_bank_4
  label: Recall Preset 385-500
  kind: action
  command: "B0, 00, 03, C0, SS"
  params:
    - name: SS
      type: integer
      description: Preset 385..500 = 00..73

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

- id: source_selector
  label: Zone Source Selector
  kind: action
  command: "F0 00 00 1A 50 12 01 00, 00, 08, CH, SourceNumber, F7"
  params:
    - name: CH
      type: integer
      description: Zone channel note
    - name: SourceNumber
      type: integer
      description: 00..13

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

- id: room_source_selector
  label: Room Source Selector
  kind: action
  command: "F0 00 00 1A 50 12 01 00, 00, 0D, CH, SourceNumber, F7"
  params:
    - name: CH
      type: integer
      description: Room channel note
    - name: SourceNumber
      type: integer
      description: 00..13

- id: room_combiner
  label: Room Combiner (Combine/Divide)
  kind: action
  command: "F0 00 00 1A 50 12 01 00, 00, 0E, RoomNumber1, RoomNumber2, VL, F7"
  params:
    - name: RoomNumber1
      type: integer
    - name: RoomNumber2
      type: integer
    - name: VL
      type: integer
      description: "00..3F = Rooms Combined, 40..7F = Rooms Divided"

- id: get_channel_name
  label: Get Channel Name
  kind: query
  command: "F0 00 00 1A 50 12 01 00, 0N, 09, CH, F7"
  params:
    - name: N
      type: integer
    - name: CH
      type: integer

- id: get_channel_colour
  label: Get Channel Colour
  kind: query
  command: "F0 00 00 1A 50 12 01 00, 0N, 0B, CH, F7"
  params:
    - name: N
      type: integer
    - name: CH
      type: integer

Feedbacks

- id: channel_mute_state
  type: enum
  values: [on, off]
  notes: "Received Channel Mute: velocity 01..3F = off, 40..7F = on; velocity 00 / NOTE OFF ignored"

- id: channel_level_value
  type: range
  range: "00..7F"
  notes: "Unit transmits appropriate Channel Level NRPN message"

- id: input_trim_value
  type: range
  range: "00..7F"

- id: input_preamp_gain_value
  type: range
  range: "00..7F"

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

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

- id: preset_recall_event
  type: event
  notes: "Unit transmits Bank+Program Change when a Preset is recalled (by any client)"

- id: source_selector_event
  type: event
  notes: "Unit transmits SysEx 08 with SourceColour, SourceName when source selected"

- id: room_source_selector_event
  type: event
  notes: "Unit transmits SysEx 0D with SourceColour, SourceName when room source selected"

- id: room_combiner_event
  type: event
  notes: "Unit transmits SysEx 0E when rooms combined/divided"

- id: auth_result
  type: enum
  values: [AuthOK, connection_dropped]
  notes: "Response to TLS socket auth; six characters 'AuthOK' on success"

Variables

# Settable parameters (covered as Actions above): channel level, input trim,
# preamp gain, preamp pad, phantom power, send level, source number, room combiner.
# No additional non-action variables documented in source.

Events

# Unsolicited notifications (unit transmits proactively):
- preset_recall_event        # Bank+Program Change on recall
- source_selector_event      # SysEx 08 with colour+name
- room_source_selector_event # SysEx 0D with colour+name
- room_combiner_event        # SysEx 0E on combine/divide

Macros

# No multi-step sequences documented in source.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no explicit safety warnings or interlock procedures.
# Phantom Power (48V) toggle present as a control but no interlock sequence documented.

Notes

  • All MIDI message numbers are hexadecimal.
  • SysEx Header applies to every SysEx message: F0 00 00 1A 50 12 01 00 (major version 01, minor version 00).
  • Channel selection: Inputs N=0, Zones N=1, Control Groups N=2, Rooms N=3.
  • "Get" queries cause the unit to transmit the corresponding state message.
  • Firmware V1.5 referenced in source title.
  • Input Preamp controls (Gain/Pad/Phantom) apply only to Inputs (N=0).

Spec emitted. Coverage: 30 actions, 11 feedbacks, 4 events. All hex payloads verbatim from source. Ports/auth from source. No values fabricated.

## Provenance

```yaml
source_domains:
  - allen-heath.com
source_urls:
  - https://www.allen-heath.com/content/uploads/2024/10/AHM-TCP-Protocol-V1.5.pdf
retrieved_at: 2026-07-13T18:59:27.323Z
last_checked_at: 2026-07-21T20:01:04.122Z
```

## Verification Summary

```yaml
verdict: verified
checked_at: 2026-07-21T20:01:04.122Z
matched_actions: 33
action_count: 33
confidence: medium
summary: "All 33 spec actions matched verbatim in source; all transport parameters (TCP 51325/51327, auth credentials) verified; complete bidirectional coverage. (5 unresolved item(s) noted in Known Gaps.)"
```

## Known Gaps

```yaml
- "parameter value table referenced in source was image-only and not extractable; inline ranges used instead."
- "source contains no explicit safety warnings or interlock procedures."
- "end-of-document parameter value table was image-only in PDF and not extractable; inline ranges used instead."
- "plaintext socket (51325) authentication procedure not explicitly documented — only TLS socket (51327) auth described."
- "exact bytes for \"Get Channel Name\" / \"Get Channel Colour\" responses (Name ASCII string up to 8 chars, Colour value encoding) — colour encoding unspecified in source."
```

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