Skip to main content

Supported Formats

iPlug2 supports all major plugin formats through a unified API abstraction. Write your code once, compile to multiple formats.

VST3

Steinberg’s modern standard

AUv2

macOS/iOS (legacy)

AUv3

macOS/iOS (modern)

AAX

Avid Pro Tools

CLAP

Modern open standard

WAM

Web Audio Modules
VST2 is also supported but deprecated due to licensing. Not recommended for new projects.

Format Comparison

FeatureVST3AUv2AUv3AAXCLAPWAM
Windows
macOS
iOS
Linux
Web
Sidechain
MIDI I/O
Multi-bus
Sample Accurate⚠️⚠️
Open Standard

VST3

Implemented in IPlugVST3.h
Steinberg’s VST3 is the most widely supported plugin format across DAWs.

Architecture

VST3 uses a separated processor/controller architecture:
class IPlugVST3 : public IPlugAPIBase,
                  public IPlugVST3ProcessorBase,     // Audio processing
                  public IPlugVST3ControllerBase,    // UI/parameters
                  public Steinberg::Vst::SingleComponentEffect
VST3 Capabilities
  • Sample-accurate automation
  • Multiple input/output buses
  • Sidechain support
  • Context menus in host
  • Channel context information
  • Preset management
  • MIDI mapping
// VST3-specific: MIDI CC mapping
Steinberg::tresult getMidiControllerAssignment(
  Steinberg::int32 busIndex, 
  Steinberg::int16 channel,
  Steinberg::Vst::CtrlNumber midiCCNumber, 
  Steinberg::Vst::ParamID& tag
);

VST3 Specifics

VST3 has a separated state model. Use SerializeVST3CtrlrState() and UnserializeVST3CtrlrState() for UI-only state if needed (rare).
// Usually you only need this
virtual bool SerializeState(IByteChunk& chunk) const {
  return SerializeParams(chunk);
}

// VST3-specific controller state (rare)
virtual bool SerializeVST3CtrlrState(IByteChunk& chunk) const {
  return true;  // Usually not needed
}

Audio Unit v2 (AUv2)

Implemented in IPlugAU.h
Apple’s legacy Audio Unit format for macOS. Still widely used but being replaced by AUv3.

Architecture

class IPlugAU : public IPlugAPIBase,
                public IPlugProcessor
AUv2 Capabilities
  • macOS native format
  • Parameter units (dB, Hz, etc.)
  • Preset management
  • Factory preset support
  • Multi-bus I/O
  • Sidechain inputs
// AUv2 parameter units affect host display
GetParam(kFreq)->InitFrequency("Frequency", 1000., 20., 20000.);
// Automatically sets EParamUnit::kUnitFrequency
Parameter Units
enum EParamUnit {
  kUnitPercentage, kUnitSeconds, kUnitMilliseconds,
  kUnitDB, kUnitFrequency, kUnitCents, kUnitMIDINote,
  kUnitBPM, kUnitPan, kUnitPhase, kUnitDegrees,
  kUnitLinearGain, kUnitOctaves, kUnitRate,
  kUnitCustom  // Use custom label
};

AUv2 Specifics

// Get track name (AUv2 & AAX support this)
void GetTrackName(WDL_String& str) override;

// AUv2 uses component manager on older macOS
static OSStatus IPlugAUEntry(ComponentParameters* pParams, void* pPlug);

Audio Unit v3 (AUv3)

Implemented in IPlugAUv3.h
Apple’s modern Audio Unit format for macOS and iOS with app extensions.

Architecture

class IPlugAUv3 : public IPlugAPIBase,
                  public IPlugProcessor
AUv3 Capabilities
  • App extension architecture (sandbox)
  • iOS support (iPad/iPhone)
  • Sample-accurate parameter events
  • Inter-app audio
  • State saving/restoration
  • SwiftUI integration possible
// AUv3 uses event-based processing
void ProcessWithEvents(
  AudioTimeStamp const* timestamp,
  uint32_t frameCount,
  AURenderEvent const* events,
  ITimeInfo& timeInfo
);

AUv3 Specifics

AUv3 uses parameter addresses instead of indices. iPlug2 handles the mapping automatically.
// Internal mapping between param indices and AU addresses
void AddParamAddress(int paramIdx, uint64_t paramAddress);
uint64_t GetParamAddress(int paramIdx);
int GetParamIdx(uint64_t paramAddress);

AAX

Implemented in IPlugAAX.h
Avid’s plugin format for Pro Tools. Requires AAX SDK (free registration required).

Architecture

class IPlugAAX : public IPlugAPIBase,
                 public IPlugProcessor,
                 public AAX_CIPlugParameters
AAX Capabilities
  • Native Pro Tools integration
  • AudioSuite (offline processing)
  • Stem formats (multi-channel)
  • Track naming
  • Pro Tools automation
  • Parameter highlighting
// AAX-specific: parameter highlighting in Pro Tools
AAX_Result SetControlHighlightInfo(
  AAX_CParamID iParameterID,
  AAX_CBoolean iIsHighlighted,
  AAX_EHighlightColor iColor
);

AAX Specifics

// AAX parameter IDs are offset by 1
const int kAAXParamIdxOffset = 1;

// AAX processing is page-table based
// iPlug2 handles this automatically

// Get track name (works in Pro Tools)
void GetTrackName(WDL_String& str) override;

CLAP

Implemented in IPlugCLAP.h
CLever Audio Plug-in - modern open-source plugin standard created by the u-he team.

Architecture

class IPlugCLAP : public IPlugAPIBase,
                  public IPlugProcessor,
                  public ClapPluginHelper
CLAP Capabilities
  • Sample-accurate parameter automation
  • Modern C++ design
  • Open standard (no licensing)
  • Note expressions (MPE-like)
  • Polyphonic modulation
  • Voice info/management
  • Extensible architecture
// CLAP uses event-based parameter changes
struct ParamToHost {
  enum class Type { Begin, Value, End };
  Type mType;
  int mIdx;
  double mValue;
};
CLAP has the most modern feature set: note expressions, polyphonic modulation, and flexible extension mechanism.

CLAP Specifics

// CLAP uses parameter gestures (begin/change/end)
void BeginInformHostOfParamChange(int idx) override;
void InformHostOfParamChange(int idx, double normalizedValue) override;
void EndInformHostOfParamChange(int idx) override;

// CLAP tail size is dynamic
void SetTailSize(int tailSize) override;

WAM (Web Audio Modules)

Implemented in IPlugWAM.h
Web Audio Modules run in browsers using WebAssembly. Perfect for demos and web-based DAWs.

Architecture

class IPlugWAM : public IPlugAPIBase,
                 public IPlugProcessor,
                 public WAM::Processor  // WebAssembly processor
WAM Capabilities
  • Runs in web browsers
  • WebAssembly (WASM) compilation
  • Web Audio API integration
  • Real-time audio in browser
  • MIDI support
  • SysEx support
  • Message passing (JS ↔ C++)
// WAM-specific message handling
void onMessage(char* verb, char* res, double data) override;
void onMessage(char* verb, char* res, char* data) override;
void onParam(uint32_t idparam, double value) override;

WAM Specifics

WAM runs in AudioWorkletGlobalScope (sandboxed). Limited access to system resources.
// WAM lifecycle
const char* init(uint32_t bufsize, uint32_t sr, void* pDesc) override;
void terminate() override;
void resize(uint32_t bufsize) override;

// WAM uses different message system (no direct MIDI send)
void SetLatency(int samples) override {}  // Not supported
bool SendMidiMsg(const IMidiMsg& msg) override { return false; }

Choosing a Format

Maximum Compatibility

VST3 + AUv2Covers Windows, macOS, and most DAWs.

Pro Tools

AAX + VST3 + AUv2Adds Pro Tools support (requires AAX SDK and signing).

Modern/Future

CLAP + VST3CLAP has best features, VST3 for compatibility.

iOS/Mobile

AUv3Only option for iOS. Can include in app.

Web/Demos

WAMShare plugins via URL, no installation.

Everything

All FormatsiPlug2 can compile to all formats from same code!

Multi-Format Build System

iPlug2 uses duplicate projects for each format:
MyPlugin/
  MyPlugin.cpp
  MyPlugin.h
  config.h
  
  projects/
    MyPlugin-app.vcxproj         (Standalone)
    MyPlugin-vst3.vcxproj        (VST3)
    MyPlugin-au.xcodeproj        (AUv2)
    MyPlugin-auv3.xcodeproj      (AUv3)
    MyPlugin-aax.vcxproj         (AAX)
    MyPlugin-clap.vcxproj        (CLAP)
    MyPlugin-wam.vcxproj         (WAM)
The duplicate.py script creates these projects automatically from templates. Run it once, then build any format.

Platform-Specific Notes

Available Formats:
  • VST3
  • AAX
  • CLAP
  • Standalone App
Visual Studio Required:
  • VS 2019 or later
  • Windows 10 SDK
Code Signing:
  • Recommended for distribution
  • Not required for development

Next Steps

Architecture

Understand the plugin architecture and lifecycle

Parameters

Learn parameter types and automation

Audio Processing

Master ProcessBlock and real-time audio

Project Structure

Explore config.h and project organization