Repository navigation
The first public beta of the Universal Mixer: Sidecar becomes a mixer core without one
console's limits (docs/UNIVERSAL_MIXER.md), on which the WING is an emulation and
other consoles will be. The engine and the show format take any configuration (any
number of channels, buses, mains and matrices, up to 256 DCAs and mute groups, 64 FX
slots), and a strip's processing is a chain that can hold extra blocks and tap points.
Its own interface, the Universal Mixer, is a preview beside the WING surface
(SETUP > SIDECAR > INTERFACE): a MIXER view for a console of any size with the selected
strip whole across the top, an inspector for a strip's chain and sends, curves with
handles, ROUTING, FX RACK, MONITORING, SCENES, RECORDER and SETUP. The WING surface
works as before and shows the Universal Mixer's blocks on HOME > CHAIN.
Also new: the audio interface as a device of its own in ROUTING, a SIDECAR tab on
SETUP for everything a WING doesn't have, a plugin overview window, more FX slots,
direct outs, multichannel WAV import in the multitrack editor; and fixes for a crash in
the plugin overview, OPEN EDITOR on the INS screen, the display jumping to the EQ, and
the WING DSP measured against a WING COMPACT.
Shows saved by this version (format 4) don't open in Sidecar 0.1.x; shows from 0.1.x
open as before.
Added
-
Universal core, Phase 1 step 1: the console's counts are a configuration
(ConsoleConfig,Engine::configure; the WING's by default). Up to 256 DCAs and
256 mute groups (the WING uses 16 and 8): strip memberships, engaged mute groups,
source mute groups, recall scopes, global safes and snippets hold any of them, and
shows store them (as before while only the first 64 are used). C ABI 25:
ld::GroupMask/ld::GroupBits,ld_engine_counts,ld_engine_configure,
ld_engine_set_num_dcas,ld_engine_set_num_mute_groups. -
Universal core, Phase 1 step 2: any number of mains and matrices (up to 256 each;
the WING has 4 and 8). A strip's sends to them are stored by destination, like
its bus sends, instead of a fixed block of 4 and 8. Shows save a strip's sends to
the console's mains and matrices. C ABI 26:ld_strip_main_send,
ld_strip_matrix_send(C++strip.mains[i],strip.matrix[i]). -
Universal core, Phase 1 step 3a: a strip runs its processing as a chain of
blocks and tap points (chain.rs); the WING's strips and its 24 process orders
are templates of that chain. The sound is unchanged (checked byte for byte). -
Universal core, Phase 1 step 3b: extra processing blocks (filter, EQ, dynamics,
insert, delay; up to 32 per strip) anywhere in a strip's chain, saved with the show
(<Chain>) and recalled by scenes with their section. Engine and show only for
now; the C ABI and the new interface come later. -
Universal core, Phase 1 step 3c: tap points anywhere in a strip's chain (up to 32
per strip); any send to a bus, main or matrix can take its signal at one. Saved with
the show. C ABI 27: the sends'tap. -
Universal core, Phase 1 step 5: tests that run a console that isn't a WING (48
channels, 24 buses, 2 mains, 6 matrices, 32 DCAs, 12 mute groups, extra blocks and
taps) end to end, in Rust and in C++, through a show save and load. -
Universal Mixer, Phase 2 step 1: the window is a shell around an interface ("skin"):
the WING surface, unchanged, or the Universal Mixer's own interface, a preview for
now. SETUP > SIDECAR > INTERFACE switches between them at once (an app
preference). A show of a console that isn't a WING opens in the Universal Mixer;
choosing WING then offers to make it a fresh WING. The monkey test can start on the
Universal Mixer (--interface universal). -
Universal Mixer, Phase 2 step 2: a strip's chain in the C ABI (version 28) and the
C++ facades, for the Universal Mixer's chain editor: its steps in processing order
(ld_strip_chain), its extra blocks with their parameters and meters
(ld_strip_block), adding, moving and removing blocks and user taps, clearing the
chain, a block's model and its curve (ld_strip_block_response), and
ld_engine_set_config. C++:Strip::getChain,getBlock,insertBlock,
moveBlock,removeBlock,clearChain,insertTap,moveTap,removeTap,
setBlockModel,getBlockResponse;MixerEngine::setConfig. -
Universal Mixer, Phase 2 step 3: the Universal Mixer's first view. Its MIXER view
has a column for every strip of the console, whatever its size (pan, MUTE, SOLO, the
fader with its output meter, the strip's colour, label and name; a tap on the name
selects the strip), scrolled sideways, with keys that show one kind of strip at a
time. Touch first: controls move by how far a finger travels and never jump, a double
tap resets them, keys are at least 44 px. It is drawn with a dark theme's design
tokens (src/ui/universal). The top bar shows the console's counts and a key back
to the WING surface. -
Universal Mixer, Phase 2 step 4: the inspector. Selecting a strip in the Universal
Mixer opens it beside the mixer. CHAIN lists the strip's processing in order (its own
blocks, the fader between PRE-FADER and POST, extra blocks and user taps): ADD puts a
filter, EQ, dynamics, insert or delay block or a user tap after the selected row,
REMOVE takes one away, and a drag moves it. The selected block's editor has its keys,
model, curve, gain reduction and every parameter of its model, for the strip's own
blocks and extra blocks alike. SENDS has a row per bus, main and matrix the strip can
send to, with ON, level and where the send takes the signal (PRE, POST, GRP or one of
the strip's user taps). -
Universal Mixer, Phase 2 step 5: ROUTING, FX RACK and MONITORING, shown by keys under
the top bar. ROUTING is a patch matrix: INPUTS patches the channels' and aux's
inputs from a group of sources, OUTPUTS feeds the interface's outputs from any bus,
main or matrix side or the monitor paths, for a console of any size. FX RACK has a
tile per FX slot and the selected slot's device, plugins and controls (the device's
front panel or its parameter list). MONITORING has the speakers' and phones' paths
and the solo settings, with CLEAR SOLO. -
Universal Mixer, Phase 2 step 6: SCENES (GO, PREV, NEXT, ADD, STORE, RENAME, UP,
DOWN, REMOVE), RECORDER (the recorder pages and the multitrack editor) and SETUP: the
console's configuration (channels, aux, buses, mains, matrices, DCAs, mute groups,
FX slots) changes without a reset. New ones are added at the end and everything else
stays; fewer take from the end after a warning, keeping a bus, main or matrix that
something sends to, a DCA or mute group with members and an FX slot in use. AUDIO
(the audio device) and PREFERENCES too. C ABI 29:ld_engine_set_num_strips. -
SETUP has a SIDECAR tab (gold) for everything a WING doesn't have, behind three
keys: SETTINGS (the console's size, the surface's finish, the console model, the
interface WING / UNIVERSAL, the audio device and the outputs' protection, which were on
GENERAL and AUDIO), PLUGINS and LOG (the tabs they were). GENERAL's CONSOLE
keeps the console's own name, software and data folders; UTILITY opens SIDECAR's LOG. -
The audio interface is a device of its own in ROUTING: a page named after its driver
(ASIO, CORE AUDIO, ALSA, JACK, WASAPI; the WING surface's fourth ROUTING key, the
Universal Mixer's third ROUTING tab) patches each interface input to a console input
port (LOCAL IN, AES50 B / C) and each interface output to a console output port, with
the driver's channel names. Straight through by default, as before; STRAIGHT puts it
back. The patch is the computer's, kept per driver and device in the app settings. -
Universal Mixer: a channel panel across the top of MIXER shows the selected strip
whole (input, filter, gate, EQ and dynamics with their curves, its chain in order, its
sends a line each); CHANNEL hides or shows it. The curves have handles there and
in the inspector: EQ bands (frequency and gain by dragging, Q with the wheel, default
with a double tap), a filter's cuts, and a dynamics block's threshold and ratio (a
gate's range) on its transfer curve, a new view with its gain reduction. MODEL and FX
RACK's DEVICE open a grid of the models' front panels (the WING's pictures). Its
screenshots are rendered at 1920 x 1080. A list's device tag no longer covers its value
when the list is narrow. -
The WING surface shows the blocks and taps added in the Universal Mixer: HOME has a
CHAIN tab of Sidecar's (after TAGS; CHAIN +n while the strip has n of them)
listing the strip's processing top to bottom, a row per block with its model or
setting and ON, the added ones in gold; the block column on the left has a gold +n
notch under the block they follow. What a skin shows of a chain is shared (ui/ChainSummary), for the
consoles to come. -
Universal Mixer, Phase 2 step 7 (Phase 2 complete): the user guide's chapter The
Universal Mixer (preview), view by view with screenshots; the README shows it, and the
start-up notice says what it covers. The screenshots are rendered by a test category of
their own (LiveDAWTests Screenshots) on a demo console. -
The Universal MIXER view's strips have an overview above a shorter fader: input
level, GATE and DYNAMICS gain reduction, the EQ curve and output level. FADERS
hides or shows the faders at any moment, the overview then taking the column. -
The Universal Mixer tags the parts that come from one console's emulation with its
name (WING: the strip's own blocks, the model lists, front panels, routing groups,
send modes, monitor sources, solo modes and the fader law), ready for the other
consoles to come. -
SETUP > GENERAL > ABOUT (and the start-up notice) links the Sidecar Discord server
for questions, setup help and feedback: a Community section and a DISCORD key
that opens the invite in the browser. -
The multitrack editor imports multichannel WAVs, such as the takes an X32 (X-LIVE
card) or a WING (WING-LIVE card) records to its SD cards: each channel becomes a
mono track. A take the card split into 00000001.WAV, 00000002.WAV, ... is joined
back into one clip per track, named after its session folder. Drop the session
folder on the editor, choose it with FILE > Import a folder, or pick its WAVs with
FILE > Import audio. Before, only the first two channels were imported. -
More FX slots: SETUP > SIDECAR > FX SLOTS sets 16 (WING, the
default), 32, 48 or 64. EFFECTS, the inserts' SELECT FX PROCESSOR window, the scene
SCOPE and GLOBAL SAFE windows, ROUTING's FX SEND group, custom controls and the plugin
latency list follow, in banks of 16. Fewer slots never drop a slot in use; a show
that uses more brings them along. The WING and MIDI remotes see FX 1-16. -
Plugin overview (SETUP > SIDECAR > PLUGINS > PLUGIN OVERVIEW, Ctrl+Shift+P): every plugin
of every FX slot in a window of its own, for a second screen during a show. CARDS
with a picture of each plugin's editor, or a compact LIST; each slot's state, the
strips using it, IN / OUT meters, CPU and latency; faults and bypass stand out. The
plugin windows take the pictures while they are open, CAPTURE ALL takes them all.
The window remembers its screen, size, layout, ON TOP and text size, and reopens at
start-up. -
Direct outs: ROUTING > OUTPUTS has the source groups CH DIRECT (channels and
aux) and BUS DIRECT, each tapped PRE FADER or POST FADER, to any output or RECORDER
port. Saved with the show, recalled with ROUTING. -
Monkey tests: a Monkey unit test (random FX slot, plugin, direct out, scene
and plugin overview operations while audio runs) andSidecarMonkey, which drives
the whole program's UI with random input on the virtual audio device and checks for
crashes, non-finite audio, stalls and audio dropouts.SIDECAR_HOMEputs Sidecar's
settings and documents in another folder (test runs).
Changed
- Show format 4. Shows now store the console's configuration (how many channels,
aux, buses, mains, matrices, DCAs, mute groups and FX slots it has) and the profile
they were made for (wing), and a load rebuilds that console first. Shows saved by
this version don't open in Sidecar 0.1.x; shows from 0.1.x (format 3) open as a
WING, as before. - The C ABI is version 24: 64 FX slots in
EngineControls,ld_engine_num_fx/
ld_engine_set_num_fx/ld_engine_fx_in_use, 64-bit FX masks inScopeC, and
kDirectSourceBasedirect-out codes.
Fixed
- From a macOS user's report, all platforms:
- A channel's INS screen: OPEN EDITOR did nothing. The effect's front panel,
unused with a plugin in the slot, lay over the key and took the press; it now
shows only for a device. - The display jumped to a channel's EQ (or another block) by itself: the pointer
passing over one of the channel strip section's encoders counted as touching it,
and CH STRIP TOUCH SELECT followed. Pointing at an encoder now only shows its slot
on the section's small screen; a grab or a wheel turn is the touch. - EFFECTS, a plugin's slot: OUTBOARD unloaded the plugin at once; it now asks
first. The plugin's name and its maker / format / LOAD line lay under the SOURCE
keys; they are under them now. After a plugin was loaded the page still said NO
PLUGIN LOADED until something else repainted it; it shows the plugin (and its
LOAD) as it changes. - The tests now link the whole UI (the WING surface's screens and pages too), and a
test of their own (WING surface UI) drives these as a user would.
- A channel's INS screen: OPEN EDITOR did nothing. The effect's front panel,
- The plugin overview could crash Sidecar when a plugin was removed while it was open.
It looks at the FX slots 15 times a second and draws what it saw; a paint that came
between a plugin's removal and the next look asked the deleted plugin its name (to
find its picture). It now uses the name it read at its look and never touches a
plugin that may be gone. The Monkey test found it (seed 2 on Windows; CI's macOS
runs with the default seed). - CI's Linux and macOS test jobs had failed since 1 November, so no release could be
published. On macOS it was the plugin overview's crash above. On Linux the tests that
open windows (the plugin overview's, the Windows test) crashed without an X display;
they now skip their windows there, and the Monkey test runs without the overview.
The Monkey test also runs past its 4 s, up to a minute, until it has done 300
operations: the sanitizer builds are slower and managed only 179. It gives the plugin
overview up to 2 s to catch up before it counts a mismatch (on macOS its timer ran
more than 120 ms late). The scribble strips' descender test, never run on macOS
before, allows a row less of a "g"'s tail there, where CoreGraphics draws the text.
A timing check of the WING effects (tails_end_cleanly: silence must cost no more
than sound) took one measurement and failed when a shared runner hiccuped; it now
takes the best of three. - A crash of
LiveDAWTests(a fault, an abort, an uncaught exception, a pure virtual
call) prints the test it happened in and the stack, in a CI log too; on Windows the
tests are built with symbols, so the stack names the functions. - The macOS (AppleClang) build compiles without warnings. The strip and DCA name
windows had asetNameof their own (it names the strip, the DCA) that overrode
JUCE'sComponent::setNameby accident; it isrenamenow. The rest: lambda
captures, parameters and loop bindings that hid other names, two unused members, the
multitrack editor's FILE helpers private to their file, and the linker's note about
the Rust library's duplicate-lSystem(quieted where the linker knows the flag). - The Linux (gcc) build compiles without warnings again: the main and matrix send
indices are cast where the sends became a bank of any size, the Universal Mixer's
switches name every kind of chain step, and the MIXER view initialises its members
in order. - The Windows (MSVC) build compiles without warnings again: number conversions, local
names that hid a class's members and a constant condition in the UI and the tests,
which only a full rebuild showed, and the plugin sandbox's intended cache-line padding. - The whole-program monkey test (
SidecarMonkey) could crash itself (0xC0000409) on a
click it sent to a pop-up's drop shadow. Windows sends a shadow's window no mouse
input; sent one anyway, the press reached the window under it, dismissed the menu,
and the shadow's window was deleted before the click's mouse-up went to it. The
monkey now leaves windows that take no mouse input alone and sends nothing more to a
window an event closed. On Windows its log also names the stack of an abort, an
uncaught exception or another C runtime fail-fast (its build has symbols). Sidecar
itself wasn't at fault; a test (Windows) shows the case. - Importing a WING snapshot no longer patches two of its inputs to one port. The WING's
LOCAL, AUX, StageConnect, USB, MOD and AES/EBU inputs land on the ports AES50 A (or B)
has here, so a show with the drums on A 1-5 and the vocals on the console's LOCAL 1-5
played the drums on the vocal channels, under the drums' names. The input that would
share a port now moves to a free AES50 B / C port (a stereo pair to a free pair) with
its name, colour, icon, gain and mode, and every patch to it (channel, ALT, outputs)
follows; the import log lists each move. - Windows: when Windows couldn't resolve the Documents folder (redirected to a
network share or to OneDrive and not there), Sidecar put its folders at the root
of the drive (C:\Sidecar\Recordings), which a standard user can't create, and
recording failed with "Couldn't create ...". The default is now theDocuments
folder in the user's folder (or app data), and a project that can't be created
says to choose another folder in FILE > Projects folder
(#12). - WING REMOTE: OSC apps on the same computer as Sidecar (wosc and the like) get
Sidecar's replies and changes. On Windows, an app could bind its own address on
Sidecar's OSC or discovery port and then receive everything sent to it, so
Sidecar never saw the app as a client. Sidecar now holds those ports
exclusively (#6). - WING REMOTE: an OSC app that sends each request from a new port is listed once,
under the port it asked replies on, not once per request. Its own changes are no
longer pushed back to it when they arrive from a different port. - Measured against a WING COMPACT (firmware 3.1.1) with
tools/wing/audio_compare:- An FX inserted on a mono channel stays stereo after the insert, each side at the
mono pan law, as on the WING (a plate came out summed to mono, the chorus lost
its stereo sweep). - The compressor models work on the crossover band in DYN XOVER LO / HI: they key
from the band and reduce only the band, which DEPTH doesn't limit. Before, the
crossover was ignored and the whole signal was compressed. - The dynamics' GAIN applies to the processed signal ahead of MIX: COMP 4:1 at MIX
50 % and GAIN +6 dB gains +3.5 dB below the threshold, as on the WING (it gained
+6 dB). - The dynamics models that sense peaks (SOUL BUS, 76 LIMITER AMP and the other
non-RMS ones) hold the peak for 5 ms instead of releasing in every trough of a
tone: SOUL BUS reaches 63 % of a 40 dB step in 10.7 ms (WING 9.3 ms, before 19.3). - STEREO DELAY's FEED follows a square law: 40 % gives repeats 16 dB apart (0.40²),
as on the WING; before, they were 8 dB apart. - STEREO CHORUS's DEPTH at 100 % sweeps +-50 % of the delay (it swept +-40 %).
- An FX inserted on a mono channel stays stereo after the insert, each side at the
- An insert pointed at an FX slot past the ones in use some other way than a show or
scene (a channel preset, a copy, a remote) now brings that slot into use, so the
EFFECTS rack always shows every slot that runs (found by the monkey test). - The console's autosave rewrote the whole show, and its backup, every 30 seconds
even when nothing had changed: constant writes to a USB stick or SD card while
the console only plays audio. A save whose show is the same as the file on disk
now leaves the file alone (also for presets and library files); a changed show is
still written to a verified temporary file, with the previous version kept as
.bak.
Download and install
| Platform | File |
|---|---|
| Windows 10/11 (64-bit) | Sidecar-0.2.0-Windows-x64-Setup.exe (installer) or Sidecar-0.2.0-Windows-x64.zip (portable) |
| macOS 11+ (Apple silicon and Intel) | Sidecar-0.2.0-macOS.dmg |
| Linux x86_64 (glibc 2.38+, e.g. Ubuntu 24.04) | Sidecar-0.2.0-Linux-x86_64.AppImage or Sidecar-0.2.0-Linux-x86_64.tar.gz |
SHA256SUMS.txt lists the files' checksums (sha256sum -c SHA256SUMS.txt --ignore-missing).
Windows: run the installer (Start-menu entry and uninstaller), or unzip the portable build
and run Sidecar.exe. No runtime to install. The files aren't code-signed, so SmartScreen may
warn; choose More info > Run anyway. Audio: ASIO (your interface's driver, ASIO4ALL or
FlexASIO) and WASAPI.
macOS: open the disk image and drag Sidecar to Applications. Sidecar isn't notarized, so the
first time right-click it and choose Open (on macOS 15+: try to open it, then System Settings >
Privacy & Security > Open Anyway), or run xattr -dr com.apple.quarantine /Applications/Sidecar.app.
Allow microphone access so it can read your interface's inputs. Audio: CoreAudio.
Linux: chmod +x the AppImage and run it (needs FUSE; otherwise add --appimage-extract-and-run),
or unpack the tarball and run ./Sidecar. It uses the system's ALSA, FreeType, Fontconfig and X11
libraries; JACK (or pipewire-jack) is used when installed. See README-LINUX.txt in the tarball.
Choose the audio driver and device in SETUP > AUDIO.
Questions and feedback: the Sidecar Discord server.
About
Sidecar is an independent hobby project, made for fun and practice. It is not
affiliated with or endorsed by Behringer or Music Tribe; WING is their trademark.
It tries hard to emulate the WING faithfully, but it is incomplete and can differ
from the real console (the start-up notice lists how). Don't rely on it for a
critical live show without testing it first.
Sidecar is free software under the GNU Affero General Public License v3 (see LICENSE;
third-party licences in THIRD_PARTY_NOTICES.md).