X32 Control Surface OSC Mixer

Maolan MixOSC

Rust OSC client and control surface for Behringer X32-family mixers. A desktop GUI built with Iced, plus a reusable library for discovery, state loading, and meter parsing.

2
Components: GUI + library
10023
Default X32 UDP port
7
Strip types supported

Maolan Integration

MixOSC is built into Maolan as a dedicated X32 hardware mixer view. When enabled, the full MixOSC control surface runs directly inside the DAW, sharing the same Iced rendering context and widget theme.

How It Works

  • Click the sliders icon in the Maolan toolbar to open the X32 view.
  • Maolan instantiates mixosc::app::StatusApp inside the GUI state.
  • OSC subscription starts only while the X32 view is visible, saving resources.
  • All mixer messages are wrapped as Message::HwMixer and dispatched through the standard update loop.
  • The MixOSC surface renders natively using the same Iced backend as the rest of Maolan.

Technical Details

  • Integrated as View::X32 in the Maolan view state.
  • Uses mixosc::app::subscription for live OSC updates when active.
  • Mixer state is owned by the DAW and updated through mixosc::app::update.
  • The surface view is produced by mixosc::app::view and mapped into Maolan's message system.
  • Connection to the X32 is handled automatically via UDP broadcast discovery or a configured address.

Screenshot of MixOSC inside Maolan

[ MixOSC picture placeholder ]

Overview

MixOSC is a standalone Rust application and library for controlling Behringer X32 mixers over OSC. It discovers mixers on the local network and presents a mixer-style control surface.

Desktop GUI

  • Built with iced and maolan-widgets.
  • Auto-discovers X32 mixers on the local network.
  • Subscribes to live OSC updates with /xremote and meter subscriptions.
  • Real-time UI updates when the mixer state changes locally.

Rust Library

  • X32 UDP/OSC discovery and connection probing.
  • State loading and updates for all strip types.
  • Meter packet parsing for input and main buses.
  • Console update parsing with ConsoleUpdate events.

Current GUI Behavior

When a mixer is reachable, the application loads and displays the full mixer surface in real time.

Supported Strips

  • CH 01-32 — Input channels
  • AUX 01-08 — Auxiliary inputs
  • BUS 01-12 — Mix buses
  • FX 01-08 — FX returns
  • MTX 01-06 — Matrices
  • DCA 1-8 — DCA groups
  • Main LR — Main stereo bus

Real-Time Parameters

  • Name and scribble-strip color
  • Input gain or trim
  • Sends to buses and matrices
  • Pan
  • Fader level
  • Input and main/matrix meters
  • Mute and Solo

What Is Implemented per Strip Type

Each strip type exposes a specific subset of controls based on what the X32 hardware supports.

Fully Supported

Channels and aux inputs: gain/trim, sends to buses 1-16, pan, fader, mute, solo, color, name, meters

FX returns: sends to buses 1-16, pan, fader, mute, solo, color, name

Buses: sends to matrices 1-6, pan, fader, mute, solo, color, name

Partially Supported

Matrices: fader, mute, color, name, matrix meter

DCAs: fader, mute, color, name

Main LR: fader, mute, color, stereo meter

Implementation Notes

  • Gain uses headamp control where available and trim otherwise.
  • Channel 17-32 use trim gain; earlier channels and supported aux inputs can use headamp gain.
  • Gain is not exposed for buses, FX returns, matrices, or DCAs.
  • Pan is not exposed for matrices or DCAs.
  • DCA and matrix solo are not sent to the mixer.
  • Master solo is a local UI toggle and is not sent to the mixer.

Running

Start the application with automatic discovery, or connect to a specific mixer by address.

Automatic Discovery

cargo run

Connect to a Specific Mixer

cargo run -- 192.168.1.62

With a custom port:

cargo run -- 192.168.1.62:10023

Environment Variable

MIXOSC_MIXER_ADDR=192.168.1.62 cargo run

The default X32 port is 10023.

Library Surface

The crate exports OSC/X32 helpers from src/x32.rs for building custom integrations.

Discovery & Connectivity

DiscoveryProbe ConnectionProbe DiscoveredMixer ProbeOutcome

Strip State Control

FaderBankProbe PanBankProbe GainBankProbe SendBankProbe MuteBankProbe SoloBankProbe NameBankProbe ColorBankProbe

Meter Handling

batchsubscribe_meter_request renew_request parse_input_meter_packet parse_main_meter_packet

Console Updates & Constants

parse_console_update ConsoleUpdate parse_target X32_DEFAULT_PORT X32_BROADCAST_ADDR XREMOTE_REQUEST

Development

This repository has a single binary entry point in src/main.rs and a reusable library in src/lib.rs.

cargo check