Summary

Middle Control is a software application that manages APC-R gimbal units and connected cameras. It exposes a plain-text TCP API on port 11581, allowing external devices or software to send commands for gimbal movement (pan, tilt, roll, zoom), camera control (focus, iris, white balance, ISO, recording), preset recall, and to read back live gimbal and camera state over the same connection.

Transport

protocols:
  - tcp
addressing:
  port: 11581
  base_url: null
auth:
  type: none  # inferred: no auth procedure in source
framing:
  terminator: "\n"

Traits

- powerable       # inferred from GIMBALSLEEP / GIMBALWAKE commands
- queryable       # inferred from live TCP feedback frame with state values
- levelable       # inferred from continuous-axis commands (P, T, R, Z, aF, aI, aWB, aISO, aTINT)
- routable        # inferred from CAM1-CAM99 camera selection commands

Actions

# Camera selection (scoped)
- id: cam_select
  label: Select Camera
  kind: action
  params:
    - name: id
      type: integer
      min: 1
      max: 99
      description: Camera/gimbal ID to select as current target
  command: CAM{id}

# Gimbal variable-axis commands
- id: pan_speed
  label: Pan Speed
  kind: action
  params:
    - name: speed
      type: integer
      min: -2048
      max: 2048
      description: Pan speed (INT16, negative=left, positive=right)
  command: P{speed}

- id: tilt_speed
  label: Tilt Speed
  kind: action
  params:
    - name: speed
      type: integer
      min: -2048
      max: 2048
      description: Tilt speed (INT16, negative=down, positive=up)
  command: T{speed}

- id: roll_speed
  label: Roll Speed
  kind: action
  params:
    - name: speed
      type: integer
      min: -2048
      max: 2048
      description: Roll speed (INT16)
  command: R{speed}

- id: zoom
  label: Zoom
  kind: action
  params:
    - name: value
      type: integer
      min: -2048
      max: 2048
      description: Zoom command (INT16)
  command: Z{value}

- id: zoom_speed
  label: Zoom Speed
  kind: action
  params:
    - name: speed
      type: integer
      min: 1
      max: 100
      description: Zoom speed (INT8, 1-100)
  command: ZS{speed}

- id: pan_tilt_speed
  label: Pan/Tilt Speed
  kind: action
  params:
    - name: speed
      type: integer
      min: 1
      max: 100
      description: Pan/Tilt combined speed (INT8, 1-100)
  command: PTS{speed}

- id: focus
  label: Focus
  kind: action
  params:
    - name: value
      type: number
      min: 0.0
      max: 1.0
      description: Focus position (FLOAT, 0.0-1.0)
  command: aF{value}

- id: iris
  label: Iris
  kind: action
  params:
    - name: value
      type: number
      min: 1.5
      max: 9.0
      description: Iris f-stop (FLOAT)
  command: aI{value}

- id: white_balance
  label: White Balance
  kind: action
  params:
    - name: kelvin
      type: integer
      min: 2500
      max: 10000
      description: White balance in Kelvin (INT16)
  command: aWB{kelvin}

- id: tint
  label: Tint
  kind: action
  params:
    - name: value
      type: integer
      min: -50
      max: 50
      description: Tint value (INT8, -50 to +50)
  command: aTINT{value}

- id: iso
  label: ISO
  kind: action
  params:
    - name: value
      type: integer
      min: -12
      max: 36
      description: ISO value (INT8, -12 to +36)
  command: aISO{value}

# Gimbal absolute position
- id: goto_absolute
  label: Go To Absolute Position
  kind: action
  params:
    - name: pan
      type: integer
      description: Absolute Pan position in 1/10th degree
    - name: tilt
      type: integer
      description: Absolute Tilt position in 1/10th degree
    - name: roll
      type: integer
      description: Absolute Roll position in 1/10th degree
    - name: zoom
      type: integer
      min: 0
      max: 4096
      description: Absolute Zoom position (0-4096)
    - name: duration
      type: number
      description: Transition duration in seconds
  command: "aGLOB;aP{pan};aT{tilt};aR{roll};aZ{zoom};{duration}"

# Gimbal button-style movement
- id: pan_left
  label: Pan Left
  kind: action
  params: []
  command: PAN_L
  note: Send PAN_IDLE after ≥70ms to stop

- id: pan_right
  label: Pan Right
  kind: action
  params: []
  command: PAN_R
  note: Send PAN_IDLE after ≥70ms to stop

- id: pan_idle
  label: Pan Stop
  kind: action
  params: []
  command: PAN_IDLE

- id: tilt_up
  label: Tilt Up
  kind: action
  params: []
  command: TILT_U
  note: Send TILT_IDLE after ≥70ms to stop

- id: tilt_down
  label: Tilt Down
  kind: action
  params: []
  command: TILT_D
  note: Send TILT_IDLE after ≥70ms to stop

- id: tilt_idle
  label: Tilt Stop
  kind: action
  params: []
  command: TILT_IDLE

- id: roll_left
  label: Roll Left
  kind: action
  params: []
  command: ROLL_L
  note: Send ROLL_IDLE after ≥70ms to stop

- id: roll_right
  label: Roll Right
  kind: action
  params: []
  command: ROLL_R
  note: Send ROLL_IDLE after ≥70ms to stop

- id: roll_idle
  label: Roll Stop
  kind: action
  params: []
  command: ROLL_IDLE

- id: zoom_in
  label: Zoom In
  kind: action
  params: []
  command: ZOOM+

- id: zoom_out
  label: Zoom Out
  kind: action
  params: []
  command: ZOOM-

- id: speed_up
  label: Speed Up Pan/Tilt
  kind: action
  params: []
  command: SPEED+

- id: speed_down
  label: Speed Down Pan/Tilt
  kind: action
  params: []
  command: SPEED-

- id: zoom_speed_up
  label: Zoom Speed Up
  kind: action
  params: []
  command: ZSPEED+

- id: zoom_speed_down
  label: Zoom Speed Down
  kind: action
  params: []
  command: ZSPEED-

- id: gimbal_autocalib
  label: Gimbal Autocalibration
  kind: action
  params: []
  command: GIMBALAUTOCALIB

- id: motor_autocalib
  label: Focus Motor Autocalibration
  kind: action
  params: []
  command: MOTORAUTOCALIB

- id: gimbal_sleep
  label: Gimbal Sleep
  kind: action
  params: []
  command: GIMBALSLEEP

- id: gimbal_wake
  label: Gimbal Wake
  kind: action
  params: []
  command: GIMBALWAKE

- id: active_track
  label: Active Track Toggle
  kind: action
  params: []
  command: ACTIVETRACK

- id: recenter
  label: Recenter Gimbal
  kind: action
  params: []
  command: RECENTER

# Camera actions
- id: autofocus
  label: Trigger Autofocus
  kind: action
  params: []
  command: AUTOFOCUS

- id: autoiris
  label: Trigger Auto Iris
  kind: action
  params: []
  command: AUTOIRIS

- id: colorbars
  label: Show Color Bars
  kind: action
  params: []
  command: COLORBARS

- id: zebra
  label: Show Zebra Guide
  kind: action
  params: []
  command: ZEBRA

- id: false_colors
  label: Show False Color Guide
  kind: action
  params: []
  command: FALSECOLORS

- id: status_view
  label: Show Status View
  kind: action
  params: []
  command: STATUSVIEW

- id: digital_zoom
  label: Toggle Digital Zoom
  kind: action
  params: []
  command: DIGITAL_ZOOM
  note: Sony cameras only

- id: custom_button
  label: Custom Button
  kind: action
  params:
    - name: button
      type: integer
      min: 1
      max: 6
      description: Custom button number (C1-C6)
  command: CUSTOM_C{button}
  note: Sony cameras only

- id: menu_button
  label: Press Menu Button
  kind: action
  params: []
  command: BTN_MENU
  note: Sony cameras only

- id: ok_button
  label: Press OK Button
  kind: action
  params: []
  command: BTN_OK
  note: Sony cameras only

- id: nav_left
  label: Press Left Button
  kind: action
  params: []
  command: BTN_LEFT
  note: Sony cameras only

- id: nav_right
  label: Press Right Button
  kind: action
  params: []
  command: BTN_RIGHT
  note: Sony cameras only

- id: nav_down
  label: Press Down Button
  kind: action
  params: []
  command: BTN_DOWN
  note: Sony cameras only

- id: nav_up
  label: Press Up Button
  kind: action
  params: []
  command: BTN_UP
  note: Sony cameras only

- id: multisel_left
  label: MultiSelector Left
  kind: action
  params: []
  command: MULTISEL_LEFT
  note: Sony cameras only

- id: multisel_right
  label: MultiSelector Right
  kind: action
  params: []
  command: MULTISEL_RIGHT
  note: Sony cameras only

- id: multisel_down
  label: MultiSelector Down
  kind: action
  params: []
  command: MULTISEL_DOWN
  note: Sony cameras only

- id: multisel_up
  label: MultiSelector Up
  kind: action
  params: []
  command: MULTISEL_UP
  note: Sony cameras only

- id: focus_in
  label: Focus In
  kind: action
  params: []
  command: FOCUS+

- id: focus_out
  label: Focus Out
  kind: action
  params: []
  command: FOCUS-

- id: iris_increase
  label: Iris Increase
  kind: action
  params: []
  command: IRIS+

- id: iris_decrease
  label: Iris Decrease
  kind: action
  params: []
  command: IRIS-

- id: wb_increase
  label: White Balance Increase
  kind: action
  params: []
  command: WB+

- id: wb_decrease
  label: White Balance Decrease
  kind: action
  params: []
  command: WB-

- id: iso_increase
  label: ISO Increase
  kind: action
  params: []
  command: ISO+

- id: iso_decrease
  label: ISO Decrease
  kind: action
  params: []
  command: ISO-

- id: tint_increase
  label: Tint Increase
  kind: action
  params: []
  command: TINT+

- id: tint_decrease
  label: Tint Decrease
  kind: action
  params: []
  command: TINT-

- id: shutter_increase
  label: Shutter Increase
  kind: action
  params: []
  command: SHUTTER+

- id: shutter_decrease
  label: Shutter Decrease
  kind: action
  params: []
  command: SHUTTER-

- id: nd_increase
  label: ND Filter Increase
  kind: action
  params: []
  command: ND+

- id: nd_decrease
  label: ND Filter Decrease
  kind: action
  params: []
  command: ND-

- id: rec_start
  label: Start Recording
  kind: action
  params: []
  command: REC_START

- id: rec_stop
  label: Stop Recording
  kind: action
  params: []
  command: REC_STOP

- id: rec_start_all
  label: Start Recording All Cameras
  kind: action
  params: []
  command: REC_START_ALL

- id: rec_stop_all
  label: Stop Recording All Cameras
  kind: action
  params: []
  command: REC_STOP_ALL

# Preset actions
- id: preset_trigger
  label: Trigger Preset
  kind: action
  params:
    - name: preset
      type: integer
      min: 1
      max: 12
      description: Preset number (1-12)
  command: PRESET{preset}

- id: preset_save
  label: Save Preset
  kind: action
  params:
    - name: preset
      type: integer
      min: 1
      max: 12
      description: Preset number (1-12)
    - name: camera
      type: integer
      min: 1
      max: 99
      description: Camera ID to save preset for
  command: SPRESET{preset}@C{camera}

Feedbacks

# Live status frame sent over the TCP connection.
# Available when Middle Control is connected to an ATEM Switcher or camera over Wired LAN.
# Frame format: {CAMid;PTSval;ZSval;PRESDval;aWBval;aFval;aIval;aUIval;aTINTval;aISOval;aSATval;aCONTval;aBLACKLEVval;aMIDLEVval;aWHITELEVval;aSHUTval;aPANval;aTILTval;aROLLval;aZOOMval;}
- id: selected_camera
  type: integer
  description: Currently selected camera ID (CAM field)

- id: pan_tilt_speed
  type: integer
  description: Current pan/tilt speed setting (PTS field, 1-100)

- id: zoom_speed
  type: integer
  description: Current zoom speed setting (ZS field, 1-100)

- id: preset_transition_duration
  type: number
  description: Preset transition duration in seconds (PRESD field)

- id: white_balance
  type: integer
  description: White balance in Kelvin (aWB field, 2500-10000)

- id: focus_position
  type: number
  description: Focus position (aF field, 0.0-1.0)

- id: iris_value
  type: number
  description: Iris f-stop (aI field)

- id: iris_ui
  type: number
  description: Iris UI display value (aUI field)

- id: tint_value
  type: integer
  description: Tint value (aTINT field, -50 to +50)

- id: iso_value
  type: integer
  description: ISO value (aISO field)

- id: saturation
  type: integer
  description: Saturation percentage (aSAT field)

- id: contrast
  type: integer
  description: Contrast percentage (aCONT field)

- id: black_level
  type: number
  description: Black level (aBLACKLEV field)

- id: mid_level
  type: number
  description: Mid level (aMIDLEV field)

- id: white_level
  type: number
  description: White level (aWHITELEV field)

- id: shutter
  type: string
  description: Shutter speed as fraction string e.g. "1/50" (aSHUT field)

- id: pan_angle
  type: number
  description: Pan angle in 1/10th degree (aPAN field)

- id: tilt_angle
  type: number
  description: Tilt angle in 1/10th degree (aTILT field)

- id: roll_angle
  type: number
  description: Roll angle in 1/10th degree (aROLL field)

- id: zoom_position
  type: integer
  description: Zoom motor position (aZOOM field, 0-4096)

Variables

# UNRESOLVED: no settable persistent variables described in source beyond action params

Events

# The feedback frame is sent continuously over the TCP connection when connected
# to an ATEM Switcher or camera over Wired LAN. It is an unsolicited status push,
# not a query-response model. See Feedbacks section for frame field details.

Macros

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

Safety

confirmation_required_for: []
interlocks:
  - description: "PAN_L/PAN_R, TILT_U/TILT_D, ROLL_L/ROLL_R require matching stop command (PAN_IDLE, TILT_IDLE, ROLL_IDLE) after ≥70ms"
# UNRESOLVED: no power-on sequencing or hardware interlock requirements stated in source

Notes

  • Commands can target a specific camera by appending @Cx (where x is the camera ID), e.g. REC_START@C2. This overrides the currently selected camera for that command only.
  • Multiple cameras can be controlled simultaneously by sending targeted commands in rapid succession.
  • Button-style movement commands (PAN_L, PAN_R, TILT_U, TILT_D, ROLL_L, ROLL_R) require a matching stop command after a minimum delay of 70ms.
  • The absolute position frame uses semicolon-delimited format: aGLOB;aP{pan};aT{tilt};aR{roll};aZ{zoom};{duration}.
  • Some camera actions are vendor-specific (Digital Zoom, Custom Buttons, Menu navigation) and apply only to Sony cameras.
  • Camera actions (AUTOFOCUS, AUTOIRIS, etc.) work with Blackmagic cameras controlled by ATEM or paired via Bluetooth, and Sony cameras.
  • Feedback is only available when Middle Control is connected to an ATEM Switcher or a camera over Wired LAN.

Provenance

source_domains:
  - middlethings.co
source_urls:
  - https://middlethings.co/api
retrieved_at: 2026-04-30T04:41:37.784Z
last_checked_at: 2026-06-02T22:09:42.343Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T22:09:42.343Z
matched_actions: 72
action_count: 72
confidence: medium
summary: "All 72 spec actions traced to source (dip-safe re-verify). (3 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "no settable persistent variables described in source beyond action params"
- "no multi-step macro sequences described in source"
- "no power-on sequencing or hardware interlock requirements stated in source"

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