Skip to content

Sidecar v0.2.0

Latest

Choose a tag to compare

@github-actions github-actions released this 03 Nov 02:09

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) and SidecarMonkey, 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_HOME puts 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 in ScopeC, and
    kDirectSourceBase direct-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.
  • 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 a setName of their own (it names the strip, the DCA) that overrode
    JUCE's Component::setName by accident; it is rename now. 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 the Documents
    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 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).