Build: 0703e40 | May 11 – 23, 2026
🌊 Convolution Reverb — Gardner Partitioned FFT + AI IR Generation
Omni's reverb FX now has a second mode alongside the FDN algorithmic reverb: a full convolution reverb engine.
- Gardner partitioned convolution (
fft-convolver) — zero-latency overlap-save algorithm, RT-safe via the Baker/GC thread pattern for IR loading; the audio thread never touches the IR buffer directly - Load any impulse response from disk: WAV, FLAC, OGG, MP3 via the file dialog; decoded with Symphonia
- Generate AI impulse responses in one click via ElevenLabs — describe the space ("cathedral stone hall", "tile bathroom 3 m × 2 m") and receive a ready-to-use IR without leaving Omni
- Wet/dry mix and pre-gain with 5 ms smoothing — no zipper noise on live adjustments
- Reverb FX panel now has Algorithmic | Convolution tabs — switch between FDN and convolution on the same FX slot without re-inserting
- IR files organised in a dedicated ElevenLabs browser tab alongside TTS audio, with waveform display and drag-to-insert
- UI freeze fix: partition block size raised from 128 to 512 — large IRs no longer stall the UI thread on load
🔁 Delay — Multi-Tap and LCR Modes
Two new delay architectures added, bringing the total to four modes selectable via tabs: Standard / BBD Analog / Multi-Tap / LCR.
Multi-Tap — Roland Space Echo Style
- Four independent read pointers on one shared delay line
- Per-tap time and level controls (8 parameters total)
- Hermite interpolation on all taps; shared feedback from tap 4 through an LP filter
LCR — Korg Triton / Wavestation Style
- Three taps on a shared mono delay line: Left, Center, Right
- Left tap → L output only; Right tap → R output only; Center → both channels at configurable level (−3 dB default)
- Feedback on Center tap only, through independent HP and LP Butterworth filters — each individually bypassable
- Denormal guards on LP and HP states; periodic flush every 64 samples (Layer 3 protection)
- Tap visualiser updated for all four modes with L/C/R bar labels
🔌 CLAP Multi-Output Aux Bus Routing
CLAP plugins with multiple audio output buses (drum separators, multi-stem instruments, vocoders) can now route each aux output independently to any track in the mixer.
- Audio Input row in the mixer shows Own Plugin / <Track>/Main / <Track>/Aux N for each CLAP track
- Aux output buffering in Phase 1.05 of the MixBus pipeline copies the selected bus into the receiver track's input before processing begins
- UUID-based track ID matching ensures source resolution survives project reload without UUID mismatch
- Persistent aux routing survives project save/load; project format is backward-compatible
⚙️ RT-Safety & DSP Quality Overhaul — 8 Categories
A systematic audit of the audio thread eliminated eight classes of violations. Every fix verified against AGENTS.md real-time rules:
- Saturator oversampling: upgraded from 2× to 4× cascaded half-band oversampling in Fold mode (required for wavefolder per §2.3 — extreme harmonic generation).
ParamSmootheradded on drive, output, and mix (5 ms, linear domain) - Compressor precision: f64 arithmetic for attack/release/slow-release coefficient computation; inline
ParamSmootheron makeup gain (10 ms). Prevents catastrophic cancellation at long time constants - RtTask graph pre-allocation:
RtTaskis nowCopy + Clone;execute()takes&[RtTask]from a pre-allocated scratch Vec inAudioGraph. The old per-callbacktasks_to_runVec allocation is eliminated - FX automation sub-block evaluation: 4 sub-blocks per buffer with correct
sample_offsetper event — sample-accurate automation even at large buffer sizes - Heap elimination from FX automation pipeline: remaining heap allocations in the parameter automation path replaced with pre-allocated capacity and
debug_assertguards - Automation stop handler: uses
set_param_direct()instead ofget/set_params()round-trip — zero allocation - pending_note_previews capacity: raised 16 → 4096;
debug_assertinprepare_buffersprevents silent overflow - FxEffect trait: default
set_param_direct()added — avoids theget/set_paramsround-trip for single-parameter updates
🔇 Engine Idle Fast-Path — Near-Zero CPU at Rest
Three layered optimisations reduce idle CPU from ~3% to near-zero at 48 kHz / 512-frame buffer:
- LUFS guard:
ebur128processing is skipped entirely on silence — no unnecessary FFT work when stopped - MixBus idle return: when no tracks are active and transport is stopped,
mix_bus.process()writes zeros and returns immediately — skipping TPDF dither LCG, soft-clip SIMD, peak/RMS scan, scope tap push, and 4 KB memcpy - Engine-level idle fast-path: before
prepare_buffers, iftrack_count == 0and transport is stopped and the post-stop fade tail is fully drained, the entire callback writes silence to the device buffer and returns — skipping solo/mute setup, arrangement rendering, and the mix bus pipeline entirely
📡 Log-Domain Modulation for Frequency Parameters
LFO and sequencer modulation on frequency and ratio parameters now operates in the logarithmic (octave) domain:
- Previous behaviour: linear addition caused the LFO to appear to cut out or click near zero when sweeping downward — the linear value approached zero and produced silence or a discontinuity
- Fixed: modulation is applied as
freq × 2^(mod_value)— musically correct octave sweeping with no audible artefact at any point in the sweep - Applied consistently at all FX automation apply sites
🎵 LFO Multi-Target Routing — Bass Synth & PolySynth
LFO outputs can now be routed to multiple destinations simultaneously via bitmask selection:
- Toggle buttons in the LFO UI select any combination of targets: Pitch, Filter Cutoff, Amplitude, Pan, Resonance, etc.
- Bitmask serialised to the project file; backward-compatible default (single target = previous behaviour)
- Randomizer updated to emit correct
TGT_*bitmask values
🎸 Guitar Synth
Guitar synth physical model updated with improved string and body resonance accuracy, and a revised project format for guitar tracks.
🤖 ElevenLabs Lektor — TTS in Create Sound Modal
The Create Sound modal gains a Lektor (TTS) tab for generating speech and vocal textures:
- Voice picker and model picker from the full ElevenLabs catalogue
- Voice settings sliders: stability, similarity, style
- Format selector and full text input area
- Generated audio saved to disk and listed in the ElevenLabs browser tab with voice name and text preview
- ScratchDeck: new ✨ Create button opens the modal and loads the result directly into the deck — generate a vocal sample and scratch with it immediately
🔌 Plugin FX Parameters Exposed to Modulation Routing
VST3 and CLAP plugins inserted in track FX chains, return buses, and the master bus now correctly expose all their parameters to the modulation routing picker:
GetReturnAutomableParamsandGetMasterAutomableParamsengine commands enumerate plugin params from return and master FX chains- CLAP and VST3
FxEffectwrappers implementplugin_param_count,plugin_param_name,plugin_param_range, andget_param_direct - Previously only browser drag-and-drop added plugins with parameter visibility; now every add path (mixer strip menu, device tab, return/master insert) works correctly
🐛 Bug Fixes & Polish
- VST3 parameter persistence:
outputParameterChangesis now drained after eachprocess()call and written toparam_cache— prevents plugin GUI edits (e.g. nih-plug checkboxes, toggle buttons) from being reverted by subsequent automation or modulation base-restores - VST3 FX silence: fixed a regression where VST3 plugins used as FX inserts silenced the entire channel
- CLAP
gui.showretry: up to 3 retries with 50 ms delay for JUCE plugins that require a delay afterset_parentbefore acceptingshow— fixes spurious "attach failed" in logs - VST3
setParamNormalizedremoved fromset_param: prevents the native plugin GUI from reverting displayed values when automation or modulation restores a parameter - Windows console window hidden:
#![windows_subsystem = "windows"]applied — no terminal popup on launch - TOMNIC step count knob: pill-background knob with integer snapping (1 step = 8 px drag), live popup during drag, permanent tooltip
- TOMNIC
pattern_changedguard: fixed crash whenactive_clipisNone - Sampler slice mode: note input now restricted to slice notes when Slice mode is active — prevents accidental off-pitch triggers
- 817/817 engine tests passing
Omni is actively developed — the next update is coming soon. 🚀
Convolution Reverb with AI IRs or the new delay modes — what gets loaded into your FX chain first? Let us know.
