Tools for Behringer X32 / Midas M32 consoles — emulator, remote GUI, show recording.
The emulator logs every request it does not handle. Connecting the official editors to it is the fastest way to find what is still missing.
go build -o bin/ ./cmd/...
bin/tabula-emu -model M32C -scene testdata/scenes/demo.scn \
-presets ~/.config/.M32-Edit/Xlib \
-http :8032 -unhandled-log var/unhandled.jsonl
-model: use M32C/M32/M32R for M32-Edit, X32/X32RACK/X32C… for X32-Edit.-presets fills the library with M32-Edit’s factory presets, as a console ships with them.-library var/library keeps what you save from the editor’s library pages, and offers the scene files you put there as scene-00.scn, scene-01.scn… in the console’s scene slots (git ignores var/).Open http://localhost:8032, the read-only debug page:
/xremote.var/unhandled.jsonl.ch/01/ or IEM, and watch it change while you move things in the editor.Things worth checking in the editor: channel names, colours and icons; faders and mutes moving both ways (edit in the editor, then in a second editor or with tabula); routing pages; effect pages (every effect is modelled); library pages; meters moving.
Reading the emulator (Mixer → PC) and writing a scene to it (PC → Mixer), meters, the RTA on the EQ page and in the graphic EQ editor, and linked channels moving together: see how the emulator works. An RTA or a meter that stays empty usually means the source has no signal: in a fresh scene, faders and sends are down, so buses and matrices are silent.
Only one program can use UDP port 10023 on a machine. To try a second emulator and editor side by side (Linux), run them in a private network namespace with a dummy interface, so the editor finds that emulator by broadcast:
unshare -rn sh -c '
ip link set lo up
ip link add d0 type dummy && ip addr add 10.77.0.1/24 broadcast 10.77.0.255 dev d0 && ip link set d0 up
bin/tabula-emu -name test -scene testdata/scenes/demo.scn -http 127.0.0.1:8099 &
cd ~/m32-edit && HOME=/tmp/m32home XAUTHORITY=$HOME/.Xauthority ./M32-Edit'
HOME points the editor to a separate settings directory (copy
~/.config/.M32-Edit there first). To send OSC to that emulator, enter its
namespace: nsenter -t <emulator pid> -U -n --preserve-credentials <command>.
Send var/unhandled.jsonl (or the debug page’s JSON at
http://localhost:8032/api/unhandled) — it is enough to implement what is
missing.