Build: 2d2a75e | May 6 – 11, 2026
🔌 Windows — VST3 & CLAP Plugin UI Stability
After extensive testing on Windows with Surge XT, Vital, u-he Hive and LSP Plugins, every known plugin window issue has been resolved:
- Plugin windows now hide on close instead of being destroyed — re-opening restores the same editor without a full reinitialisation cycle. The toggle button state is synced with
IsWindowVisibleon every frame - Fixed plugin window reopen for both VST3 and CLAP on Win32: window state is no longer out of sync after the user closes and reopens the editor
- Enforced fixed-size editor windows on Win32: prevents some plugins from collapsing to 0 × 0 px on show
- VST3 initialisation on persistent GUI thread:
IComponent::initializeandIEditControllersetup now run exclusively on the dedicated GUI thread — eliminates COM apartment violations and race conditions - Message pumping while
attached()runs: fixes Surge XT GUI hang where the plugin called back into the host during the attach sequence - Per-monitor DPI awareness (
PROCESS_DPI_UNAWARE→PROCESS_DPI_AWARE) set before any window is created;WS_CLIPCHILDRENprevents child overdraw - Attach watchdog extended to 180 s; worker thread detaches cleanly on timeout — the UI never freezes waiting for a stuck plugin
- Step-by-step logging and a panic catcher around
IComponent::initializefor easier debugging of misbehaving plugins
🔊 Windows — WASAPI & ASIO Engine Fixes
- WASAPI
DEVICE_INVALIDATEDfix: the engine now negotiates the device's native mix format instead of the user-configured format — the leading cause of stream crashes on default-device change - Panic catcher in the audio callback: any Rust panic is caught and logged; the stream is not killed, preventing full WASAPI session loss
- WASAPI buffer size regression fixed: a recent refactor accidentally wrote a hard-coded frame count; now correctly reads the device-reported period
- Unified settings path: all persisted settings (audio, MIDI, autosave, app prefs) now live under
omni_config_dir()— consistent on Windows and Linux - ASIO sample format conversion corrected: silence and noise artefacts on 24-bit and 32-bit ASIO devices (ASIO4ALL, RME, Focusrite) are eliminated
- ASIO4ALL control panel now launches correctly from the Settings → Audio dialog on Windows
- Windows builds now include ASIO SDK by default — ASIO is no longer an optional compile-time feature; any Windows build can use ASIO devices
⚡ Engine — Auto-Restart on Stream Death
Previously, if the audio device was removed or WASAPI reported a fatal error, the engine would silently stop processing while Omni's UI remained up with no indication. This is fixed:
- A new
stream_died: Arc<AtomicBool>is set by thecpalerror callback on any fatal stream error - The UI polls this flag once per frame; on detection it tears down and fully rebuilds the engine with the current audio settings
- Recovery is automatic — plug in a USB audio device, switch the Windows default output, or wake from sleep: Omni reconnects without a restart
💾 Autosave — Complete System
Omni now has a full autosave implementation designed for crash recovery and session continuity:
- Configurable interval: 1–60 minutes; enabled by default at 5 minutes
- Snapshots stored in
~/.config/omni/autosave/with ISO-8601 timestamps - Automatic pruning: old autosaves beyond a configurable count are removed; storage stays bounded
- Extended Load menu: Open…, Recent Projects (last 10), and AutoSave Recovery sub-menus accessible from the top bar
- One-click recovery: open any autosave snapshot directly from the Recovery list
- Settings → AutoSave tab: enable/disable toggle, interval slider, Clear Autosaves button
- Recent projects list persisted in
~/.config/omni/app_settings.json; updated on every save and open
🎛️ Modulation Routing — Engine Fix
A subtle but impactful bug in the modulation engine has been corrected:
- Add/remove/disable routes now correctly primes and resets the parameter base value for instrument and plugin targets — the value a modulator is added on top of
- Routing order bug fixed: a newly added route could read a stale base value on the very first audio callback, causing a one-buffer offset artefact
- Dead code removed; regression tests added for all three cases (add, remove, disable)
🎨 Solaris UI — Universal Synth Panel Refactor
Every remaining synth in Omni has been migrated to the compact Solaris-style panel layout — the design system introduced with Bass Synth that maximises knob density and modulation visibility on a 15.6″ laptop screen.
TOMNIC Drum Synth
- OSCILLATORS section with OSC 1 / OSC 2 tabs
- NOISE section with NOISE 1 / NOISE 2 tabs
- LFOs section with LFO 1 / LFO 2 tabs
- CLICK as a separate narrow section
- FILTER uses the hardware
filter_displaywidget, narrowed to 86 px - FX split into individual vertical sections: DISTORTION, FREQ SHIFT, RING MOD, DELAY, REVERB, PHASER, CHORUS, EQ, WIDTH
- Main panel scroll eliminated — all sections fit without scrolling at full resolution
PolySynth
- Full compact Solaris layout — shared widgets and conventions with Bass Synth
- Modular code split; legacy
polysynth_sections.rsremoved
Alchemy — Chemistry Synth
- Modular code split:
solaris_reaction.rs(reactor view) andsolaris_visuals.rs(plasma orb, stoichiometry fill) extracted into dedicated files - Ampoule panel rearranged to a 3×3 grid placed after the output section — more accessible, less visual clutter
- Periodic table resized and compacted;
ScrollAreawrapper removed in favour of direct layout allocation — no horizontal scroll
Piano & Violin (Physical Models)
- Both instruments migrated to the shared
modeled_synth_solarispanel module - Preset combo, section headers and dynamic labels unified with Bass Synth conventions
- Piano UI reduced from ~760 lines to a compact shared implementation; Violin from ~443
Scratch Deck
- Compact Solaris layout applied to the sample loader and transport controls
- Live platter rotation visualiser added — the vinyl graphic rotates in real time at the current playback speed and direction
Bass Synth
- Modulation animation overlays fully restored for all Solaris widgets: knobs, faders, toggles, combo boxes
- All modulated parameters show animated rings, sweep dots and highlight lanes as before the Solaris migration
- Legacy
bass_synth_sections.rsremoved; imports cleaned up
🐛 Bug Fixes
- Gate expander mode: soft-expander ratio was applied in the wrong direction at low ratio values — gain reduction is now correctly attenuated
- Windows debug stack overflow:
.cargo/config.tomlnow sets a larger stack size for debug builds, preventing stack overflows in debug-mode recursive code paths - Load toolbar button: now uses the same
toolbar_buttonstyle as its neighbours — was inconsistently using a plain button style - omni_midi_sim Windows build: added a stub
main()for non-Unix targets so the crate compiles without virtual MIDI port support on Windows
Omni is actively developed — the next update is coming soon. 🚀
VST3 finally stable on Windows, or the Solaris UI refresh — which one makes the biggest difference for your workflow? Let us know.
