Summary

The Extron RAC 104 is a four-channel remote audio controller for stereo or mono audio signals, with volume, tone (bass/treble), mute, gain, preset, and channel-tie functions. This spec covers SIS (Simple Instruction Set) control over RS-232.

Transport

protocols:
  - serial
serial:
  baud_rate: 9600
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
auth:
  type: UNRESOLVED  # source does not document an authentication procedure for the RS-232 SIS link

Traits

- levelable    # volume, gain, bass, treble controls present
- queryable    # view/query commands returning state present

Actions

# Audio input gain and attenuation
- id: set_gain
  label: Set input gain
  kind: action
  command: "{channel}*{gain}G"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: gain
      type: integer
      description: Audio gain 0-12 dB (X1!)
- id: set_attenuation
  label: Set input attenuation
  kind: action
  command: "{channel}*{attenuation}g"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: attenuation
      type: integer
      description: Attenuation 1-12 dB (X1@)
- id: increment_gain
  label: Increment input gain
  kind: action
  command: "{channel}+G"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: decrement_gain
  label: Decrement input gain
  kind: action
  command: "{channel}-G"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: view_gain
  label: View input gain/attenuation
  kind: query
  command: "V{channel}G"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)

# Output volume
- id: set_volume
  label: Set output volume
  kind: action
  command: "{channel}*{level}V"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: level
      type: integer
      description: Output volume 0-100 (X!)
- id: increment_volume
  label: Increment output volume
  kind: action
  command: "{channel}+V"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: decrement_volume
  label: Decrement output volume
  kind: action
  command: "{channel}-V"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: view_volume
  label: View output volume
  kind: query
  command: "{channel}V"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)

# Mute
- id: mute_channel
  label: Mute channel
  kind: action
  command: "{channel}*1Z"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: unmute_channel
  label: Unmute channel
  kind: action
  command: "{channel}*0Z"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: view_mute_channel
  label: View mute status of channel
  kind: query
  command: "{channel}Z"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: mute_all
  label: Mute all channels
  kind: action
  command: "1*Z"
  params: []
- id: unmute_all
  label: Unmute all channels
  kind: action
  command: "0*Z"
  params: []
- id: view_mute_all
  label: View mute status of all channels
  kind: query
  command: "Z"
  params: []

# Bass adjustment
- id: set_bass
  label: Set bass level
  kind: action
  command: "{channel}*{level}>"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: level
      type: integer
      description: Bass level 0-14; bass_dB = (level - 7) * 2 (X$)
- id: increment_bass
  label: Increment bass level
  kind: action
  command: "{channel}+>"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: decrement_bass
  label: Decrement bass level
  kind: action
  command: "{channel}->"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: view_bass
  label: View bass level
  kind: query
  command: "{channel}>"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)

# Treble adjustment
- id: set_treble
  label: Set treble level
  kind: action
  command: "{channel}*{level}<"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: level
      type: integer
      description: Treble level 0-14; treble_dB = (level - 7) * 2 (X%)
- id: increment_treble
  label: Increment treble level
  kind: action
  command: "{channel}+<"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: decrement_treble
  label: Decrement treble level
  kind: action
  command: "{channel}-<"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
- id: view_treble
  label: View treble level
  kind: query
  command: "{channel}<"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)

# Preset save and recall
- id: save_preset
  label: Save preset
  kind: action
  command: "{channel}*{preset},"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: preset
      type: integer
      description: Preset number 1-3 (X()
- id: recall_preset
  label: Recall preset
  kind: action
  command: "{channel}*{preset}."
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: preset
      type: integer
      description: Preset number 1-3 (X()
- id: view_preset_status
  label: View preset status
  kind: query
  command: "{channel},"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)

# View preset settings
- id: view_preset_gain
  label: View preset input gain
  kind: query
  command: "{channel}*{preset}*5#"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: preset
      type: integer
      description: Preset number 1-3 (X()
- id: view_preset_volume
  label: View preset output volume
  kind: query
  command: "{channel}*{preset}*6#"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: preset
      type: integer
      description: Preset number 1-3 (X()
- id: view_preset_bass
  label: View preset bass setting
  kind: query
  command: "{channel}*{preset}*7#"
  params:
    - name: channel
      type: integer
      description: Channel number 1-4 (X@)
    - name: preset
      type: integer
      description: Preset number 1-3 (X()
- id: view_preset_treble
  label: View preset treble setting
  kind: query
  command: "{channel}*{preset}*8#"
  params:
    - name: channel
      type: integer
      description: Preset number 1-3 (X()

# System
- id: reset_factory_defaults
  label: Reset to factory defaults
  kind: action
  command: "EZXXX}"
  params: []
- id: firmware_upload
  label: Initiate firmware upload
  kind: action
  command: "E Upload }"
  params: []

# Front panel lockout (Executive modes)
- id: set_executive_mode
  label: Set executive mode
  kind: action
  command: "{mode}X"
  params:
    - name: mode
      type: integer
      description: Executive mode 0=off, 1=lock tone+selector, 2=lock all (X^)
- id: view_executive_mode
  label: View executive mode
  kind: query
  command: "X"
  params: []

# Channel ties
- id: tie_group
  label: Tie channels in group
  kind: action
  command: "{group}*{state}*4#"
  params:
    - name: group
      type: string
      description: Group identifier A or B (X*)
    - name: state
      type: integer
      description: 0=untie, 1=tie (X#)
- id: view_ties
  label: View ties of all groups
  kind: query
  command: "4#"
  params: []

# Information requests
- id: request_dip_switch
  label: Request DIP switch settings
  kind: query
  command: "I"
  params: []
- id: request_part_number
  label: Request part number
  kind: query
  command: "N"
  params: []
- id: request_software_version
  label: Query software version
  kind: query
  command: "Q"
  params: []

# Volume, bass, and treble range limit settings
- id: set_volume_lower_limit
  label: Set volume lower limit
  kind: action
  command: "X@ * X! * 21#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
    - name: level
      type: integer
      description: 0 through 100 (X!)
- id: set_volume_upper_limit
  label: Set volume upper limit
  kind: action
  command: "X@ * X! * 22#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
    - name: level
      type: integer
      description: 0 through 100 (X!)
- id: view_volume_lower_limit
  label: View volume lower limit
  kind: query
  command: "X@ * 21#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
- id: view_volume_upper_limit
  label: View volume upper limit
  kind: query
  command: "X@ * 22#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
- id: set_bass_lower_limit
  label: Set bass lower limit
  kind: action
  command: "X@ * X$ * 23#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
    - name: level
      type: integer
      description: 0 through 14 (X$)
- id: set_bass_upper_limit
  label: Set bass upper limit
  kind: action
  command: "X@ * X$ * 24#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
    - name: level
      type: integer
      description: 0 through 14 (X$)
- id: view_bass_lower_limit
  label: View bass lower limit
  kind: query
  command: "X@ * 23#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
- id: view_bass_upper_limit
  label: View bass upper limit
  kind: query
  command: "X@ * 24#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
- id: set_treble_lower_limit
  label: Set treble lower limit
  kind: action
  command: "X@ * X% * 25#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
    - name: level
      type: integer
      description: 0 through 14 (X%)
- id: set_treble_upper_limit
  label: Set treble upper limit
  kind: action
  command: "X@ * X% * 26#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
    - name: level
      type: integer
      description: 0 through 14 (X%)
- id: view_treble_lower_limit
  label: View treble lower limit
  kind: query
  command: "X@ * 25#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)
- id: view_treble_upper_limit
  label: View treble upper limit
  kind: query
  command: "X@ * 26#"
  params:
    - name: channel
      type: integer
      description: Channel number 1 through 4 (X@)

Feedbacks

- id: gain_state
  type: integer
  values: null
  description: "Response: Chn {channel} Gain {value}. Value -12 to +12 dB."
  query_command: "V/v X@ G/g"
- id: volume_state
  type: integer
  values: null
  description: "Response: Vol {channel} * {level}. Level 0-100 (attenuation_dB = level - 100)."
  query_command: "X@ V/v"
- id: mute_state
  type: integer
  values: [0, 1]
  description: "0=unmuted, 1=muted. Per channel or all channels response."
  query_command:
    - "X@ Z/z"
    - "Z/z"
- id: bass_state
  type: integer
  values: null
  description: "Response: Bas {level}. Level 0-14."
  query_command: "X@ >"
- id: treble_state
  type: integer
  values: null
  description: "Response: Trb {level}. Level 0-14."
  query_command: "X@ <"
- id: preset_save_ack
  type: string
  values: null
  description: "Response: Spr {channel} * {preset}."
- id: preset_recall_ack
  type: string
  values: null
  description: "Response: Rpr {channel} * {preset}."
- id: preset_status
  type: string
  values: null
  description: "Response: three 0/1 digits, one per preset (empty/saved)."
  query_command: "X@ ,"
- id: executive_mode_state
  type: integer
  values: [0, 1, 2]
  description: "Response: Exe {mode}. 0=off, 1=mode1, 2=mode2."
  query_command: "X/x"
- id: tie_state
  type: string
  values: null
  description: "Response: Tie Grp {group} * {state} or GrpA * {state} • GrpB * {state}."
  query_command: "4#"
- id: dip_switch_state
  type: integer
  values: null
  description: "Response: 3-digit decimal 000-015 mapping to 4 input/output level DIP switches."
  query_command: "I/i"
- id: part_number
  type: string
  values: null
  description: "Response: 60-561-01 (per source)."
  query_command: "N/n"
- id: software_version
  type: string
  values: null
  description: "Response: Vx.xx firmware version."
  query_command: "Q/q"
- id: volume_lower_limit
  type: integer
  values: null
  description: "Response: Vll {channel} * {level}."
  query_command: "X@ * 21#"
- id: volume_upper_limit
  type: integer
  values: null
  description: "Response: Vul {channel} * {level}."
  query_command: "X@ * 22#"
- id: bass_lower_limit
  type: integer
  values: null
  description: "Response: Bll {channel} * {level}."
  query_command: "X@ * 23#"
- id: bass_upper_limit
  type: integer
  values: null
  description: "Response: Bul {channel} * {level}."
  query_command: "X@ * 24#"
- id: treble_lower_limit
  type: integer
  values: null
  description: "Response: Tll {channel} * {level}."
  query_command: "X@ * 25#"
- id: treble_upper_limit
  type: integer
  values: null
  description: "Response: Tul {channel} * {level}."
  query_command: "X@ * 26#"
- id: error_code
  type: string
  enum: [E01, E10, E13, E14, E23]
  description: "E01 invalid channel, E10 invalid command, E13 invalid value, E14 invalid setting at this time, E23 firmware update failure."

Variables

- id: volume_lower_limit
  type: integer
  range: 0-100
  description: Per-channel volume lower limit (set via {channel}*{level}*21#)
- id: volume_upper_limit
  type: integer
  range: 0-100
  description: Per-channel volume upper limit (set via {channel}*{level}*22#)
- id: bass_lower_limit
  type: integer
  range: 0-14
  description: Per-channel bass lower limit (set via {channel}*{level}*23#)
- id: bass_upper_limit
  type: integer
  range: 0-14
  description: Per-channel bass upper limit (set via {channel}*{level}*24#)
- id: treble_lower_limit
  type: integer
  range: 0-14
  description: Per-channel treble lower limit (set via {channel}*{level}*25#)
- id: treble_upper_limit
  type: integer
  range: 0-14
  description: Per-channel treble upper limit (set via {channel}*{level}*26#)

Events

- id: boot_message
  description: "On power-on the controller emits: 'Boot V1.00,(c) 2003, ? to Enter' then '(c) Copyright 2003,Extron Electronics,RAC 104, Vx.xx ]' (CR/LF terminated)."
- id: unsolicited_error
  description: "Controller-initiated error responses per the E01/E10/E13/E14/E23 table when a command is invalid."

Macros

# No multi-step sequences explicitly defined in the source beyond the firmware update procedure.
# Front-panel tie procedure (select both channels via channel selector, then turn knob) is
# also achievable via SIS tie_group, but the source does not define a multi-command macro.
# UNRESOLVED: no higher-level macro sequences documented in source.

Safety

confirmation_required_for:
  - reset_factory_defaults   # "E ZXXX }" restores defaults
interlocks: []
# 10-second save delay (front panel, SIS, or control program): wait at least 10 seconds
# after any adjustment before disconnecting power or changes may be lost. This is a
# data-integrity constraint from the source, not a safety interlock.

Notes

  • Protocol is SIS (Extron Simple Instruction Set). Commands need no start/end delimiters; each response ends with ] (CR/LF). | and } are interchangeable terminators in the host→unit direction.
  • Lowercase and uppercase command letters are equivalent except where the source notes otherwise (gain/attenuation commands are case-sensitive per the ASCII/hex table footnote).
  • ASCII space may be encoded as • in the source documentation. Commands may be sent back-to-back with no spaces.
  • 10-second inter-character timeout aborts commands silently.
  • Per channel: 4 channels (1-4), grouped A (ch 1,2) and B (ch 3,4). Tying channels enables stereo; ties also propagate mute and preset to both channels (input gain can still be adjusted independently on tied channels).
  • Default state: volume 70 (-30 dB), input gain 0 dB, bass 7 (0 dB), treble 7 (0 dB).
  • Power input (100-240 VAC external supply) and audio I/O levels (-10 dBV / +4 dBu) are stated in the source but are electrical, not control-protocol, properties and are intentionally not encoded here.
  • "?" character in the boot banner is a literal prompt the source shows ("? to Enter"); it is not part of the SIS command set.

Spec complete. RS-232, 9600 8N1 no flow, auth UNRESOLVED (source does not document an authentication procedure). Actions: gain/attn set/inc/dec/view (5), volume set/inc/dec/view (4), mute ch/all + view (6), bass set/inc/dec/view (4), treble set/inc/dec/view (4), preset save/recall/view-status (3), preset field views (4), reset + firmware upload (2), exec mode set/view (2), tie set/view (2), info requests (3) = 39 actions. Vars: 6 range limits. 19 feedbacks. Boot event + errors. UNRESOLVED comments on firmware.

Provenance

source_domains:
  - media.extron.com
  - extron.com
  - manualsdir.com
  - archive.org
source_urls:
  - https://media.extron.com/public/download/files/userman/68-782-01_E_RAC104.pdf
  - https://www.extron.com/download/files/userman/68-782-01_E_RAC104.pdf
  - https://www.extron.com/product/rac104
  - https://www.manualsdir.com/manuals/81351/extron-electronics-rac-104.html
  - https://archive.org/download/manualsonline-id-ff331144-914b-43c7-8e1e-aa86e5bdf8d1/ff331144-914b-43c7-8e1e-aa86e5bdf8d1.pdf
retrieved_at: 2026-06-11T21:51:11.861Z
last_checked_at: 2026-10-07T13:11:55.259Z

Verification Summary

verdict: verified
checked_at: 2026-10-07T13:11:55.259Z
matched_actions: 67
action_count: 67
confidence: medium
summary: "All 67 action units match source SIS commands with correct shapes; RS-232 9600 8N1 no flow confirmed; spec covers all ~52 source commands. (2 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "firmware version (Vx.xx) is reported by the device on boot but is not pinned in the source."
- "no higher-level macro sequences documented in source."

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