← Projects
Linked VU Meter

Linked VU Meter

A JUCE-based audio plugin that creates linked VU meters across tracks with real-time level visualization with inter-instance communication, built as a VST3 plugin and standalone app.

C++JUCECMakeVST3

A JUCE-based audio plugin that creates linked VU meters across tracks with real-time level visualization with inter-instance communication, built as a VST3 plugin and standalone app.

C++JUCECMakeVST3

Linked VU Meter Logo

Linked VU Meter

A VST3 audio plugin that creates linked VU (Volume Unit) meters across multiple tracks in your DAW. Drop an instance on each track, and they talk to each other. giving you a unified, real-time view of your audio levels.

The Problem

When mixing in a DAW, you’re constantly checking levels across dozens of tracks. Most DAWs give you tiny, inconsistent meters buried in the mixer. If you want a proper VU meter. the kind that actually shows you how loud something feels, not just peaks. you’re stuck with single-instance plugins that don’t talk to each other.

I wanted linked meters. One plugin instance per track, all aware of each other, all visible in a single glanceable interface.

Architecture

graph TB
    subgraph DAW["DAW Host (Reaper, Logic, etc.)"]
        T1[Track 1<br/>VURelay Instance]
        T2[Track 2<br/>VURelay Instance]
        T3[Track N<br/>VURelay Instance]
    end

    subgraph Plugin["Plugin Internals"]
        RP[RelayProcessor<br/>Audio Analysis]
        RE[RelayEditor<br/>GUI Host]
        VC[VUComponent<br/>Meter Display]
        PIR[PluginInstanceRegistry<br/>Shared State]
    end

    T1 --> RP
    T2 --> RP
    T3 --> RP
    RP --> PIR
    PIR --> RE
    RE --> VC

How It Works

Audio processing flow:

  1. Each plugin instance receives audio from its track via the DAW host
  2. RelayProcessor calculates both peak and RMS levels from the audio buffer
  3. Level data is published to the PluginInstanceRegistry. a shared singleton that all instances can read from
  4. The VUComponent renders a classic needle/gauge display with real-time animation and peak hold indicators

Inter-instance communication: The key trick is PluginInstanceRegistry. a shared-memory registry that all plugin instances within the same DAW session can access. When a new instance loads, it registers itself. When it unloads, it deregisters. Every instance can read every other instance’s levels in real-time with no serialization overhead.

Key Features

  • Linked metering. Multiple instances share state automatically. No configuration, no routing, no MIDI.
  • Peak + RMS display. Shows both instantaneous peaks and the RMS level that represents perceived loudness.
  • Classic VU aesthetic. Needle/gauge display with peak hold indicators, not just boring bar graphs.
  • Cross-platform. Builds for macOS, Windows, and Linux. Works in any VST3 host.
  • Zero-config. Drop it on a track and it works. Instances find each other automatically.

What I Learned

  • Real-time audio constraints are humbling. You can’t allocate memory, you can’t lock mutexes, you can’t do I/O. all the things you take for granted in normal programming are off-limits in the audio callback.
  • Plugin lifecycle is tricky. DAWs create, destroy, suspend, and resume plugin instances in unpredictable ways. The registry had to handle all of these gracefully without leaking references or causing crashes on teardown.
  • JUCE is incredible but opinionated. The framework does a lot of heavy lifting, but you have to think the JUCE way.