← Back to all projects

Case Study — Lymel Audio Plugins

Lymel Audio Plugins

Built real-time-safe audio plugins in C++17/JUCE from scratch — VST3/AU/Standalone, lock-free audio threading with a zero-allocation steady state, and 100% clean Apple auval validation.

At a glance

Role
Audio Software Engineer · 2026 — Present
What
Cross-Platform C++/JUCE Audio Plugins (VST3 / AU)
Did
Architected and shipped cross-platform audio plugins from scratch — real-time-safe, zero-allocation audio thread, 100% clean auval.
Stack
C++17JUCE 8VST3 / AUReal-Time DSPLock-Free AudioCMake

Problem

Audio plugins run on a hard real-time thread: the host calls your code hundreds of times a second, and a single missed deadline — a lock, a malloc, a page fault — produces an audible click. Most hobby plugins ignore this and glitch under load. I wanted to ship plugins that hold up under professional use, in DAWs that validate strictly.


My Role

Sole engineer — DSP, plugin architecture, build/packaging, and the per-release QA process. Everything from the audio thread to the installer.


Process

  1. 1

    Built a fantasy bell / FM synthesizer (VST3/AU/Standalone) in C++17 on JUCE 8 from scratch — designing the signal path, parameter system, and UI.

  2. 2

    Made the audio thread real-time-safe: lock-free parameter handoff and a zero-allocation steady state so no audio callback ever blocks or allocates. Passed 100% of Apple's auval validation.

  3. 3

    Shipped a second plugin — an early-reflections reverb — with versioned preset state and bit-exact state recall, so a saved session reopens identically across plugin versions.

  4. 4

    Set up a per-release QA gate enforced on every change: clean auval, bit-exact state round-trip, and cross-format (VST3/AU/Standalone) checks before anything ships.


Outcome

Two cross-platform plugins shipped, both passing strict host validation, with a repeatable release process that guards against audio-thread regressions and preset-compatibility breaks.


Stack

C++17JUCE 8VST3 / AUReal-Time DSPLock-Free AudioCMake

What I Learned

Real-time systems change how you write code — you optimize for worst-case latency, not average throughput, and 'it works on my machine' isn't a bar when a 2 ms stall is audible. The discipline of a no-allocation, no-lock hot path carries over to any latency-sensitive system, not just audio.