Skip to content

๐Ÿ“Š AudioLab Routing Overview - Complete Visual Guide

Purpose: Ultra-clear visual diagrams showing every step of audio flow from code to speakers. Target Audience: New developers confused by audio routing complexity. Last Updated: 2025-10-03


๐Ÿ“‘ Table of Contents

  1. Complete Audio Flow
  2. Development Testing Routing
  3. Latency Breakdown
  4. Multi-DAW Testing Setup
  5. Compatibility Matrix

๐Ÿ“Š DIAGRAM 1: COMPLETE AUDIO FLOW

Visual Overview

๐ŸŽน MIDI INPUT                                           ๐ŸŽง AUDIO OUTPUT
Controller/Keyboard                                     Studio Monitors
โ”‚                                                       โ–ฒ
โ”‚ USB/MIDI DIN                                         โ”‚ XLR/TRS
โ”‚                                                       โ”‚
โ–ผ                                                       โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         DAW HOST                โ”‚                   โ”‚   AUDIO INTERFACE    โ”‚
โ”‚         (Reaper/Cubase/Live)    โ”‚                   โ”‚   RME/UA/Focusrite   โ”‚
โ”‚                                 โ”‚                   โ”‚                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚                   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚   Plugin Slot #1          โ”‚  โ”‚                   โ”‚  โ”‚  ASIO Driver   โ”‚  โ”‚
โ”‚  โ”‚                           โ”‚  โ”‚                   โ”‚  โ”‚  (Windows)     โ”‚  โ”‚
โ”‚  โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚  โ”‚                   โ”‚  โ”‚                โ”‚  โ”‚
โ”‚  โ”‚   โ”‚   AudioLab      โ”‚     โ”‚  โ”‚   Processed       โ”‚  โ”‚  CoreAudio     โ”‚  โ”‚
โ”‚  โ”‚   โ”‚   Plugin        โ”‚     โ”‚  โ”‚โ”€โ”€Audio Bufferโ”€โ”€โ”€โ”€โ–บโ”‚  โ”‚  (macOS)       โ”‚  โ”‚
โ”‚  โ”‚   โ”‚   (VST3/AU)     โ”‚     โ”‚  โ”‚   44.1/48kHz      โ”‚  โ”‚                โ”‚  โ”‚
โ”‚  โ”‚   โ”‚                 โ”‚     โ”‚  โ”‚   64-512 samples  โ”‚  โ”‚  Buffer Size:  โ”‚  โ”‚
โ”‚  โ”‚   โ”‚  processBlock() โ”‚     โ”‚  โ”‚                   โ”‚  โ”‚  128 samples   โ”‚  โ”‚
โ”‚  โ”‚   โ”‚        โ†“        โ”‚     โ”‚  โ”‚                   โ”‚  โ”‚                โ”‚  โ”‚
โ”‚  โ”‚   โ”‚   DSP Chain     โ”‚     โ”‚  โ”‚                   โ”‚  โ”‚  Latency:      โ”‚  โ”‚
โ”‚  โ”‚   โ”‚        โ†“        โ”‚     โ”‚  โ”‚                   โ”‚  โ”‚  ~3ms          โ”‚  โ”‚
โ”‚  โ”‚   โ”‚   Output Mix    โ”‚     โ”‚  โ”‚                   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚  โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚  โ”‚                   โ”‚           โ”‚          โ”‚
โ”‚  โ”‚                           โ”‚  โ”‚                   โ”‚           โ–ผ          โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚                   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚                                 โ”‚                   โ”‚  โ”‚  D/A Converter โ”‚  โ”‚
โ”‚  Host Features:                 โ”‚                   โ”‚  โ”‚  24-bit/192kHz โ”‚  โ”‚
โ”‚  โ€ข Real-time thread priority    โ”‚                   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚  โ€ข Buffer management            โ”‚                   โ”‚           โ”‚          โ”‚
โ”‚  โ€ข Latency compensation         โ”‚                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚  โ€ข Parameter automation         โ”‚                               โ”‚
โ”‚  โ€ข State save/recall            โ”‚                               โ–ผ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                        Analog Output
                                                                  โ”‚
                                                                  โ–ผ
                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       [๐Ÿ”Š Speakers]
                  โ”‚  VIRTUAL ROUTING (Dev/Testing)  โ”‚
                  โ”‚  โ€ข VoiceMeeter Banana           โ”‚
                  โ”‚  โ€ข Audio Hijack (macOS)         โ”‚
                  โ”‚  โ€ข JACK Audio (Linux)           โ”‚
                  โ”‚  โ€ข Loopback (macOS)             โ”‚
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Component Details

๐ŸŽน MIDI INPUT

  • Types Supported:
  • USB MIDI controllers (Akai, Novation, Arturia)
  • Traditional MIDI DIN (via interface)
  • Virtual MIDI ports (loopMIDI, IAC Driver)
  • DAW internal MIDI routing

  • Typical Latency: <1ms

  • USB MIDI: 0.5-1ms
  • DIN MIDI: 1-2ms (physical cable overhead)
  • Virtual: <0.1ms (software only)

  • Message Format:

    Note On:  0x90 [note] [velocity]
    Note Off: 0x80 [note] [velocity]
    CC:       0xB0 [controller] [value]
    Program:  0xC0 [program number]
    

  • DAW Configuration:

  • Input device selection: Preferences โ†’ MIDI Devices
  • Channel routing: Track input selector
  • MIDI learn: Right-click parameter โ†’ Learn

๐Ÿ–ฅ๏ธ DAW HOST

Role: Audio engine and plugin host container

Buffer Management: | Buffer Size | Latency @ 48kHz | Use Case | |-------------|-----------------|----------| | 64 samples | ~1.3ms | Live performance, low CPU | | 128 samples | ~2.7ms | Recording, balanced | | 256 samples | ~5.3ms | Mixing, more plugins | | 512 samples | ~10.7ms | Mastering, maximum stability |

Sample Rate Options: - 44.1kHz: CD quality, standard - 48kHz: Video standard, pro audio default - 96kHz: High-resolution, double processing cost - 192kHz: Mastering grade, 4ร— processing cost

Thread Model:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  GUI Thread (60Hz updates)          โ”‚  โ† Parameter changes
โ”‚  - Meter drawing                    โ”‚  โ† Visual feedback
โ”‚  - User interaction                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚ Message Queue
               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Audio Thread (Real-time)           โ”‚  โ† HIGHEST PRIORITY
โ”‚  - processBlock() calls             โ”‚  โ† NO memory allocation
โ”‚  - Buffer processing                โ”‚  โ† NO disk I/O
โ”‚  - Plugin chain execution           โ”‚  โ† Lock-free atomics only
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Critical Rules: - โš ๏ธ NEVER allocate memory in audio thread - โš ๏ธ NEVER use mutexes/locks in audio thread - โš ๏ธ NEVER call file I/O in audio thread - โœ… DO use lock-free FIFOs for inter-thread communication - โœ… DO pre-allocate all buffers in constructor


๐Ÿ”Œ PLUGIN (AudioLab)

Format Support:

VST3 (Steinberg)
โ”œโ”€ Windows: .vst3 bundle
โ”œโ”€ macOS: .vst3 bundle
โ””โ”€ Linux: .vst3 bundle

AU (Apple)
โ””โ”€ macOS only: .component bundle

AAX (Avid)
โ”œโ”€ Windows: .aaxplugin
โ””โ”€ macOS: .aaxplugin

Processing Modes: | Mode | Input | Output | Use Case | |------|-------|--------|----------| | Mono | 1 | 1 | Vocal processing, bass | | Stereo | 2 | 2 | Mix bus, mastering | | Monoโ†’Stereo | 1 | 2 | Reverb, stereo widener | | Surround 5.1 | 6 | 6 | Film mixing |

Latency Compensation:

// In your AudioProcessor constructor or prepareToPlay:
void MyProcessor::prepareToPlay(double sampleRate, int samplesPerBlock) {
    // Calculate fixed latency (e.g., FFT lookahead)
    int fftLatency = fftSize / 2;  // 2048 / 2 = 1024 samples

    // Report to host for automatic delay compensation
    setLatencySamples(fftLatency);
}

Parameter Automation (Thread-Safe):

// CORRECT: Atomic parameter access
void MyProcessor::processBlock(AudioBuffer<float>& buffer, MidiBuffer&) {
    // Load atomic value ONCE per block
    float gain = gainParameter->load();

    // Use local copy for processing
    for (int ch = 0; ch < buffer.getNumChannels(); ++ch) {
        buffer.applyGain(ch, 0, buffer.getNumSamples(), gain);
    }
}

// WRONG: Repeated atomic loads (slow)
for (int sample = 0; sample < numSamples; ++sample) {
    float val = buffer.getSample(ch, sample);
    val *= gainParameter->load();  // โŒ Atomic load every sample!
    buffer.setSample(ch, sample, val);
}


๐ŸŽš๏ธ AUDIO INTERFACE

Driver Models:

Platform Driver Latency Pros Cons
Windows ASIO 2-5ms Professional standard Exclusive mode
WDM/MME 50-200ms Universal Unusable for music
WASAPI 10-30ms Modern Limited DAW support
macOS CoreAudio 3-8ms Built-in, stable Less control than ASIO
Linux JACK 2-10ms Flexible routing Configuration complex
ALSA 5-20ms Direct hardware Limited features

Popular Interfaces - Latency Performance:

๐Ÿ† BEST (2-3ms round-trip @ 64 samples):
   โ€ข RME Babyface Pro FS
   โ€ข Universal Audio Apollo Twin
   โ€ข Antelope Audio Discrete

โœ… EXCELLENT (3-5ms @ 128 samples):
   โ€ข Focusrite Clarett
   โ€ข PreSonus Quantum
   โ€ข MOTU M4

โš ๏ธ GOOD (5-8ms @ 256 samples):
   โ€ข Focusrite Scarlett (3rd gen)
   โ€ข Audient iD4
   โ€ข SSL 2+

โŒ AVOID for pro work:
   โ€ข Built-in laptop audio (100-300ms)
   โ€ข Cheap USB dongles (50-150ms)
   โ€ข Bluetooth audio (150-500ms + dropouts)

Round-Trip Latency Calculation:

RTL = (Buffer Size / Sample Rate) ร— 2 + Driver Overhead

Example @ 48kHz, 128 buffer, RME interface:
RTL = (128 / 48000) ร— 2 + 0.001
RTL = 0.00533 + 0.001
RTL = 6.33ms โœ… Excellent for live monitoring


๐Ÿ“Š DIAGRAM 2: DEVELOPMENT TESTING ROUTING

Scenario: Testing plugin while developing with A/B reference comparison

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                       DEVELOPMENT WORKSTATION                                 โ”‚
โ”‚                                                                               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”‚
โ”‚  โ”‚      DAW #1 (Reaper)    โ”‚           โ”‚   DAW #2 (Cubase)       โ”‚           โ”‚
โ”‚  โ”‚    Development DAW      โ”‚           โ”‚   Reference DAW         โ”‚           โ”‚
โ”‚  โ”‚                         โ”‚           โ”‚                         โ”‚           โ”‚
โ”‚  โ”‚  Track 1: Test Signal   โ”‚           โ”‚  Track 1: Same Signal   โ”‚           โ”‚
โ”‚  โ”‚  โ”œโ”€ White Noise         โ”‚           โ”‚  โ”œโ”€ White Noise         โ”‚           โ”‚
โ”‚  โ”‚  โ”œโ”€ Sine Sweep          โ”‚           โ”‚  โ”œโ”€ Sine Sweep          โ”‚           โ”‚
โ”‚  โ”‚  โ””โ”€ Music Loop          โ”‚           โ”‚  โ””โ”€ Music Loop          โ”‚           โ”‚
โ”‚  โ”‚         โ”‚               โ”‚           โ”‚         โ”‚               โ”‚           โ”‚
โ”‚  โ”‚         โ–ผ               โ”‚           โ”‚         โ–ผ               โ”‚           โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚           โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚           โ”‚
โ”‚  โ”‚  โ”‚  AudioLab Plugin โ”‚   โ”‚           โ”‚  โ”‚  FabFilter Pro-Q โ”‚   โ”‚           โ”‚
โ”‚  โ”‚  โ”‚  (DEV BUILD)     โ”‚   โ”‚           โ”‚  โ”‚  (Reference)     โ”‚   โ”‚           โ”‚
โ”‚  โ”‚  โ”‚  ๐Ÿ”ด TESTING      โ”‚   โ”‚           โ”‚  โ”‚  โœ… KNOWN GOOD   โ”‚   โ”‚           โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚           โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚           โ”‚
โ”‚  โ”‚           โ”‚               โ”‚           โ”‚           โ”‚               โ”‚           โ”‚
โ”‚  โ”‚           โ”‚ Output        โ”‚           โ”‚           โ”‚ Output        โ”‚           โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ”‚
โ”‚              โ”‚                                       โ”‚                           โ”‚
โ”‚              โ”‚                                       โ”‚                           โ”‚
โ”‚              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                           โ”‚
โ”‚                              โ”‚                                                   โ”‚
โ”‚                              โ–ผ                                                   โ”‚
โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                           โ”‚
โ”‚              โ”‚      VIRTUAL CABLES (VoiceMeeter)     โ”‚                           โ”‚
โ”‚              โ”‚                                       โ”‚                           โ”‚
โ”‚              โ”‚  ๐Ÿ”ด BUS A: Development Plugin         โ”‚                           โ”‚
โ”‚              โ”‚     โ””โ”€ Routable to analyzers          โ”‚                           โ”‚
โ”‚              โ”‚                                       โ”‚                           โ”‚
โ”‚              โ”‚  ๐Ÿ”ต BUS B: Reference Plugin           โ”‚                           โ”‚
โ”‚              โ”‚     โ””โ”€ Routable to analyzers          โ”‚                           โ”‚
โ”‚              โ”‚                                       โ”‚                           โ”‚
โ”‚              โ”‚  ๐ŸŸข BUS C: Monitor Mix                โ”‚                           โ”‚
โ”‚              โ”‚     โ””โ”€ A/B switch: BUS A โ†” BUS B     โ”‚                           โ”‚
โ”‚              โ”‚     โ””โ”€ Output to physical interface   โ”‚                           โ”‚
โ”‚              โ”‚                                       โ”‚                           โ”‚
โ”‚              โ”‚  Controls:                            โ”‚                           โ”‚
โ”‚              โ”‚  โ€ข Instant A/B toggle (hotkey: F1)    โ”‚                           โ”‚
โ”‚              โ”‚  โ€ข Volume match (critical!)           โ”‚                           โ”‚
โ”‚              โ”‚  โ€ข Polarity invert for null testing   โ”‚                           โ”‚
โ”‚              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                           โ”‚
โ”‚                         โ”‚                                                       โ”‚
โ”‚                         โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”‚
โ”‚                         โ–ผ                  โ–ผ                    โ–ผ               โ”‚
โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚
โ”‚              โ”‚  Spectrum       โ”‚  โ”‚  Phase Scope    โ”‚  โ”‚ Level Meters โ”‚        โ”‚
โ”‚              โ”‚  Analyzer       โ”‚  โ”‚  (Correlation)  โ”‚  โ”‚  (LUFS/Peak) โ”‚        โ”‚
โ”‚              โ”‚  - Voxengo SPAN โ”‚  โ”‚  - s(M)exoscope โ”‚  โ”‚  - dpMeter   โ”‚        โ”‚
โ”‚              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚
โ”‚                                                                                 โ”‚
โ”‚                         โ–ผ                                                       โ”‚
โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                        โ”‚
โ”‚              โ”‚     PHYSICAL AUDIO INTERFACE            โ”‚                        โ”‚
โ”‚              โ”‚     (RME Babyface Pro)                  โ”‚                        โ”‚
โ”‚              โ”‚                                         โ”‚                        โ”‚
โ”‚              โ”‚  Outputs:                               โ”‚                        โ”‚
โ”‚              โ”‚  โ€ข Main L/R โ†’ Studio Monitors           โ”‚                        โ”‚
โ”‚              โ”‚  โ€ข Headphones โ†’ Detailed listening      โ”‚                        โ”‚
โ”‚              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Bus Configuration Details

๐Ÿ”ด BUS A: Development Plugin Output

Purpose: Route audio from your in-development plugin

Connection:

Reaper Track Output
  โ†’ VoiceMeeter VAIO Input 1
  โ†’ VoiceMeeter BUS A
  โ†’ Routable to any destination

Use Cases: - Real-time frequency analysis - Phase correlation checking - LUFS/loudness monitoring - Null test against reference (inverted phase)

Hotkey Setup (Reaper):

Actions โ†’ Show action list โ†’ Search "Track: Toggle mute for track 01"
Assign: F1 (for instant A/B switching)


๐Ÿ”ต BUS B: Reference Plugin Output

Purpose: Known-good commercial plugin for comparison

Selection Criteria:

Good References:
โœ… FabFilter Pro-Q 3    (EQ reference)
โœ… Valhalla VintageVerb (Reverb reference)
โœ… Soundtoys Decapitator (Saturation reference)

Why these work:
โ€ข Industry-standard sound quality
โ€ข Predictable, well-documented behavior
โ€ข Active development (bug-free)

Matching Settings:

โš ๏ธ CRITICAL: Volume-match before comparing!

Steps:
1. Generate pink noise test signal
2. Measure RMS level of BUS A output โ†’ -18dBFS
3. Measure RMS level of BUS B output โ†’ -16dBFS
4. Adjust BUS B gain: -2dB to match
5. NOW compare (ears are VERY sensitive to level differences)


๐ŸŸข BUS C: Final Monitor Mix

Purpose: Switchable output to physical speakers

Routing Logic:

IF A/B Switch = Position A:
    BUS C Input โ† BUS A
ELSE:
    BUS C Input โ† BUS B

BUS C Output โ†’ Physical Interface Main Outs

Controls: - Volume: Master fader (pre-calibrated to -12dBFS = 85dB SPL) - Mute: Emergency silence (SPACE bar) - Solo: Isolate single bus - Polarity Invert: For null testing (if plugins match perfectly, output = silence)

Null Test Procedure:

1. Route identical signal to BUS A and BUS B
2. Set both plugins to IDENTICAL settings
3. Enable "Polarity Invert" on BUS B
4. Sum BUS A + BUS B โ†’ BUS C
5. RESULT:
   โ€ข Perfect null (silence) = plugins are IDENTICAL
   โ€ข Residual sound = differences exist (expected for analog modeling)


Analyzer Tools Configuration

๐Ÿ“Š Spectrum Analyzer (Voxengo SPAN)

Routing: Insert on BUS C (post-plugin, pre-speakers)

Settings:

FFT Size: 8192        # High resolution for low frequencies
Overlap: 4ร—           # Smooth display
Window: Blackman-Harris  # Accurate magnitude
Range: -120dB to 0dB  # Full dynamic range
Slope: Flat (0dB/oct) # Not A-weighted (see raw response)

What to Look For: - โœ… Smooth frequency response (no unexpected peaks/dips) - โœ… Low-frequency extension (how low before rolloff?) - โœ… High-frequency air (above 10kHz behavior) - โš ๏ธ Aliasing artifacts (unexpected content above Nyquist/2)


๐ŸŽฏ Phase Scope (s(M)exoscope)

Purpose: Detect stereo imaging issues

Routing: Stereo insert on BUS C

Interpretation:

Display Pattern:
โ”‚        Vertical line = MONO (L = R perfectly)
โ”‚       โ•ฑ Diagonal = Good stereo imaging
โ”‚      โ— Circle = Wide stereo (careful of phase issues)
โ”‚     โ•ณ X-pattern = OUT OF PHASE (will disappear in mono!)

Critical Checks: - Bass content (< 120Hz) should be MOSTLY mono - Mid-range can be wider - Extreme width = potential mono compatibility issues


๐Ÿ“ˆ Level Meters (dpMeter)

Routing: Post-fader on BUS C

Metrics:

Peak:    -6dBFS max (headroom for inter-sample peaks)
RMS:     -18dBFS average (mixing level)
LUFS-I:  -14 LUFS (streaming target)
Crest:   12-18dB (dynamic range indicator)

Warnings: - ๐Ÿ”ด Peak > -0.1dBFS: Clipping imminent! - ๐ŸŸก RMS > -6dBFS: Too loud, reduce gain - ๐ŸŸข LUFS-I = -14ยฑ1: Perfect for streaming


๐Ÿ“Š DIAGRAM 3: LATENCY BREAKDOWN

Complete Signal Path Timing

๐ŸŽน MIDI Note Pressed
โ”‚
โ”‚ โฑ๏ธ USB MIDI Latency: 0.5-1ms
โ”‚
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              DAW RECEIVES MIDI EVENT                โ”‚
โ”‚              Timestamp: Buffer-aligned               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚
               โ”‚ โฑ๏ธ Input Buffer Fill Time
               โ”‚    (Buffer Size / Sample Rate)
               โ”‚    128 samples @ 48kHz = 2.67ms
               โ”‚
               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚           PLUGIN processBlock() CALLED              โ”‚
โ”‚                                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚  Your DSP Processing                          โ”‚  โ”‚
โ”‚  โ”‚                                               โ”‚  โ”‚
โ”‚  โ”‚  Fixed Latency Sources:                       โ”‚  โ”‚
โ”‚  โ”‚  โ€ข FFT Lookahead:      1024 samples (21ms)   โ”‚  โ”‚
โ”‚  โ”‚  โ€ข Linear Phase EQ:    2048 samples (43ms)   โ”‚  โ”‚
โ”‚  โ”‚  โ€ข Reverb Pre-delay:   960 samples (20ms)    โ”‚  โ”‚
โ”‚  โ”‚                                               โ”‚  โ”‚
โ”‚  โ”‚  Variable Latency Sources:                    โ”‚  โ”‚
โ”‚  โ”‚  โ€ข Adaptive Algorithms: 0-500 samples        โ”‚  โ”‚
โ”‚  โ”‚  โ€ข Dynamic Oversampling: 64-256 samples      โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚
               โ”‚ โฑ๏ธ Plugin Processing: 0-50ms (algorithm-dependent)
               โ”‚
               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚          OUTPUT BUFFER ACCUMULATION                 โ”‚
โ”‚          (Mixing with other tracks)                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚
               โ”‚ โฑ๏ธ Output Buffer: 2.67ms (matches input)
               โ”‚
               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚             AUDIO INTERFACE DRIVER                  โ”‚
โ”‚                                                     โ”‚
โ”‚  โ€ข ASIO Buffer Handoff:       0.5-1ms             โ”‚
โ”‚  โ€ข USB Transfer (if USB):     1-2ms               โ”‚
โ”‚  โ€ข Internal DSP (UA/Antelope): 0-1ms              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚
               โ”‚ โฑ๏ธ Driver + Hardware: 1-5ms
               โ”‚
               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              D/A CONVERTER                          โ”‚
โ”‚              (Digital โ†’ Analog)                     โ”‚
โ”‚              Conversion time: ~0.1ms                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
               โ”‚
               โ–ผ
           ๐Ÿ”Š SOUND WAVES
           (Propagation: 1ms per foot @ room temp)


โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
              TOTAL ROUND-TRIP LATENCY
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Calculation:
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ LATENCY CONTRIBUTORS                       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ MIDI Input:          0.5 - 1ms             โ”‚
โ”‚ Input Buffer:        2.67ms (128@48kHz)    โ”‚
โ”‚ Plugin Process:      0 - 50ms (lookahead)  โ”‚
โ”‚ Output Buffer:       2.67ms                โ”‚
โ”‚ Driver Overhead:     1 - 5ms               โ”‚
โ”‚ D/A Conversion:      0.1ms                 โ”‚
โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€           โ”‚
โ”‚ TOTAL:              7 - 61ms               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŽฏ ACCEPTABLE LATENCY RANGES:
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

โœ… 0-10ms   โ†’ IMPERCEPTIBLE
   โ€ข Live performance ready
   โ€ข No compensation needed
   โ€ข Feels "instant"

โš ๏ธ 10-20ms  โ†’ NOTICEABLE
   โ€ข Workable for most users
   โ€ข Tight timing may feel slightly off
   โ€ข Piano/drums most affected

โŒ 20-30ms  โ†’ PROBLEMATIC
   โ€ข Live playing is difficult
   โ€ข Use input monitoring instead
   โ€ข Acceptable for mixing only

๐Ÿ›‘ >30ms    โ†’ UNUSABLE
   โ€ข Significant delay perception
   โ€ข Cannot perform in real-time
   โ€ข Pre-record or reduce buffer

Latency Source Deep-Dive

๐Ÿ“ฅ Input Buffer Latency

What It Is: Time to fill buffer before processing starts

Formula:

Input Latency (ms) = (Buffer Size / Sample Rate) ร— 1000

Examples:
โ€ข 64 samples @ 44.1kHz  = 1.45ms
โ€ข 128 samples @ 48kHz   = 2.67ms
โ€ข 256 samples @ 96kHz   = 2.67ms (same duration!)
โ€ข 512 samples @ 48kHz   = 10.67ms

Control: ASIO Control Panel โ†’ Buffer Size

Trade-offs:

Smaller Buffer (64):
  โœ… Lower latency (good for tracking)
  โŒ Higher CPU usage
  โŒ More prone to dropouts/clicks

Larger Buffer (512):
  โœ… More stable (good for mixing)
  โœ… Lower CPU usage
  โŒ Higher latency (bad for live playing)

Sweet Spot for Development: 128-256 samples - Balanced latency/stability - Matches most users' real-world settings - Catches buffer-size-dependent bugs


โš™๏ธ Plugin Processing Latency

Fixed Latency (Algorithmic Requirement):

// FFT-based processing (frequency domain)
int fftSize = 2048;
int latency = fftSize / 2;  // 1024 samples = 21ms @ 48kHz

// Linear-phase EQ (symmetric FIR filter)
int firTaps = 2048;
int latency = firTaps / 2;  // 1024 samples

// Lookahead limiter/compressor
int lookaheadSamples = 480;  // 10ms @ 48kHz
int latency = lookaheadSamples;  // Exactly 10ms

Reporting to Host:

void MyAudioProcessor::prepareToPlay(double sampleRate, int samplesPerBlock) {
    // Calculate your fixed latency
    int totalLatency = fftLatency + lookaheadLatency;

    // CRITICAL: Tell host for delay compensation
    setLatencySamples(totalLatency);

    // Host will now automatically align this track with others
}

What Happens If You Don't Report: - โŒ Multi-track recordings will be out of sync - โŒ Parallel processing will phase-cancel - โŒ Automation will be offset


Variable Latency (Avoid If Possible):

// โš ๏ธ PROBLEMATIC: Latency changes during playback
void processBlock(AudioBuffer<float>& buffer, MidiBuffer&) {
    if (qualityMode == HIGH) {
        setLatencySamples(2048);  // โŒ Can't change mid-playback!
    } else {
        setLatencySamples(512);
    }
}

// โœ… BETTER: Fix latency at initialization
void prepareToPlay(double sampleRate, int samplesPerBlock) {
    // Use MAXIMUM possible latency always
    setLatencySamples(2048);

    // Lower quality modes just waste some of the buffer
    // (Better than glitchy latency changes)
}

๐Ÿ“ค Output Buffer Latency

What It Is: Matches input buffer (double-buffering)

Why It Exists:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  DOUBLE BUFFERING (prevents glitches)  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                        โ”‚
โ”‚  Buffer A: [Writing new samples]      โ”‚
โ”‚  Buffer B: [Playing current samples]  โ”‚
โ”‚                                        โ”‚
โ”‚  Every buffer period, they SWAP:       โ”‚
โ”‚  โ€ข No interruption to playback         โ”‚
โ”‚  โ€ข No race conditions                  โ”‚
โ”‚  โ€ข Smooth, click-free audio            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Cannot Be Reduced: This is fundamental to stable audio I/O


๐Ÿ”ง Driver Overhead Latency

Platform Differences:

Driver Typical Overhead Notes
ASIO (Windows) 0.5-2ms Best case, professional interfaces
WDM (Windows) 10-30ms Avoid for music production
CoreAudio (macOS) 1-3ms Excellent, built-in
JACK (Linux) 1-5ms Configuration-dependent

Interface Quality Matters:

๐Ÿ† Professional (RME, UA, Antelope):
   โ€ข Optimized drivers: ~1ms overhead
   โ€ข Direct hardware control
   โ€ข Stable at 64-sample buffers

โŒ Budget (Generic USB, Realtek):
   โ€ข Poor drivers: 5-20ms overhead
   โ€ข Software resampling layers
   โ€ข Unstable below 512 samples


Latency Debugging Checklist

When users report "high latency":

โ–ก Check ASIO buffer size (should be 128-256 for live use)
โ–ก Verify sample rate matches interface settings (no resampling)
โ–ก Disable audio enhancements (Windows: Sound Control Panel โ†’ Disable all)
โ–ก Close other audio apps (Spotify, YouTube = buffer conflicts)
โ–ก Check plugin latency reporting (DAW's delay compensation active?)
โ–ก Test with interface's direct monitoring (zero-latency proof-of-concept)
โ–ก Update interface drivers (old drivers = extra overhead)
โ–ก Check CPU usage (overload = buffer underruns = glitches)

๐Ÿ“Š DIAGRAM 4: MULTI-DAW TESTING SETUP

Cross-DAW Compatibility Validation

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      MULTI-DAW TESTING WORKSTATION                           โ”‚
โ”‚                                                                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ”‚
โ”‚  โ”‚   Reaper 7.x   โ”‚    โ”‚  Cubase 13     โ”‚    โ”‚ Ableton Live12 โ”‚            โ”‚
โ”‚  โ”‚   (FREE)       โ”‚    โ”‚  (Trial/Edu)   โ”‚    โ”‚  (Trial 90d)   โ”‚            โ”‚
โ”‚  โ”‚                โ”‚    โ”‚                โ”‚    โ”‚                โ”‚            โ”‚
โ”‚  โ”‚ โœ… Tests:      โ”‚    โ”‚ โœ… Tests:      โ”‚    โ”‚ โœ… Tests:      โ”‚            โ”‚
โ”‚  โ”‚ โ€ข VST3 load   โ”‚    โ”‚ โ€ข VST3 strict  โ”‚    โ”‚ โ€ข VST3/AU      โ”‚            โ”‚
โ”‚  โ”‚ โ€ข Automation  โ”‚    โ”‚ โ€ข ASIO-Guard   โ”‚    โ”‚ โ€ข Freeze/Flat  โ”‚            โ”‚
โ”‚  โ”‚ โ€ข Rendering   โ”‚    โ”‚ โ€ข Sidechain    โ”‚    โ”‚ โ€ข MPE MIDI     โ”‚            โ”‚
โ”‚  โ”‚ โ€ข ReaScript   โ”‚    โ”‚ โ€ข Expression   โ”‚    โ”‚ โ€ข Clip Launch  โ”‚            โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ”‚
โ”‚          โ”‚                     โ”‚                     โ”‚                      โ”‚
โ”‚          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                      โ”‚
โ”‚                                โ”‚                                            โ”‚
โ”‚                                โ–ผ                                            โ”‚
โ”‚                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                           โ”‚
โ”‚                  โ”‚   AUTOMATED TEST SUITE       โ”‚                           โ”‚
โ”‚                  โ”‚   (Python + DAW Scripts)     โ”‚                           โ”‚
โ”‚                  โ”‚                              โ”‚                           โ”‚
โ”‚                  โ”‚  Per-DAW Tests:              โ”‚                           โ”‚
โ”‚                  โ”‚  1. Plugin Scan & Load       โ”‚                           โ”‚
โ”‚                  โ”‚  2. Parameter Recall         โ”‚                           โ”‚
โ”‚                  โ”‚  3. Automation Write/Read    โ”‚                           โ”‚
โ”‚                  โ”‚  4. State Save/Load          โ”‚                           โ”‚
โ”‚                  โ”‚  5. Preset Management        โ”‚                           โ”‚
โ”‚                  โ”‚  6. Sidechain Routing        โ”‚                           โ”‚
โ”‚                  โ”‚  7. Crash Recovery           โ”‚                           โ”‚
โ”‚                  โ”‚  8. Sample Rate Change       โ”‚                           โ”‚
โ”‚                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                           โ”‚
โ”‚                             โ”‚                                               โ”‚
โ”‚              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                โ”‚
โ”‚              โ”‚                             โ”‚                                โ”‚
โ”‚              โ–ผ                             โ–ผ                                โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                     โ”‚
โ”‚   โ”‚   VALIDATION        โ”‚      โ”‚   AUDIO CAPTURE     โ”‚                     โ”‚
โ”‚   โ”‚   REPORTS           โ”‚      โ”‚   & ANALYSIS        โ”‚                     โ”‚
โ”‚   โ”‚                     โ”‚      โ”‚                     โ”‚                     โ”‚
โ”‚   โ”‚ โ€ข Parameters Load:  โ”‚      โ”‚ โ€ข Bounce Quality:   โ”‚                     โ”‚
โ”‚   โ”‚   โœ… All correct    โ”‚      โ”‚   Compare bit-exact โ”‚                     โ”‚
โ”‚   โ”‚                     โ”‚      โ”‚                     โ”‚                     โ”‚
โ”‚   โ”‚ โ€ข Automation:       โ”‚      โ”‚ โ€ข CPU Usage:        โ”‚                     โ”‚
โ”‚   โ”‚   โœ… Follows curves โ”‚      โ”‚   Log per DAW       โ”‚                     โ”‚
โ”‚   โ”‚                     โ”‚      โ”‚                     โ”‚                     โ”‚
โ”‚   โ”‚ โ€ข State Recall:     โ”‚      โ”‚ โ€ข Memory Leaks:     โ”‚                     โ”‚
โ”‚   โ”‚   โœ… No crashes     โ”‚      โ”‚   Valgrind/ASAN     โ”‚                     โ”‚
โ”‚   โ”‚                     โ”‚      โ”‚                     โ”‚                     โ”‚
โ”‚   โ”‚ โ€ข Crash Tests:      โ”‚      โ”‚ โ€ข Buffer Stability: โ”‚                     โ”‚
โ”‚   โ”‚   โš ๏ธ 2 failures    โ”‚      โ”‚   Dropout detection โ”‚                     โ”‚
โ”‚   โ”‚     (see log)       โ”‚      โ”‚                     โ”‚                     โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                     โ”‚
โ”‚                                                                              โ”‚
โ”‚  Final Report:  test_results_2025-10-03.html                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Per-DAW Testing Matrix

โœ… Reaper (Cockos)

Pros for Testing: - โšก Fast plugin scan (< 5 seconds for 100 plugins) - ๐Ÿ”„ ReaScript automation (Python/Lua scripting) - ๐ŸŽš๏ธ Flexible routing (any track to any track) - ๐Ÿ’พ Human-readable project files (easy to diff)

Known Quirks:

Issue: Reaper's unique routing matrix
Impact: Sidechain inputs use different API than other DAWs
Solution: Test sidechain via getBusCount() and explicit bus routing

Issue: Non-destructive FX rendering
Impact: Plugin state might not match offline render
Solution: Verify setNonRealtime() is respected in processBlock()

Test Script (ReaScript Lua):

-- automate_parameter_test.lua
function runPluginTest()
    -- Load plugin on track 1
    track = reaper.GetTrack(0, 0)
    fx_idx = reaper.TrackFX_AddByName(track, "AudioLab Plugin", false, -1)

    -- Set parameter 0 to 0.5
    reaper.TrackFX_SetParam(track, fx_idx, 0, 0.5)

    -- Read back (should match within float precision)
    value = reaper.TrackFX_GetParam(track, fx_idx, 0)

    if math.abs(value - 0.5) < 0.0001 then
        reaper.ShowConsoleMsg("โœ… Parameter set/get: PASS\n")
    else
        reaper.ShowConsoleMsg("โŒ Parameter set/get: FAIL\n")
    end
end

runPluginTest()


โœ… Cubase (Steinberg)

Pros for Testing: - ๐Ÿ”’ Strictest VST3 validation (catches spec violations) - ๐ŸŽต Advanced MIDI (Expression Maps, Note Expression) - ๐Ÿ”Š ASIO-Guard stress test (parallel processing)

Known Quirks:

Issue: ASIO-Guard moves processing to background thread
Impact: Timing assumptions break, race conditions exposed
Solution: All inter-thread communication MUST be lock-free

Issue: Sample rate changes during project (film work)
Impact: prepareToPlay() called mid-session
Solution: Properly reset ALL state in prepareToPlay(), not just constructor

Issue: Strict state validation
Impact: setState() with invalid data = instant crash dialog
Solution: Robust state versioning with fallback to defaults

Critical Test:

// Test ASIO-Guard compatibility
void AudioLabProcessor::processBlock(AudioBuffer<float>& buffer, MidiBuffer& midi) {
    // โŒ WRONG: Assumes buffer timestamp is continuous
    currentTime += buffer.getNumSamples();  // Breaks with ASIO-Guard!

    // โœ… CORRECT: Use PlayHead position
    if (auto* playHead = getPlayHead()) {
        if (auto pos = playHead->getPosition()) {
            currentTime = pos->getTimeInSamples().orFallback(0);
        }
    }
}


โœ… Ableton Live (Ableton AG)

Pros for Testing: - ๐ŸŽญ Unique workflows (clip launching, freeze tracks) - ๐ŸŽน MPE MIDI support (polyphonic expression) - โšก Session view (non-linear arrangement)

Known Quirks:

Issue: Plugin scanning is VERY sensitive to crashes
Impact: One crash during scan = plugin blacklisted forever
Solution: Clear plugin cache: ~/Library/Preferences/Ableton/Live x.x.x/

Issue: Freeze track converts to audio offline
Impact: Must handle setNonRealtime(true) correctly
Solution: Disable any real-time-only features (spectrum analyzers, etc.)

Issue: Clip automation vs. arrangement automation
Impact: Parameters can have TWO automation sources simultaneously
Solution: Properly handle parameter changes from multiple sources

Test Scenario:

1. Load plugin on MIDI track
2. Create automation in Clip view (sawtooth LFO on cutoff)
3. Create DIFFERENT automation in Arrangement view (step sequence)
4. Switch between Session/Arrangement
5. VERIFY: Plugin responds to correct automation source
6. VERIFY: No clicks/pops on automation switch


โœ… Pro Tools (Avid) [If Available]

Pros for Testing: - ๐Ÿ† Industry standard (film/music post-production) - ๐Ÿ”’ AAX format strictest validation - ๐Ÿ“น Video sync (frame-accurate timing)

Known Quirks:

Issue: Sample rate changes are VERY slow
Impact: Users avoid SR changes; plugin must handle gracefully
Solution: Don't force sample rate; adapt to whatever PT provides

Issue: AAX requires separate build pipeline
Impact: Different SDK, different signing, different bugs
Solution: Test VST3 AND AAX builds separately

Issue: Track freeze is destructive
Impact: No way to "unfreeze" without re-recording
Solution: Ensure offline render is IDENTICAL to real-time


Automated Testing Suite

Test Harness (Python + DAW Scripting):

# test_all_daws.py
import subprocess
import os

DAWS = {
    'reaper': {
        'executable': r'C:\Program Files\REAPER\reaper.exe',
        'script': 'reaper_tests.lua',
        'timeout': 300
    },
    'cubase': {
        'executable': r'C:\Program Files\Steinberg\Cubase 13\Cubase13.exe',
        'project': 'cubase_test_template.cpr',
        'timeout': 600
    },
    'ableton': {
        'executable': r'C:\ProgramData\Ableton\Live 12\Program\Ableton Live 12.exe',
        'project': 'ableton_test_template.als',
        'timeout': 600
    }
}

def run_daw_tests(daw_name, config):
    """Run automated tests in specified DAW"""
    print(f"๐Ÿงช Testing {daw_name.upper()}...")

    # Launch DAW with test project
    process = subprocess.Popen([
        config['executable'],
        config.get('project', ''),
        '--headless'  # If supported
    ])

    # Monitor for crashes
    try:
        process.wait(timeout=config['timeout'])
    except subprocess.TimeoutExpired:
        print(f"โš ๏ธ {daw_name} test timed out")
        process.kill()
        return False

    # Parse results
    if process.returncode == 0:
        print(f"โœ… {daw_name} tests PASSED")
        return True
    else:
        print(f"โŒ {daw_name} tests FAILED (code {process.returncode})")
        return False

# Run all tests
results = {}
for daw, config in DAWS.items():
    results[daw] = run_daw_tests(daw, config)

# Generate report
print("\n" + "="*50)
print("FINAL RESULTS:")
for daw, passed in results.items():
    status = "โœ… PASS" if passed else "โŒ FAIL"
    print(f"  {daw.upper():15} {status}")

Test Checklist by Category

1๏ธโƒฃ Plugin Scan & Load

Reaper:
  โ–ก Plugin appears in FX browser
  โ–ก Loads in < 2 seconds
  โ–ก No console warnings

Cubase:
  โ–ก Passes VST3 validator (strict mode)
  โ–ก Correct category assignment
  โ–ก Thumbnail/icon displays

Ableton:
  โ–ก Survives initial scan without crash
  โ–ก Appears in Browser โ†’ Plug-ins
  โ–ก Tags/categories correct

2๏ธโƒฃ Parameter Recall

All DAWs:
  โ–ก Set all parameters to random values
  โ–ก Save project
  โ–ก Close DAW
  โ–ก Reopen project
  โ–ก VERIFY: All parameters match saved values
  โ–ก VERIFY: No parameters reset to default
  โ–ก VERIFY: No NaN or infinity values

Common Bug:

// โŒ WRONG: Saving GUI state, not audio state
void AudioProcessor::getStateInformation(MemoryBlock& destData) {
    // If GUI hasn't opened yet, parameters might be uninitialized!
    auto value = editor->getSliderValue();  // โŒ Editor might not exist
}

// โœ… CORRECT: Save audio processor state
void AudioProcessor::getStateInformation(MemoryBlock& destData) {
    // Always save from AudioProcessor's parameter objects
    auto value = parameters.getRawParameterValue("cutoff")->load();
}


3๏ธโƒฃ Automation Write/Read

All DAWs:
  โ–ก Enable automation write on parameter
  โ–ก Move parameter while playing
  โ–ก Switch to automation read mode
  โ–ก VERIFY: Parameter follows recorded automation
  โ–ก VERIFY: Smooth curves (no stairstepping)
  โ–ก VERIFY: No clicks/pops during automation

Smoothing Requirement:

// Automation can change VERY rapidly (every sample)
// Your plugin MUST smooth parameter changes!

void processBlock(AudioBuffer<float>& buffer, MidiBuffer&) {
    // โŒ WRONG: Direct parameter use
    float cutoff = *cutoffParam;
    filter.setCutoff(cutoff);  // Causes clicks!

    // โœ… CORRECT: Smoothed parameter
    cutoffSmoothed.setTargetValue(*cutoffParam);
    for (int sample = 0; sample < buffer.getNumSamples(); ++sample) {
        float smoothCutoff = cutoffSmoothed.getNextValue();
        // Use smooth value for this sample
    }
}


4๏ธโƒฃ State Save/Load Stress Test

All DAWs:
  โ–ก Create 100 random presets
  โ–ก For each preset:
      โ–ก Load preset
      โ–ก Save project
      โ–ก Load project
      โ–ก VERIFY: State matches
  โ–ก No memory leaks (check RAM usage)
  โ–ก No crashes after 100 iterations

5๏ธโƒฃ Crash Recovery

Cubase (best crash handling):
  โ–ก Trigger intentional crash (null pointer dereference)
  โ–ก VERIFY: Cubase shows crash dialog
  โ–ก VERIFY: Cubase offers to disable plugin
  โ–ก VERIFY: Project still loads without plugin

Reaper:
  โ–ก Crash should NOT take down entire DAW
  โ–ก VERIFY: Track bypasses automatically

Ableton:
  โ–ก Crash during scan = blacklisted
  โ–ก VERIFY: Can re-scan after fixing bug

6๏ธโƒฃ Sample Rate Change

All DAWs:
  โ–ก Load plugin at 44.1kHz
  โ–ก Change project to 48kHz
  โ–ก VERIFY: prepareToPlay() called with new rate
  โ–ก VERIFY: No audio glitches during transition
  โ–ก VERIFY: Frequency-dependent parameters scale correctly

Example:
  โ€ข LPF at 1kHz @ 44.1kHz should stay at 1kHz @ 48kHz
  โ€ข NOT scale to 1088Hz (ratio-based error)

๐Ÿ—‚๏ธ COMPATIBILITY MATRIX

Feature Support by DAW

Feature Reaper Cubase Ableton Pro Tools Notes
VST3 โœ… โœ… โœ… โŒ PT uses AAX only
VST2 (legacy) โœ… โœ… โœ… โŒ Deprecated, avoid
AU (macOS) โœ… โœ… โœ… โŒ
AAX โŒ โŒ โŒ โœ… Requires iLok licensing
Sidechain โœ… โœ… โœ… โœ… Different APIs per DAW
MIDI Input โœ… โœ… โœ… โœ…
MPE MIDI โš ๏ธ โœ… โœ… โš ๏ธ Limited in Reaper/PT
Surround โœ… โœ… โŒ โœ… Live is stereo-centric
Latency Comp โœ… โœ… โœ… โœ… All modern DAWs
Offline Render โœ… โœ… โœ… โœ… Via setNonRealtime()
Plugin Delay โœ… โœ… โœ… โœ… Via setLatencySamples()
Resize GUI โœ… โœ… โš ๏ธ โŒ Live has issues
Automation โœ… โœ… โœ… โœ… Different curve types
Presets (.vstpreset) โœ… โœ… โœ… โŒ AAX uses .tfx format

Platform Support Matrix

Platform VST3 AU AAX Recommended
Windows 10/11 โœ… โŒ โœ… VST3 primary
macOS (Intel) โœ… โœ… โœ… AU + VST3
macOS (Apple Silicon) โœ… โœ… โœ… Native ARM builds!
Linux โœ… โŒ โŒ VST3 only

Architecture Support

Windows:
  โœ… x64 (64-bit) - REQUIRED (32-bit is dead)
  โŒ x86 (32-bit) - SKIP (no modern DAWs support)

macOS:
  โœ… x86_64 (Intel)
  โœ… arm64 (Apple Silicon M1/M2/M3)
  โš ๏ธ Universal Binary (both) - RECOMMENDED

Linux:
  โœ… x86_64
  โš ๏ธ ARM64 (Raspberry Pi) - niche but growing

Known DAW-Specific Bugs

Reaper

Bug: ReaComp sidechain routing differs from spec
Workaround: Detect Reaper via host name, use alternate bus index

Bug: Resizing can cause OpenGL context loss
Workaround: Recreate GL context on resize event

Cubase

Bug: ASIO-Guard + fast automation = race condition
Workaround: Use atomic<float> for ALL shared parameters

Bug: Expression Maps don't send Note Off sometimes
Workaround: Implement note timeout (kill after 10 seconds)

Ableton Live

Bug: Freeze sometimes renders at wrong sample rate
Workaround: Check getPlayHead() sample rate, resample if needed

Bug: GUI resize can crash on Windows
Workaround: Disable resizing on Windows (check #ifdef _WIN32)

Pro Tools

Bug: Bouncing stems doesn't call setNonRealtime()
Workaround: Detect long buffer sizes (> 8192) as offline hint

Bug: Surround bus routing is AAX-specific
Workaround: Read AAX SDK docs (completely different from VST)

๐ŸŽ“ Best Practices Summary

Do's โœ…

  1. Test in multiple DAWs BEFORE releasing
  2. Minimum: Reaper (free) + one commercial DAW trial

  3. Report latency accurately

    setLatencySamples(myAlgorithmLatency);  // Always!
    

  4. Handle sample rate changes gracefully

    void prepareToPlay(double newRate, int newBlockSize) {
        sampleRate = newRate;
        recalculateAllFrequencyDependentStuff();
    }
    

  5. Save complete state

    void getStateInformation(MemoryBlock& destData) {
        // Save EVERYTHING needed to recreate sound
        saveParameterValues();
        saveInternalBuffers();
        saveVersionNumber();  // For future compatibility
    }
    

  6. Smooth all parameter changes

    smoothedParam.setTargetValue(newValue);
    // Then getNextValue() per sample in processBlock()
    


Don'ts โŒ

  1. DON'T assume buffer size is constant
  2. Some DAWs change it mid-session!

  3. DON'T use malloc/new in audio thread

  4. Pre-allocate everything in prepareToPlay()

  5. DON'T assume stereo

  6. Support mono, surround via getNumInputChannels()

  7. DON'T hardcode sample rate

  8. Calculate everything from getSampleRate()

  9. DON'T ignore setNonRealtime()

  10. Offline render might need different settings

๐Ÿ“š Further Resources


Document Status: โœ… Complete Next Review: When new DAW versions release Maintained By: AudioLab DevOps Team