Making Exciter velocity sensitivity adjustable took an hour, then making the 3D animations track fully modulated loudness ate the rest of the day.
Evan Mezeske
Jul 2024
Fixed the clanking when raising the voice instance slider (init state wasn't stored per-instance) and added MIDI note off velocity as a modulation source.
Voice stealing now prefers released notes, which made MPE playable when holding a root note under a melody. Lots of polyphony GUI details cleaned up too.
Plugged in the ROLI Seaboard and MPE just worked, two notes bending in opposite directions. Also switched the new website from App Engine to Cloud Run.
MPE is implemented, including storing per-channel pitch, pressure, and CC74 between notes. Untested since my Seaboard came without the right USB cable.
Spent the day on a new website in Python, FastAPI, and NiceGUI on App Engine, and landed on a three word tagline for Anukari, 3D Physics Synthesizer.
MPE zones, channel counts, and pitch bend ranges are in the data model now, and the global pitch wheel bends any preset via time dilation.
With polyphony working well, I'm starting on MPE support ahead of my ROLI Seaboard's arrival, including the annoying MCM zone auto-configuration messages.
Voice instancing works and it's better than I hoped. Time dilation retunes a full physics sim per note, and parallel GPU voices add zero slowdown.
Reworking the data model so MIDI and modulation state can be stored per voice instance, groundwork that MPE support will build on directly.
Anukari's standalone build is now fully usable on MacOS, with the GUI, MIDI input, audio output, and hotkeys working after a morning of small bug fixes.
Jun 2024
Golden tests now compare audio via chunked FFTs and L2 distance, which surfaced an OpenCL bug on Mac where objects can legally live at address NULL.
Two voice instances now run in parallel GPU work groups and pass the golden tests. Links stay shared in memory, so only mutable entities duplicate.
May 2024
Most of the CPU-side refactor for the new voice instancing memory layout is done, with golden tests catching every break in the CPU-to-GPU data reshuffle.
Copy and paste handles link and MIDI route edge cases now, backed by a fuzz test that pastes random entity subsets 10,000 times and checks invariants.
Host automation is finished, with golden tests that map MIDI CCs onto automation lanes, plus a nasty subscriptions bug fix for stale undo state.
DAW automation works via 32 fixed parameter slots that modulators bind to, the only mapping that stays stable since DAWs can't add params dynamically.
The modulator link editor now looks up per-parameter ranges, units, and exponential scaling, and handles bulk edits of mismatched links.
Apr 2024
New exponential and multiplicative modulation modes make the MIDI note follower play in tune and also unlock audio-rate FM synthesis.
A rare debug build flagged seven crash bugs, including an unordered_set passed to std set_symmetric_difference that MSVC's checked STL caught at runtime.
I think I can get easy polyphony by running virtual instances of the physics model and using time dilation to pitch each note from one system.
MIDI routes can now use wildcard any values for channel and note, which fixes quirky controllers today and lays the routing groundwork MPE mode will need.
Anukari now handles every MIDI message type, including poly pressure, which Ableton's MIDI export silently drops. Next up is the mess that is MPE.
Finding the abstraction that lets modulator sub-types like LFOs and envelopes share GUI editor code, ahead of a batch of new MIDI types.
MIDI routing is done, with a MidiRoutable interface that lets entities subscribe to note, CC, pitch, and pressure events by ID.
The data model refactor is done, but model.h still triggers huge recompiles, and a pimpl fix ran aground on {fmt} formatters needing complete types.
I replaced the data model's macro hacks with CRTP templates across 15k lines. Golden and fuzz tests made the refactor safe before MIDI routing work.
A JUCE crash I patched upstream, then flaky GUI tests that only failed when I alt-tabbed away, since some JUCE code cares whether the window is foreground.
Mar 2024
MIDI note envelopes came together in a day, then Ableton and Anukari disagreed about middle C. C3 vs C4 vs C5 varies by vendor, so I went with C3.
LFO retriggering now works via the generalized MIDI note routing, and unit tests caught a dangling route left behind by deleted LFOs.
Despite a cluster headache, the MIDI note picker works, and note routing is being generalized from hard-coded Exciters to any entity for LFO retrigger.
Building a general MIDI note picker with a live piano keyboard and a learn button, fed by an SPSC queue moving MIDI off the audio thread without blocking.
While building a golden test for the tempo-synced LFO I caught a MIDI bug where note off and on in the same audio block always ran as on then off.
Tempo-synced LFOs were easy since JUCE hands over the DAW's BPM. The fun part was beat subdivision with triplets, solved by a plain switch statement.
All 65 golden tests covering the physics engine are done, bringing the suite to 249 cases, with a GUI chaos monkey planned as the next testing push.
Golden tests now render a preset and MIDI clip to audio and diff against a verified .flac, so optimizations and GPU ports can't silently break the sound.
Fixed a bug where MIDI note off events were missed with the plugin GUI hidden, because GUI flow control froze the simulation timestamp.
Feb 2024
New UX explains dependent GPU memory limits, so maxing out masses visibly cuts your microphone budget instead of failing mysteriously.
Dec 2023
Modulation values now reach the GUI, so a mic driven by two LFOs visibly circles in the 3D view. CPU-latched parameters like mallet hardness work too.
A free-running LFO now computes on the GPU, but its stateless design means the value never lands in memory, so GUI animation needs a per-block write-back.
Modulators can now modulate springs on the GPU, including modulators modulating other modulators. Basic LFOs and a demo video come next.
GUI work for linking modulators to springs and to other modulators is done, and one MIDI CC knob modulating another now simulates correctly.
MIDI control modulators now render as spinning 3D knobs, and I applied an ADC trick using arch-specific pause instructions in the spin-loop sync code.
Nov 2023
Modulation now covers sensors and exciters, and I'm weighing one flat layer of modulator recursion since GPUs can't do real recursion.
Modulators are becoming their own 3D entities with routing stored on links, plus a JUCE crash fix upstream and more polish on my ADC23 slides.
Oct 2023
The Audio Units logo and the Audio Units symbol are trademarks of Apple Computer, Inc.
VST is a trademark of Steinberg Media Technologies GmbH, registered in Europe and other countries.