ToooT 2.0.1 — UX, audio engine, mastering
Eleven days after v2.0.0; the changes since are substantial. Highlights:
- Arrangement engine consumption — the linear-arrangement timeline now actually drives audio. Previously the model + view shipped but the engine kept playing the pattern grid; pressing play on a populated arrangement is finally audible.
- Linear-phase EQ in the master chain — 10 log-spaced bands (31 Hz – 16 kHz), 4096-point overlap-save FFT convolution. Master order: EQ → stereo widen → reverb → safety limiter.
- AUv3 plugin parameter automation — every loaded plugin's parameter tree is auto-registered; lanes targeting
plugin.<channel>.<slot>.<address>write through at UI tick rate. - Render-path automation expanded —
tempo.bpmjoined the audio-thread evaluator. Markers + time signatures persist in.mad. - Recording take lanes —
replace / overdub / loopmodes; per-channel take stacks for comping. - Spatial audio editor rebuilt — replaces the Metal mesh-shader pipeline (which rendered as a black screen on base M1 hardware) with a proper SwiftUI Canvas top-down view.
- Three-pane Automation editor — sidebar of every target, gridded canvas with bar lines, point inspector with curve picker. Replaces the previous single-line jumbled view.
- Generative panel rebuild — 8 generators (was 4 buttons), style picker (Techno / DnB / Ambient / Hip-Hop / Jazz / Breakbeat), 12 keys, 8 scales, intensity + complexity sliders that actually drive density.
- Synthesis tier rename — Carbon → Studio, Biological → Organic, Xenomorph → Generative. With descriptions per tier so users know what they're picking.
- AppIntents (Shortcuts.app) — Open Project / Open Last Autosave / New Project.
- Cold-launch perf —
AUv3HostManager.discoverPluginsAsync()runs on a detached Task; the 1–3 s plugin scan no longer blocks app launch.
Two real bug fixes
renderOfflineConcurrenthad a scratch-slot collision (idx % 8aliasing meant two voices could collide on the same buffer from different threads) — produced max abs diff 0.054 vs serial. Fixed: one slot per voice (voiceThreadSlots = kMaxChannels). Material because v2.0.1'sexportAudioruns through the concurrent path.- Snapshot deallocation queues were undersized at 64/128 entries;
pushsilently dropped on full, leaking retained snapshots. UAT 55 demonstrated 436/500 leaking under stress. Bumped both to 2048.
Quality
- UAT: 271 assertions, 0 failures.
- StressRunner: 11 scenarios, 0 failures. "Concurrent vs serial render parity" passes; memory drift over 1000 cycles = +0.00 MB.
- Zero build warnings.
Installation
brew tap mstits/tooot
brew install --cask tooot
Or download ToooT-2.0.1.dmg below and drag to Applications. macOS 14+, Apple Silicon.
Full changelog
See CHANGELOG.md for the line-by-line diff.