SLAMCORE PRODUCTION SUITE — COMPLETE BUILD SPEC

BuildAgent v1.0 | VST3 + REAPER | Windows & macOS


SECTION 1 — PROJECT OVERVIEW

Suite Name     : SlamcoreProSuite
Version        : 1.0.0
Target Host    : REAPER 6.8x+
Plugin Format  : VST3 (VST3 SDK 3.7.x)
Supported OS   : Windows 10/11 (x64), macOS 12.0+ (x64 + Apple Silicon Universal Binary)
Audio Engine   : 64-bit floating point processing throughout
Sample Rates   : 44100, 48000, 88200, 96000, 176400, 192000 Hz
Buffer Sizes   : 32, 64, 128, 256, 512, 1024 samples (zero-latency DSP path at ≤128)
MIDI Timing    : Sample-accurate event scheduling via VST3 IProcessContextRequirements
GUI Framework  : JUCE 7.x (primary) or nih-plug 0.3.x (alternative Rust path)
Build System   : CMake 3.26+
Compiler       : MSVC 17+ (Windows), Clang 15+ / Xcode 14+ (macOS)
Required SDKs  : VST3 SDK 3.7.x (Steinberg), JUCE 7.x, iPlug2 (optional alt)
REAPER Install : %APPDATA%\REAPER\UserPlugins\ (Win), ~/Library/Application Support/REAPER/UserPlugins/ (mac)


SECTION 2 — PLUGIN CATALOG

── GUITAR PLUGINS ──────────────────────────────────────────────────────────


PLUGIN: Slam-Chugger

DSP_algorithm: >
  Cascaded asymmetric soft-clip waveshaper (Chebyshev polynomial order 3–7,
  runtime-selectable) feeding a 2-pole resonant high-pass filter for pick-
  attack preservation, followed by a 4th-order Linkwitz–Riley crossover
  splitting into tight-low (≤120 Hz) and body bands. Tight-low band passes
  through a transient-controlled compressor (attack 0.1 ms, release 4 ms).
  Body band receives additional polynomial saturation. Output summed with
  dry signal via dry_wet blend. DC-offset removed by 6 Hz 1-pole HPF.
  Zero-latency; no lookahead.

sample_rate_behavior: >
  Oversamples internally ×2 at SR < 88200 Hz using minimum-phase FIR
  (128-tap). At SR ≥ 88200 Hz no oversampling applied. All filter
  coefficients recalculated on SR change via prepareToPlay().

cpu_budget_single_instance: "≤2.5% @ 48 kHz / 256 samples, i7-10th-gen"


Parameters (YAML):

parameters:
  - name: input_gain
    range: [-24.0, +24.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: drive
    range: [0.0, 100.0]
    default: 40.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: chug_tightness
    range: [0.0, 100.0]
    default: 65.0
    unit: "%"
    control: rotary_knob
    automation: true
    description: "Controls HPF cutoff (80–400 Hz) for low-end gate threshold"

  - name: waveshape_mode
    range: [0, 3]
    default: 1
    unit: enum [Soft, Hard, Asymm, Fuzz]
    control: combo_box
    automation: true

  - name: cheby_order
    range: [3, 7]
    default: 5
    unit: int
    control: stepped_slider
    automation: true

  - name: resonance
    range: [0.5, 6.0]
    default: 1.2
    unit: Q
    control: rotary_knob
    automation: true

  - name: low_blend
    range: [0.0, 100.0]
    default: 75.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-24.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 1.0
    unit: ratio
    control: rotary_knob
    automation: true

  - name: oversample_enable
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: false

preset_banks:
  - "Modern Djent"
  - "Old School Chug"
  - "Syncopated Slam"
  - "8-String Low"
  - "Drop-A Tight"
  - "Nu-Metal Grind"
  - "Death Chug"
  - "Deathcore Breakdown"
  - "Swedish Buzzsaw"
  - "Blackened Low"
  - "Doom Chug"
  - "Mid-Scoop Slam"

assets:
  ir_files: []
  sample_files: []


PLUGIN: Gutter-Drive

DSP_algorithm: >
  Three-stage tube-emulation gain structure using Kirchhoff nodal analysis
  simplified to: triode input stage (tanh soft-clip), tone stack (Baxandall
  bass/mid/treble with presence shelving), output stage (asymmetric
  hard-clip with even-harmonic bias). Optional diode-clip mode inserts a
  parallel soft-limiter between stage 2 and 3. Noise gate on input
  (Scrooge algorithm: -80 dB floor, 0.5 ms attack, 50 ms release).
  Internal 4× oversampling via polyphase half-band FIR.

cpu_budget_single_instance: "≤3.8% @ 48 kHz / 256 samples"


Parameters (YAML):

parameters:
  - name: input_gain
    range: [-12.0, +36.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: stage1_gain
    range: [0.0, 100.0]
    default: 50.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: stage2_gain
    range: [0.0, 100.0]
    default: 50.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: stage3_gain
    range: [0.0, 100.0]
    default: 30.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: tone_bass
    range: [-15.0, +15.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: tone_mid
    range: [-15.0, +15.0]
    default: -3.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: tone_treble
    range: [-15.0, +15.0]
    default: +2.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: presence
    range: [0.0, 100.0]
    default: 40.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: diode_clip_enable
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: true

  - name: gate_threshold
    range: [-90.0, -20.0]
    default: -60.0
    unit: dBFS
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-24.0, +6.0]
    default: -6.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: channel_mode
    range: [0, 2]
    default: 1
    unit: enum [Clean, Crunch, Lead]
    control: combo_box
    automation: true

preset_banks:
  - "Amp Lead Slam"
  - "Classic Rectify"
  - "Modern Tight"
  - "Gutter Grind"
  - "Saturated Death"
  - "Slam Rhythm"
  - "Boosted Crunch"
  - "Lo-Fi Grunge"
  - "Thrash Buzz"
  - "Prog Lead"
  - "Blackgate Filth"
  - "Mud Carver"


PLUGIN: Dissonance-Gen

DSP_algorithm: >
  Pitch-shift engine using phase-vocoder (FFT size 2048, hop 512) with
  configurable formant-preservation flag. Adds up to 4 detuned voices
  (±50 cents each, independent pan). Harmonic distortion layer via
  Faust-style digital waveshaper adds odd-order harmonics at specified
  ratios. Output fed through resonant comb-filter for metallic texture.
  Latency: FFT window = 2048 / SR. Reported to host via IProcessContextRequirements.

cpu_budget_single_instance: "≤5.5% @ 48 kHz / 256 samples"


Parameters (YAML):

parameters:
  - name: voices
    range: [1, 4]
    default: 2
    unit: int
    control: stepped_slider
    automation: true

  - name: voice1_detune
    range: [-50.0, +50.0]
    default: -15.0
    unit: cents
    control: rotary_knob
    automation: true

  - name: voice2_detune
    range: [-50.0, +50.0]
    default: +15.0
    unit: cents
    control: rotary_knob
    automation: true

  - name: voice3_detune
    range: [-50.0, +50.0]
    default: -30.0
    unit: cents
    control: rotary_knob
    automation: true

  - name: voice4_detune
    range: [-50.0, +50.0]
    default: +30.0
    unit: cents
    control: rotary_knob
    automation: true

  - name: voice_pan_spread
    range: [0.0, 1.0]
    default: 0.6
    unit: ratio
    control: rotary_knob
    automation: true

  - name: dissonance_amount
    range: [0.0, 100.0]
    default: 50.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: comb_feedback
    range: [0.0, 0.95]
    default: 0.3
    unit: ratio
    control: rotary_knob
    automation: true

  - name: comb_freq
    range: [50.0, 8000.0]
    default: 440.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: formant_preserve
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 0.5
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Slam-Cab

DSP_algorithm: >
  Zero-phase convolution IR loader using partitioned convolution (Gardner
  algorithm, max IR length 131072 samples). Supports up to 2 simultaneous
  IRs with blend control (A/B mix). Phase-alignment cross-correlation
  between A and B before blending to avoid comb filtering. Mono and
  stereo IR support (stereo: L+R separate convolution). Includes built-in
  high-pass 80 Hz and low-pass 12 kHz shelving trim. Latency: partitioned
  block size 64 samples (reportable to host).

cpu_budget_single_instance: "≤4.0% @ 48 kHz / 256 samples (2× IR blend)"


Parameters (YAML):

parameters:
  - name: ir_a_slot
    range: [0, 127]
    default: 0
    unit: int
    control: file_selector
    automation: false

  - name: ir_b_slot
    range: [0, 127]
    default: 1
    unit: int
    control: file_selector
    automation: false

  - name: ir_blend
    range: [0.0, 1.0]
    default: 0.5
    unit: ratio
    control: rotary_knob
    automation: true

  - name: ir_a_gain
    range: [-24.0, +6.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: ir_b_gain
    range: [-24.0, +6.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: low_cut_freq
    range: [20.0, 300.0]
    default: 80.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: high_cut_freq
    range: [3000.0, 20000.0]
    default: 12000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: stereo_mode
    range: [0, 2]
    default: 0
    unit: enum [Mono, StereoLink, StereoIndep]
    control: combo_box
    automation: false

  - name: phase_flip
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: true

  - name: output_gain
    range: [-24.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

assets:
  ir_files:
    - "SlamCab_4x12_V30_SM57_Center.wav"
    - "SlamCab_4x12_V30_SM57_Edge.wav"
    - "SlamCab_4x12_G12T75_MD421.wav"
    - "SlamCab_2x12_Greenback_Ribbon.wav"
    - "SlamCab_1x12_Alnico_Blue.wav"
    - "SlamCab_OffAxis_Blend.wav"
    - "SlamCab_Vintage_Basketweave.wav"
    - "SlamCab_Modern_Mesa.wav"


PLUGIN: Palm-Mute-Tightener

DSP_algorithm: >
  Envelope follower (peak, 0.05 ms attack, 8 ms release) feeds a 2nd-order
  parametric EQ centered at 100–250 Hz (runtime-modulated center freq)
  with negative gain (tightening). Transient detector (Laroche algorithm)
  triggers a brief 2 ms high-pass ramp to remove mud on each detected
  pick attack. Sidechain input accepted for kick-linked tightening.
  Zero-latency; all envelopes computed sample-by-sample.

cpu_budget_single_instance: "≤1.2%"


Parameters (YAML):

parameters:
  - name: tightness
    range: [0.0, 100.0]
    default: 60.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: attack_speed
    range: [0.05, 20.0]
    default: 1.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: release_speed
    range: [5.0, 200.0]
    default: 30.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: center_freq
    range: [80.0, 300.0]
    default: 160.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: bandwidth
    range: [0.3, 3.0]
    default: 1.0
    unit: oct
    control: rotary_knob
    automation: true

  - name: sidechain_enable
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: false

  - name: sidechain_gain
    range: [-24.0, +24.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 1.0
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Low-End-Stabilizer

DSP_algorithm: >
  Sub-harmonic synthesizer (pitch-detection via YIN algorithm at 10 ms
  analysis windows) generating an octave-down sine blend. Followed by
  a shelf/peak EQ bank (three bands: sub-shelf 20–60 Hz, low-peak
  60–200 Hz, upper-bass notch 200–500 Hz). Dynamic low-shelf applies
  automatic gain reduction when sub RMS exceeds a user-set threshold,
  preventing low-end bloom on hard strumming. All coefficients
  audio-rate smooth-interpolated (one-pole, τ=20 ms).

cpu_budget_single_instance: "≤2.0%"


Parameters (YAML):

parameters:
  - name: sub_synth_gain
    range: [-inf, +12.0]
    default: -6.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: sub_shelf_freq
    range: [20.0, 80.0]
    default: 40.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: sub_shelf_gain
    range: [-12.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: low_peak_freq
    range: [60.0, 200.0]
    default: 100.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: low_peak_gain
    range: [-12.0, +12.0]
    default: +2.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: low_peak_q
    range: [0.3, 5.0]
    default: 1.0
    unit: Q
    control: rotary_knob
    automation: true

  - name: upper_notch_freq
    range: [200.0, 500.0]
    default: 350.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: upper_notch_gain
    range: [-18.0, 0.0]
    default: -4.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: dynamic_threshold
    range: [-40.0, 0.0]
    default: -18.0
    unit: dBFS
    control: rotary_knob
    automation: true

  - name: dynamic_ratio
    range: [1.0, 8.0]
    default: 3.0
    unit: ratio
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-12.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true


PLUGIN: Slam-Gate

DSP_algorithm: >
  Wideband RMS detector (window 1 ms, smooth 5 ms) controls state machine:
  CLOSED → OPENING (exponential ramp) → OPEN → HOLD → CLOSING (exponential
  ramp). Optional sidechain HPF (50–500 Hz) prevents low-frequency leakage
  from triggering false opens. Hysteresis: open threshold above close
  threshold by user-set amount. Lookahead: 0–10 ms (introduces
  corresponding latency, reported to host). Stereo-linked option uses
  max(L,R) for detection. Optional frequency-selective triggering
  (bandpass sidechain filter, 50 Hz–8 kHz, 1 oct BW).

cpu_budget_single_instance: "≤0.8%"


Parameters (YAML):

parameters:
  - name: threshold
    range: [-90.0, 0.0]
    default: -50.0
    unit: dBFS
    control: rotary_knob
    automation: true

  - name: hysteresis
    range: [0.0, 20.0]
    default: 6.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: attack
    range: [0.1, 50.0]
    default: 1.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: hold
    range: [0.0, 2000.0]
    default: 100.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: release
    range: [5.0, 4000.0]
    default: 200.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: lookahead
    range: [0.0, 10.0]
    default: 0.0
    unit: ms
    control: rotary_knob
    automation: false

  - name: sidechain_hpf_freq
    range: [50.0, 500.0]
    default: 100.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: sidechain_enable
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: false

  - name: stereo_link
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: false

  - name: range
    range: [-90.0, 0.0]
    default: -inf
    unit: dB
    control: rotary_knob
    automation: true

  - name: freq_sel_freq
    range: [50.0, 8000.0]
    default: 800.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: freq_sel_enable
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: false


── DRUM PLUGINS ──────────────────────────────────────────────────────────


PLUGIN: Ping-Snare-Enhancer

DSP_algorithm: >
  Transient detection (Brecht De Man onset detector) triggers a tunable
  resonator (second-order bandpass IIR, Q 5–50) at snare fundamental
  (150–400 Hz). Resonator excitation decays at user-set rate. Parallel
  saturator adds crack harmonic content. Stereo widening via mid-side
  processing on the enhancement signal only. Zero-latency.

cpu_budget_single_instance: "≤1.0%"


Parameters (YAML):

parameters:
  - name: sensitivity
    range: [0.0, 100.0]
    default: 70.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: resonator_freq
    range: [150.0, 400.0]
    default: 240.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: resonator_q
    range: [5.0, 50.0]
    default: 20.0
    unit: Q
    control: rotary_knob
    automation: true

  - name: decay_time
    range: [10.0, 500.0]
    default: 80.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: crack_amount
    range: [0.0, 100.0]
    default: 40.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: width
    range: [0.0, 200.0]
    default: 100.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-24.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 0.6
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Gravity-Blast-Assistant

DSP_algorithm: >
  Beat-synchronised MIDI processor (VST3 IMIDI + INoteExpression). Reads
  incoming snare/kick MIDI notes, detects blast-beat patterns (alternating
  snare/kick at ≥180 BPM), auto-quantizes to session grid (16th or 32nd
  note resolution), and adds velocity slope for gravity-blast feel
  (descending velocity 127→80 over 4 strokes, then reset). Humanization:
  ±4 ms timing jitter (Gaussian, σ=1.5 ms). Optional flam-on-one mode
  inserts a -10 dB ghost note 25 ms prior to main hit. MIDI output only;
  no audio DSP path.

cpu_budget_single_instance: "≤0.3% (MIDI-only)"


Parameters (YAML):

parameters:
  - name: assist_mode
    range: [0, 2]
    default: 1
    unit: enum [Off, Quantize, FullAssist]
    control: combo_box
    automation: true

  - name: quantize_grid
    range: [0, 2]
    default: 1
    unit: enum [16th, 32nd, 64th]
    control: combo_box
    automation: true

  - name: velocity_slope
    range: [0.0, 100.0]
    default: 50.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: humanize_timing
    range: [0.0, 10.0]
    default: 2.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: humanize_velocity
    range: [0, 20]
    default: 8
    unit: MIDI-vel
    control: rotary_knob
    automation: true

  - name: flam_enable
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: true

  - name: flam_offset
    range: [5.0, 50.0]
    default: 25.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: flam_velocity
    range: [20, 90]
    default: 60
    unit: MIDI-vel
    control: rotary_knob
    automation: true

  - name: bpm_detect_min
    range: [100.0, 240.0]
    default: 180.0
    unit: BPM
    control: rotary_knob
    automation: false


PLUGIN: Kick-Thumper

DSP_algorithm: >
  Two-stage transient enhancer: (1) attack shaper uses a very fast
  compressor (0.05 ms attack, 2 ms release, ∞:1 ratio) followed by
  gain-makeup to sculpt click; (2) body enhancer: resonant bandpass
  IIR (40–120 Hz, Q 1–4) driven by envelope follower to add synthetic
  sub-thump with tunable decay (ADSR, S=0). Optional click layer:
  sine burst at 2–4 kHz for beater articulation. All parallel with
  dry signal. Zero-latency.

cpu_budget_single_instance: "≤1.5%"


Parameters (YAML):

parameters:
  - name: click_amount
    range: [0.0, 100.0]
    default: 50.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: click_freq
    range: [2000.0, 4000.0]
    default: 3000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: thump_freq
    range: [40.0, 120.0]
    default: 60.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: thump_decay
    range: [20.0, 500.0]
    default: 100.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: thump_amount
    range: [0.0, 100.0]
    default: 70.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: attack_punch
    range: [0.0, 100.0]
    default: 60.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: sub_q
    range: [1.0, 4.0]
    default: 2.0
    unit: Q
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-12.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 1.0
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Overhead-Smasher

DSP_algorithm: >
  Stereo bus compressor with RMS detection (10 ms window). Feed-forward
  topology with optional feed-back blend. Soft-knee (knee width 0–12 dB).
  Stereo-linked detection or dual-mono selectable. High-pass detector
  filter (20–200 Hz) to avoid kick-pumping. Harmonic saturation stage
  (post-compressor) for vinyl-style character. Mid-side processing mode
  with independent M/S ratios and attack/release. Zero-latency; no
  lookahead option.

cpu_budget_single_instance: "≤1.8%"


Parameters (YAML):

parameters:
  - name: threshold
    range: [-40.0, 0.0]
    default: -18.0
    unit: dBFS
    control: rotary_knob
    automation: true

  - name: ratio
    range: [1.0, 20.0]
    default: 4.0
    unit: ratio
    control: rotary_knob
    automation: true

  - name: attack
    range: [0.1, 100.0]
    default: 10.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: release
    range: [10.0, 2000.0]
    default: 200.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: knee_width
    range: [0.0, 12.0]
    default: 3.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: makeup_gain
    range: [0.0, 24.0]
    default: 6.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: saturation_drive
    range: [0.0, 100.0]
    default: 20.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: detector_hpf
    range: [20.0, 200.0]
    default: 80.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: stereo_link
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: false

  - name: ms_mode
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: false

  - name: dry_wet
    range: [0.0, 1.0]
    default: 1.0
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Cymbal-Clarifier

DSP_algorithm: >
  Multi-band transient designer targeting cymbal frequency zones:
  Band A (4–8 kHz, hi-hats), Band B (8–16 kHz, cymbals), Band C
  (2–4 kHz, ride articulation). Each band has independent attack and
  sustain transient shaper (Sonnox-style: attack detector + gain ramp,
  sustain as envelope-following variable gain). De-essing section (split-
  band detector at 6–14 kHz with dynamic EQ). Linear-phase crossover
  (FIR, 256 taps per band); latency 128 samples, reported to host.

cpu_budget_single_instance: "≤2.5%"


Parameters (YAML):

parameters:
  - name: band_a_attack
    range: [-100.0, +100.0]
    default: +20.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: band_a_sustain
    range: [-100.0, +100.0]
    default: -10.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: band_b_attack
    range: [-100.0, +100.0]
    default: +30.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: band_b_sustain
    range: [-100.0, +100.0]
    default: +10.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: band_c_attack
    range: [-100.0, +100.0]
    default: +10.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: band_c_sustain
    range: [-100.0, +100.0]
    default: 0.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: dessing_freq
    range: [6000.0, 14000.0]
    default: 9000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: dessing_depth
    range: [0.0, 20.0]
    default: 6.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-12.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 1.0
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Slam-Drum-Bus

DSP_algorithm: >
  Four-stage drum bus chain implemented as a single plugin (reduced CPU
  vs chaining). Stage 1: gentle parallel compressor (attack 30 ms,
  release 120 ms, ratio 4:1, threshold -20 dBFS). Stage 2: harmonic
  exciter (Aphex-style: signal split at 2 kHz, high band processed by
  saturator, blended back). Stage 3: stereo transient enhancer. Stage
  4: true-peak brickwall limiter (4-sample lookahead, -0.1 dBTP ceiling).
  Reporting: 4 sample lookahead to host.

cpu_budget_single_instance: "≤3.0%"


Parameters (YAML):

parameters:
  - name: comp_threshold
    range: [-40.0, 0.0]
    default: -20.0
    unit: dBFS
    control: rotary_knob
    automation: true

  - name: comp_ratio
    range: [1.0, 10.0]
    default: 4.0
    unit: ratio
    control: rotary_knob
    automation: true

  - name: comp_attack
    range: [1.0, 100.0]
    default: 30.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: comp_release
    range: [20.0, 500.0]
    default: 120.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: parallel_mix
    range: [0.0, 1.0]
    default: 0.4
    unit: ratio
    control: rotary_knob
    automation: true

  - name: exciter_drive
    range: [0.0, 100.0]
    default: 30.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: exciter_crossover
    range: [1000.0, 6000.0]
    default: 2000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: transient_attack
    range: [-100.0, +100.0]
    default: +20.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: transient_sustain
    range: [-100.0, +100.0]
    default: -10.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: limiter_ceiling
    range: [-6.0, 0.0]
    default: -0.1
    unit: dBTP
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-12.0, +6.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true


── VOCAL PLUGINS ──────────────────────────────────────────────────────────


PLUGIN: Guttural-Deepener

DSP_algorithm: >
  Pitch shift -1 to -24 semitones using high-quality time-domain pitch
  shifter (PSOLA variant with formant correction). Sub-harmonic synthesiser
  at -1 octave, sine-wave output blended in. Tube-saturation stage
  (second-order polynomial) adds warmth. Low-pass filter (variable
  2–6 kHz) for natural deepening. Mono in/out or stereo pass-through.

cpu_budget_single_instance: "≤3.5%"


Parameters (YAML):

parameters:
  - name: pitch_shift
    range: [-24.0, 0.0]
    default: -5.0
    unit: semitones
    control: rotary_knob
    automation: true

  - name: sub_blend
    range: [0.0, 100.0]
    default: 30.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: formant_shift
    range: [-6.0, +6.0]
    default: -2.0
    unit: semitones
    control: rotary_knob
    automation: true

  - name: saturation_drive
    range: [0.0, 100.0]
    default: 20.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: lowpass_freq
    range: [2000.0, 8000.0]
    default: 4000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 0.7
    unit: ratio
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-12.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true


PLUGIN: Pig-Squeal-Exciter

DSP_algorithm: >
  Harmonic exciter targeting 2–10 kHz band (bandpass split, Butterworth
  4th-order). Excited band processed by waveshaper (asymmetric tanh,
  bias offset to accentuate odd harmonics). Pitch-up modulation (LFO
  rate 0.5–20 Hz, depth 0–200 cents) for squeal character. Formant
  resonators: two user-tunable bandpass filters (Q 5–30) with gain.
  Zero-latency.

cpu_budget_single_instance: "≤2.0%"


Parameters (YAML):

parameters:
  - name: excite_drive
    range: [0.0, 100.0]
    default: 50.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: excite_low_freq
    range: [2000.0, 5000.0]
    default: 3000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: excite_high_freq
    range: [5000.0, 14000.0]
    default: 9000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: lfo_rate
    range: [0.5, 20.0]
    default: 4.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: lfo_depth
    range: [0.0, 200.0]
    default: 50.0
    unit: cents
    control: rotary_knob
    automation: true

  - name: formant1_freq
    range: [800.0, 4000.0]
    default: 1500.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: formant1_q
    range: [5.0, 30.0]
    default: 12.0
    unit: Q
    control: rotary_knob
    automation: true

  - name: formant1_gain
    range: [-12.0, +12.0]
    default: +4.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: formant2_freq
    range: [2000.0, 8000.0]
    default: 4000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: formant2_q
    range: [5.0, 30.0]
    default: 10.0
    unit: Q
    control: rotary_knob
    automation: true

  - name: formant2_gain
    range: [-12.0, +12.0]
    default: +6.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 0.6
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Vocal-Crusher

DSP_algorithm: >
  Bit-depth reducer (1–24 bit, dithered or non-dithered) + sample-rate
  reducer (decimator: hold N samples, where N = round(SR / target_SR)).
  Optional analog-noise floor (+gaussian noise, -90 to -60 dBFS).
  Pre-distortion stage (tanh), post-EQ (3-band: lo-cut, mid-boost,
  hi-cut). Wet signal blended with dry via parallel path.

cpu_budget_single_instance: "≤0.8%"


Parameters (YAML):

parameters:
  - name: bit_depth
    range: [1, 24]
    default: 8
    unit: bits
    control: stepped_slider
    automation: true

  - name: sample_rate_reduce
    range: [1000.0, 48000.0]
    default: 22050.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: pre_drive
    range: [0.0, 100.0]
    default: 20.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: noise_floor
    range: [-90.0, -60.0]
    default: -80.0
    unit: dBFS
    control: rotary_knob
    automation: true

  - name: noise_enable
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: false

  - name: dither_enable
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: false

  - name: post_lo_cut
    range: [20.0, 500.0]
    default: 80.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: post_mid_gain
    range: [-12.0, +12.0]
    default: +3.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: post_hi_cut
    range: [2000.0, 20000.0]
    default: 8000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 0.5
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Breathing-Suppressor

DSP_algorithm: >
  Wideband and band-selective noise gate with spectral model of breath
  noise. Breath-noise classifier: rolling spectral centroid estimator
  (512-sample FFT, Hann window) flags frames where centroid is in
  [2k–8k Hz] and RMS < -50 dBFS as "breath" candidates. Confirmed
  breaths trigger the gate (exponential close, 20–200 ms). Optional
  de-breath mode: replace gated segment with crossfaded room-noise
  estimated from preceding 200 ms. Zero-latency for gate mode; 50 ms
  latency for de-breath mode.

cpu_budget_single_instance: "≤1.5%"


Parameters (YAML):

parameters:
  - name: sensitivity
    range: [0.0, 100.0]
    default: 70.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: close_time
    range: [20.0, 200.0]
    default: 60.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: debreath_mode
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: false

  - name: spectral_low
    range: [1000.0, 4000.0]
    default: 2000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: spectral_high
    range: [4000.0, 12000.0]
    default: 8000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: threshold
    range: [-80.0, -30.0]
    default: -50.0
    unit: dBFS
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-6.0, +6.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true


PLUGIN: Slam-Verb

DSP_algorithm: >
  Algorithmic reverb based on Freeverb-topology extended with:
  8 comb filters (tuned for metal acoustics, short decay emphasis),
  4 all-pass filters, early reflections stage (8 tap delay line,
  0–30 ms, individually gain-weighted). Pre-delay 0–100 ms. Hi-pass
  and lo-pass damping filters. Gated mode: envelope follower triggers
  a fast fade-out after gate_length ms (Phil Collins gated reverb
  topology). Freeze mode (DSP feedback loop hold). Stereo output.

cpu_budget_single_instance: "≤2.5%"


Parameters (YAML):

parameters:
  - name: pre_delay
    range: [0.0, 100.0]
    default: 10.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: room_size
    range: [0.0, 100.0]
    default: 40.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: decay_time
    range: [0.1, 15.0]
    default: 1.2
    unit: s
    control: rotary_knob
    automation: true

  - name: damping_hpf
    range: [20.0, 2000.0]
    default: 200.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: damping_lpf
    range: [2000.0, 20000.0]
    default: 8000.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: early_level
    range: [-inf, 0.0]
    default: -6.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: tail_level
    range: [-inf, 0.0]
    default: -3.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: gated_mode
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: true

  - name: gate_length
    range: [50.0, 1000.0]
    default: 200.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: freeze
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 0.25
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Vocal-Layerer

DSP_algorithm: >
  Sample-accurate pitch-shifting and time-stretching (Rubber Band Library
  integration via bundled static lib). Generates up to 8 layers from
  mono input, each with: pitch offset (-24 to +24 semitones, fine ±100
  cents), pan, gain, formant shift. Per-layer delay line (0–500 ms) for
  timing stagger. Output summed to stereo bus. Chorus modulation per
  layer (LFO ±50 cents, 0.1–8 Hz). CPU scales linearly with active layers.

cpu_budget_single_instance: "≤1.2% per layer (8 layers = ≤9.5%)"


Parameters (YAML):

parameters:
  - name: active_layers
    range: [1, 8]
    default: 2
    unit: int
    control: stepped_slider
    automation: true

  - name: layer_pitch_1_8:  # repeated pattern for layers 1–8
    range: [-24.0, +24.0]
    default: [0.0, +7.0, -7.0, +12.0, -12.0, +4.0, -4.0, +19.0]
    unit: semitones
    control: rotary_knob
    automation: true

  - name: layer_fine_1_8:
    range: [-100.0, +100.0]
    default: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    unit: cents
    control: rotary_knob
    automation: true

  - name: layer_pan_1_8:
    range: [-1.0, +1.0]
    default: [0.0, -0.5, +0.5, -0.8, +0.8, -0.3, +0.3, 0.0]
    unit: ratio
    control: rotary_knob
    automation: true

  - name: layer_gain_1_8:
    range: [-24.0, 0.0]
    default: [0.0, -3.0, -3.0, -6.0, -6.0, -9.0, -9.0, -12.0]
    unit: dB
    control: rotary_knob
    automation: true

  - name: layer_delay_1_8:
    range: [0.0, 500.0]
    default: [0.0, 15.0, 20.0, 30.0, 45.0, 60.0, 75.0, 100.0]
    unit: ms
    control: rotary_knob
    automation: true

  - name: chorus_depth
    range: [0.0, 50.0]
    default: 15.0
    unit: cents
    control: rotary_knob
    automation: true

  - name: chorus_rate
    range: [0.1, 8.0]
    default: 0.8
    unit: Hz
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-24.0, +6.0]
    default: -6.0
    unit: dB
    control: rotary_knob
    automation: true


── UTILITY PLUGINS ──────────────────────────────────────────────────────────


PLUGIN: Sub-Drop-Generator

DSP_algorithm: >
  Pitch-envelope generator producing a sine-wave sub-drop: start pitch
  (20–200 Hz) sweeps to end pitch (20–200 Hz) over sweep_time ms via
  exponential or linear curve, configurable hold and fade. MIDI-triggered
  (Note On C1 by default, configurable) or free-running on-set detect.
  Output through low-pass filter (2nd-order Butterworth, 80–200 Hz cutoff)
  and gain envelope. Sub-bass oscillator with soft-clip (2% saturation
  for tube warmth). Stereo mono output (mono oscillator, stereo bus).

cpu_budget_single_instance: "≤0.5%"


Parameters (YAML):

parameters:
  - name: start_pitch
    range: [20.0, 200.0]
    default: 80.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: end_pitch
    range: [20.0, 200.0]
    default: 35.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: sweep_time
    range: [50.0, 4000.0]
    default: 800.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: sweep_curve
    range: [0, 1]
    default: 0
    unit: enum [Exp, Linear]
    control: combo_box
    automation: false

  - name: hold_time
    range: [0.0, 1000.0]
    default: 0.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: fade_time
    range: [10.0, 2000.0]
    default: 200.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: lowpass_cutoff
    range: [80.0, 200.0]
    default: 120.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-24.0, +6.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: trigger_midi_note
    range: [0, 127]
    default: 36
    unit: MIDI-note
    control: midi_learn
    automation: false


PLUGIN: Impact-Saturator

DSP_algorithm: >
  Parallel-path saturation: main path through 3-stage waveshaper (tanh,
  cubic-clip, fold-back), dry path preserved, blended at output. Transient
  detection (Laroche) modulates saturation depth (more drive on attack,
  less on sustain). Dynamic harmonic add: detects peaks and inserts
  brief 2nd- and 3rd-harmonic bursts. 4× oversample via polyphase FIR.

cpu_budget_single_instance: "≤2.5%"


Parameters (YAML):

parameters:
  - name: drive
    range: [0.0, 100.0]
    default: 50.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: shape_mode
    range: [0, 2]
    default: 0
    unit: enum [Tanh, Cubic, Fold]
    control: combo_box
    automation: true

  - name: transient_track
    range: [0.0, 100.0]
    default: 60.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: harmonic_2nd
    range: [0.0, 100.0]
    default: 30.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: harmonic_3rd
    range: [0.0, 100.0]
    default: 20.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: output_gain
    range: [-12.0, +12.0]
    default: -3.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: dry_wet
    range: [0.0, 1.0]
    default: 0.6
    unit: ratio
    control: rotary_knob
    automation: true


PLUGIN: Stereo-Widener

DSP_algorithm: >
  Mid-Side encoder/decoder with independent M/S gain. Haas-effect micro-
  delay (0–25 ms, applied to side channel). Frequency-dependent width:
  width above crossover_freq, narrow below (preserves mono low end).
  Correlation meter output (VST3 IParameterChanges for metering).
  Mono-compatible safety limiter: auto-reduce side gain if correlation
  drops below -0.3. Phase-rotation option (all-pass chain, 6 stages)
  for perceived width without timing offset.

cpu_budget_single_instance: "≤0.8%"


Parameters (YAML):

parameters:
  - name: width
    range: [0.0, 200.0]
    default: 100.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: mid_gain
    range: [-12.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: side_gain
    range: [-12.0, +12.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: haas_delay
    range: [0.0, 25.0]
    default: 0.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: crossover_freq
    range: [80.0, 500.0]
    default: 200.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: freq_dep_width
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: false

  - name: mono_safe
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: false

  - name: phase_rotation
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: false


PLUGIN: Mix-Glue

DSP_algorithm: >
  Vintage bus-compression emulation: VCA topology (feed-forward RMS,
  10 ms window). Fixed program-dependent release curve: initial fast
  release (user-set ms) → auto-release (2× input RMS decay). Sidechain
  HPF (60–250 Hz). Automatic makeup gain (computed from measured GR).
  Saturation stage emulating transformer saturation (frequency-dependent
  harmonic generation, bias at 60 Hz). Mix knob (parallel compression).
  Stereo-linked or dual-mono. Gain-reduction meter (VST3 parameter).

cpu_budget_single_instance: "≤1.5%"


Parameters (YAML):

parameters:
  - name: threshold
    range: [-40.0, 0.0]
    default: -15.0
    unit: dBFS
    control: rotary_knob
    automation: true

  - name: ratio
    range: [1.0, 10.0]
    default: 2.0
    unit: ratio
    control: rotary_knob
    automation: true

  - name: attack
    range: [0.1, 30.0]
    default: 5.0
    unit: ms
    control: stepped_slider
    automation: true

  - name: release
    range: [40.0, 1200.0]
    default: 200.0
    unit: ms
    control: stepped_slider
    automation: true

  - name: auto_release
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: false

  - name: makeup_gain
    range: [0.0, 20.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: auto_makeup
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: false

  - name: sidechain_hpf
    range: [60.0, 250.0]
    default: 100.0
    unit: Hz
    control: rotary_knob
    automation: true

  - name: saturation_amount
    range: [0.0, 100.0]
    default: 25.0
    unit: "%"
    control: rotary_knob
    automation: true

  - name: parallel_mix
    range: [0.0, 1.0]
    default: 0.5
    unit: ratio
    control: rotary_knob
    automation: true

  - name: stereo_link
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: false


PLUGIN: Slam-Limiter

DSP_algorithm: >
  True-peak brickwall limiter with 4-sample lookahead (ISP detection via
  4× oversampled peak detection). Release: configurable + auto mode
  (Wessel-algorithm: per-frequency-band release scaling). Soft saturation
  option (when ISP exceeds ceiling by ≤2 dB, use soft-clip instead of
  hard-clip). Integrated LUFS meter (momentary, short-term, integrated,
  LRA, per EBU R128). True-peak output meter. Latency = 4 samples,
  reported to host. Stereo and mono variants.

cpu_budget_single_instance: "≤1.0%"


Parameters (YAML):

parameters:
  - name: ceiling
    range: [-12.0, 0.0]
    default: -0.1
    unit: dBTP
    control: rotary_knob
    automation: true

  - name: release
    range: [1.0, 1000.0]
    default: 50.0
    unit: ms
    control: rotary_knob
    automation: true

  - name: auto_release
    range: [0, 1]
    default: 1
    unit: bool
    control: toggle_button
    automation: false

  - name: soft_clip
    range: [0, 1]
    default: 0
    unit: bool
    control: toggle_button
    automation: false

  - name: input_gain
    range: [-12.0, +18.0]
    default: 0.0
    unit: dB
    control: rotary_knob
    automation: true

  - name: lufs_target
    range: [-30.0, -5.0]
    default: -14.0
    unit: LUFS
    control: rotary_knob
    automation: false


PLUGIN: Project-Organizer

DSP_algorithm: >
  Audio-passthrough only (0 dB gain, unity). DSP = null. All logic is
  metadata/DAW-integration only via VST3 IEditController parameter banks:
  stores project notes (UTF-8 string param), color tags, track category,
  BPM/key metadata. Exposes REAPER-compatible named parameters for
  automation lane annotation. No audio processing; CPU budget ~0%.

cpu_budget_single_instance: "≈0.0%"


Parameters (YAML):

parameters:
  - name: project_bpm
    range: [40.0, 300.0]
    default: 120.0
    unit: BPM
    control: number_field
    automation: false

  - name: project_key
    range: [0, 23]
    default: 0
    unit: enum [C,C#,D,D#,E,F,F#,G,G#,A,A#,B + minor variants]
    control: combo_box
    automation: false

  - name: track_category
    range: [0, 6]
    default: 0
    unit: enum [Guitar, Drums, Vocals, Bass, Keys, FX, Master]
    control: combo_box
    automation: false

  - name: color_tag
    range: [0, 15]
    default: 0
    unit: int
    control: color_picker
    automation: false

  - name: notes_string
    range: ["", 1024 chars]
    default: ""
    unit: string
    control: text_area
    automation: false


SECTION 3 — AUTO-DRUMMER AGENT

{
  "agent_id": "AutoDrummerAgent_v1",
  "description": "MIDI generation engine for sample-accurate drum programming in REAPER",
  "dsp_requirements": {
    "midi_resolution": "960 PPQ (REAPER default)",
    "timing_jitter_target_ms": 0,
    "humanization_engine": "gaussian_stochastic",
    "tempo_sync": "VST3 IProcessContext::tempo + barStartPos",
    "quantize_grid_options": ["1/4", "1/8", "1/16", "1/32", "1/32T", "1/64"]
  },
  "midi_map": {
    "kick": 36,
    "snare": 38,
    "ghost_snare": 40,
    "hihat_closed": 42,
    "hihat_open": 46,
    "hihat_pedal": 44,
    "crash_l": 49,
    "crash_r": 57,
    "ride_bow": 51,
    "ride_bell": 53,
    "ride_edge": 59,
    "china": 52,
    "tom_high": 48,
    "tom_mid": 47,
    "tom_low": 45,
    "floor_tom_hi": 43,
    "floor_tom_low": 41,
    "splash": 55
  },
  "humanization_parameters": {
    "timing_jitter_ms": {
      "range": [0.0, 10.0],
      "default": 2.0,
      "distribution": "gaussian",
      "sigma": 1.5
    },
    "velocity_jitter": {
      "range": [0, 25],
      "default": 8,
      "distribution": "gaussian",
      "sigma": 4
    },
    "flam_probability": {
      "range": [0.0, 1.0],
      "default": 0.05
    },
    "ghost_note_probability": {
      "range": [0.0, 1.0],
      "default": 0.15
    },
    "ghost_velocity_range": [20, 55],
    "microtiming_style": {
      "options": ["behind_beat", "on_beat", "ahead_beat"],
      "default": "behind_beat"
    },
    "swing_amount": {
      "range": [0.0, 100.0],
      "default": 0.0,
      "unit": "percent"
    }
  },
  "velocity_curves": {
    "slam_accent": [127, 110, 120, 95, 127, 105, 115, 90],
    "blast_descend": [127, 115, 105, 90, 80, 127, 115, 100],
    "groove_pocket": [100, 75, 95, 70, 105, 80, 90, 65],
    "even_machine": [100, 100, 100, 100, 100, 100, 100, 100],
    "dynamic_swell": [60, 70, 80, 90, 100, 110, 120, 127]
  },
  "fill_logic": {
    "fill_trigger": "every_N_bars",
    "fill_interval_bars_options": [2, 4, 8, 16],
    "fill_interval_default": 4,
    "fill_length_options_beats": [0.5, 1, 2, 4],
    "fill_types": [
      "single_stroke_roll",
      "double_stroke_roll",
      "flam_tap",
      "tom_cascade",
      "china_crash_end",
      "blast_fill",
      "broken_32nd"
    ],
    "fill_probability": 0.85,
    "pre_fill_build": true,
    "post_fill_accent": true
  },
  "genre_templates": [
    {
      "id": "SC_T01",
      "name": "Slamcore_Standard",
      "bpm_range": [130, 180],
      "time_signature": "4/4",
      "kick_pattern": "MIDI: 36 at 1.0, 2.5, 3.0, 4.5 (8th subdivisions)",
      "snare_pattern": "MIDI: 38 at 2.0, 4.0; ghost 40 at 2.5, 3.5",
      "hihat_pattern": "alternating closed 42 at 16th notes",
      "velocity_curve": "slam_accent",
      "swing": 0.0,
      "fill_type": "blast_fill"
    },
    {
      "id": "SC_T02",
      "name": "Slamcore_Breakdown",
      "bpm_range": [60, 100],
      "time_signature": "4/4",
      "kick_pattern": "MIDI: 36 at 1.0, 1.75, 3.0, 3.75 (syncopated 16th)",
      "snare_pattern": "MIDI: 38 at 2.0, 4.0 with rim 40 at 2.5, 3.5",
      "hihat_pattern": "open 46 at 2.0, closed 42 at all other 8ths",
      "velocity_curve": "dynamic_swell",
      "swing": 0.0,
      "fill_type": "tom_cascade"
    },
    {
      "id": "SC_T03",
      "name": "Gravity_Blast",
      "bpm_range": [180, 260],
      "time_signature": "4/4",
      "kick_pattern": "MIDI: 36 alternating with 38 at 32nd notes",
      "snare_pattern": "MIDI: 38 at every other 32nd (gravity topology)",
      "hihat_pattern": "none (feet only)",
      "velocity_curve": "blast_descend",
      "swing": 0.0,
      "fill_type": "single_stroke_roll"
    },
    {
      "id": "SC_T04",
      "name": "Slam_Half_Time",
      "bpm_range": [80, 140],
      "time_signature": "4/4",
      "kick_pattern": "MIDI: 36 at 1.0, 3.5",
      "snare_pattern": "MIDI: 38 at 3.0 (half-time feel)",
      "hihat_pattern": "closed 42 at 8th notes",
      "velocity_curve": "groove_pocket",
      "swing": 15.0,
      "fill_type": "broken_32nd"
    },
    {
      "id": "SC_T05",
      "name": "Death_Standard",
      "bpm_range": [160, 220],
      "time_signature": "4/4",
      "kick_pattern": "MIDI: 36 at 1.0, 1.5, 2.0, 3.0, 3.5 (death metal kick)",
      "snare_pattern": "MIDI: 38 at 2.0, 4.0; china 52 at 1.0",
      "hihat_pattern": "alternating 42/46 at 16th",
      "velocity_curve": "slam_accent",
      "swing": 0.0,
      "fill_type": "blast_fill"
    },
    {
      "id": "SC_T06",
      "name": "Deathcore_Stomp",
      "bpm_range": [100, 160],
      "time_signature": "4/4",
      "kick_pattern": "MIDI: 36 pattern: 1.0,1.25,1.5,2.0,2.25,3.0,3.25,3.5,4.0",
      "snare_pattern": "MIDI: 38 at 2.0, 4.0; extra 38 at 3.75 (stomp feel)",
      "hihat_pattern": "closed 42 at 8th notes + open 46 at beat 3",
      "velocity_curve": "slam_accent",
      "swing": 0.0,
      "fill_type": "china_crash_end"
    },
    {
      "id": "SC_T07",
      "name": "Polyrhythm_Slam",
      "bpm_range": [120, 180],
      "time_signature": "4/4",
      "kick_pattern": "MIDI: 36 at dotted-8th grid (3-against-4)",
      "snare_pattern": "MIDI: 38 at beat 2 and 4",
      "hihat_pattern": "triplet 42 at 8th-triplets",
      "velocity_curve": "groove_pocket",
      "swing": 0.0,
      "fill_type": "flam_tap"
    },
    {
      "id": "SC_T08",
      "name": "Slam_3_4",
      "bpm_range": [100, 160],
      "time_signature": "3/4",
      "kick_pattern": "MIDI: 36 at 1.0, 2.5",
      "snare_pattern": "MIDI: 38 at 2.0, 3.0",
      "hihat_pattern": "closed 42 at 8th notes",
      "velocity_curve": "even_machine",
      "swing": 0.0,
      "fill_type": "double_stroke_roll"
    }
  ],
  "export": {
    "formats": ["MIDI_type1", "REAPER_item"],
    "reaper_item_insert_api": "reaper.InsertMediaSection() + MIDI via PCM_SOURCE",
    "channel_assign": "GM_standard + custom_slamcore_map.json",
    "bar_length_options": [1, 2, 4, 8, 16],
    "loop_enable": true
  }
}


SECTION 4 — TASK AGENT

{
  "agent_id": "TaskAgent_v1",
  "interface": "chat_command",
  "atom_integration": "Atom Editor + reaper-api-bridge via ReaScript OSC",
  "command_grammar": {
    "syntax": "<VERB> [TARGET] [MODIFIER] [VALUE]",
    "verbs": ["setup", "load", "apply", "set", "create", "remove", "export", "route", "arm", "bounce"],
    "targets": ["track", "fx_chain", "plugin", "template", "preset", "bus", "send", "marker", "region", "item"],
    "modifiers": ["with", "using", "on", "at", "for", "from", "to"],
    "examples": [
      "setup guitar track with slamcore_crushing_chain",
      "load preset Modern_Djent on Slam-Chugger",
      "set drive to 75 on Gutter-Drive track 3",
      "create drum bus with Slam-Drum-Bus and Slam-Limiter",
      "apply template Slamcore_Standard to AutoDrummerAgent",
      "route track 5 to mix_bus with send level -6dB",
      "export region verse_1 as stems",
      "arm track 2 for recording at 48kHz",
      "bounce track 4 item to new_track with tail 2s",
      "remove fx Gutter-Drive from track 3"
    ]
  },
  "intent_handlers": [
    {
      "intent": "setup_guitar_chain",
      "trigger_phrases": [
        "set up a slamcore guitar track",
        "create guitar chain",
        "slamcore guitar rig",
        "build crushing pedal chain"
      ],
      "actions": [
        "create_track(name='Guitar_DI', color=RED)",
        "insert_plugin(Slam-Gate, slot=1)",
        "insert_plugin(Gutter-Drive, slot=2)",
        "insert_plugin(Slam-Chugger, slot=3)",
        "insert_plugin(Palm-Mute-Tightener, slot=4)",
        "insert_plugin(Slam-Cab, slot=5)",
        "insert_plugin(Low-End-Stabilizer, slot=6)",
        "load_preset(Slam-Gate, 'Tight_Metal')",
        "load_preset(Gutter-Drive, 'Modern_Tight')",
        "load_preset(Slam-Chugger, 'Modern_Djent')",
        "load_preset(Slam-Cab, 'SlamCab_4x12_V30_SM57_Center')",
        "set_track_color(RED)",
        "send_to_bus('Guitar_Bus')"
      ]
    },
    {
      "intent": "setup_drum_template",
      "trigger_phrases": [
        "create drum session",
        "set up drums",
        "build slamcore drum rig"
      ],
      "actions": [
        "create_track(name='Kick', color=ORANGE)",
        "create_track(name='Snare', color=ORANGE)",
        "create_track(name='OH_L', color=ORANGE)",
        "create_track(name='OH_R', color=ORANGE)",
        "create_track(name='Drum_Bus', color=DARK_ORANGE)",
        "insert_plugin(Kick-Thumper, track='Kick', slot=1)",
        "insert_plugin(Ping-Snare-Enhancer, track='Snare', slot=1)",
        "insert_plugin(Overhead-Smasher, track='OH_L+OH_R', slot=1)",
        "insert_plugin(Slam-Drum-Bus, track='Drum_Bus', slot=1)",
        "route_all_drum_tracks_to('Drum_Bus')",
        "insert_AutoDrummerAgent(track='MIDI_Drums')"
      ]
    },
    {
      "intent": "load_preset",
      "trigger_phrases": [
        "load preset",
        "apply preset",
        "use preset"
      ],
      "actions": [
        "resolve_track_or_plugin_target()",
        "enumerate_available_presets(plugin)",
        "load_vst3_preset(plugin, preset_name)"
      ]
    },
    {
      "intent": "set_parameter",
      "trigger_phrases": [
        "set [param] to [value]",
        "change [param] to [value]",
        "adjust [param]"
      ],
      "actions": [
        "resolve_plugin_target()",
        "validate_parameter_name(snake_case)",
        "clamp_value_to_range()",
        "set_vst3_parameter(plugin, param_id, normalized_value)",
        "confirm_to_user(param, value, unit)"
      ]
    },
    {
      "intent": "export_stems",
      "trigger_phrases": [
        "export stems",
        "bounce stems",
        "render tracks"
      ],
      "actions": [
        "enumerate_tracks()",
        "set_render_matrix(selected_or_all)",
        "configure_render_settings(format=WAV_32F, SR=48000)",
        "execute_reaper_render_action(41207)",
        "report_output_paths()"
      ]
    }
  ],
  "error_handling": {
    "unknown_plugin": "respond: 'Plugin [name] not found in SlamcoreProSuite catalog'",
    "out_of_range_value": "respond: 'Value [v] out of range for [param]. Valid range: [min]–[max] [unit]'",
    "track_not_found": "respond: 'No track matching [name] found. Available tracks: [list]'"
  }
}


SECTION 5 — REAPER TEMPLATES

5.1 — TEMPLATE: Demo

File: SlamcoreDemo.RPP
Description: Single-instrument demo layout for plugin testing

# REAPER RPP PSEUDO-TEMPLATE (text representation)
# Load via REAPER File > Open Project

[PROJECT]
  TEMPO 140.000 4 4
  SAMPLERATE 48000
  GRID 0.125  ; 16th note grid

[TRACK "Guitar_Demo"]
  COLOR 16711680  ; Red
  FX_CHAIN
    VST3 "Slam-Gate"      PRESET="Tight_Metal"
    VST3 "Gutter-Drive"   PRESET="Amp_Lead_Slam"
    VST3 "Slam-Chugger"   PRESET="Modern_Djent"
    VST3 "Slam-Cab"       PRESET="SlamCab_4x12_V30_SM57_Center"
  SENDS
    DEST "Master_Bus" -6.0dB

[TRACK "Drums_Demo"]
  COLOR 16737280  ; Orange
  FX_CHAIN
    VST3 "Slam-Drum-Bus"  PRESET="Default"
    VST3 "Slam-Limiter"   PRESET="Default"
  SENDS
    DEST "Master_Bus" -3.0dB

[TRACK "Master_Bus"]
  COLOR 0xFFFFFF
  FX_CHAIN
    VST3 "Mix-Glue"       PRESET="Default"
    VST3 "Slam-Limiter"   PRESET="-0.1dBTP"
  MASTER_SEND 1

[MARKERS]
  MARKER 1 0.000  "Start"
  MARKER 2 8.000  "Verse"
  MARKER 3 16.000 "Chorus"
  MARKER 4 24.000 "End"

[REGIONS]
  REGION 1 0.000 4.000  "Intro"
  REGION 2 4.000 16.000 "Verse_1"
  REGION 3 16.000 24.000 "Chorus_1"


5.2 — TEMPLATE: Tracking

File: SlamcoreTracking.RPP
Description: Full multi-track recording layout for tracking sessions

[PROJECT]
  TEMPO 140.000 4 4
  SAMPLERATE 48000
  GRID 0.0625  ; 32nd note grid for MIDI accuracy

[TRACK_GROUP "DRUMS"]
  [TRACK "Kick"]
    COLOR Orange; INPUT mono_1; ARM 1; MONITOR 1
    FX_CHAIN: VST3 "Kick-Thumper" PRESET="Slam_Kick"

  [TRACK "Snare_Top"]
    COLOR Orange; INPUT mono_2; ARM 1
    FX_CHAIN: VST3 "Ping-Snare-Enhancer" PRESET="Crack_Snap"

  [TRACK "Snare_Bot"]
    COLOR Orange; INPUT mono_3; ARM 1

  [TRACK "HH"]
    COLOR Orange; INPUT mono_4; ARM 1

  [TRACK "OH_L"]
    COLOR Orange; INPUT mono_5; ARM 1

  [TRACK "OH_R"]
    COLOR Orange; INPUT mono_6; ARM 1

  [TRACK "Room"]
    COLOR Orange; INPUT stereo_7_8; ARM 1

  [TRACK "Drum_Bus"]
    COLOR DarkOrange
    FX_CHAIN
      VST3 "Overhead-Smasher"
      VST3 "Slam-Drum-Bus"
    RECEIVES: Kick, Snare_Top, Snare_Bot, HH, OH_L, OH_R, Room

[TRACK_GROUP "GUITARS"]
  [TRACK "Gtr_DI_L"]
    COLOR Red; INPUT mono_9; ARM 1
    FX_CHAIN
      VST3 "Slam-Gate"
      VST3 "Gutter-Drive"
      VST3 "Slam-Chugger"
      VST3 "Palm-Mute-Tightener"
      VST3 "Slam-Cab"

  [TRACK "Gtr_DI_R"]
    COLOR Red; INPUT mono_10; ARM 1
    FX_CHAIN
      VST3 "Slam-Gate"
      VST3 "Gutter-Drive" PARAM drive=same_as_Gtr_DI_L
      VST3 "Slam-Chugger"
      VST3 "Palm-Mute-Tightener"
      VST3 "Slam-Cab"

  [TRACK "Guitar_Bus"]
    COLOR DarkRed
    FX_CHAIN
      VST3 "Low-End-Stabilizer"
      VST3 "Stereo-Widener"
    RECEIVES: Gtr_DI_L, Gtr_DI_R

[TRACK_GROUP "VOCALS"]
  [TRACK "Lead_Vox"]
    COLOR Purple; INPUT mono_11; ARM 1
    FX_CHAIN
      VST3 "Breathing-Suppressor"
      VST3 "Slam-Gate"
      VST3 "Guttural-Deepener"

  [TRACK "Vox_Bus"]
    COLOR DarkPurple
    FX_CHAIN
      VST3 "Vocal-Crusher"
      VST3 "Slam-Verb"
    RECEIVES: Lead_Vox

[TRACK "MIDI_Drums"]
  COLOR Cyan; MIDI_INPUT all; ARM 1
  FX_CHAIN
    VST3 "Gravity-Blast-Assistant"

[TRACK "Master_Bus"]
  FX_CHAIN
    VST3 "Mix-Glue"
    VST3 "Slam-Limiter" PARAM ceiling=-0.1
  RECEIVES: Drum_Bus, Guitar_Bus, Vox_Bus, MIDI_Drums
  MASTER_SEND 1

[MARKERS]
  MARKER 1 0.000   "RecStart"
  MARKER 2 2.000   "Intro"
  MARKER 3 10.000  "Verse"
  MARKER 4 18.000  "PreChorus"
  MARKER 5 22.000  "Chorus"
  MARKER 6 30.000  "Bridge"
  MARKER 7 38.000  "Outro"
  MARKER 8 46.000  "End"


5.3 — TEMPLATE: Mixdown

File: SlamcoreMixdown.RPP
Description: Fully-routed mixdown project; all FX loaded, automation lanes pre-built

[PROJECT]
  TEMPO 140.000 4 4
  SAMPLERATE 48000
  BITDEPTH 32
  RENDERPATH "./Renders/"

[TRACK "Kick_Proc"]
  FX_CHAIN
    VST3 "Kick-Thumper"        PRESET="Slam_Kick_Final"
    VST3 "Impact-Saturator"    PRESET="Punch"

[TRACK "Snare_Proc"]
  FX_CHAIN
    VST3 "Ping-Snare-Enhancer" PRESET="Crack_Snap"
    VST3 "Slam-Gate"           PARAM lookahead=2.0

[TRACK "OH_Proc"] STEREO
  FX_CHAIN
    VST3 "Cymbal-Clarifier"
    VST3 "Overhead-Smasher"

[TRACK "Drum_Bus"]
  FX_CHAIN
    VST3 "Slam-Drum-Bus"
    VST3 "Sub-Drop-Generator"  ; For transitions
    VST3 "Stereo-Widener"      PRESET="Drum_Width"

[TRACK "Gtr_L_Proc"]
  FX_CHAIN
    VST3 "Slam-Gate"
    VST3 "Gutter-Drive"        PRESET="Modern_Tight"
    VST3 "Slam-Chugger"        PRESET="Modern_Djent"
    VST3 "Dissonance-Gen"      PRESET="Subtle_Width"
    VST3 "Slam-Cab"            PRESET="SlamCab_4x12_V30_SM57_Center"
    VST3 "Palm-Mute-Tightener"
    VST3 "Low-End-Stabilizer"

[TRACK "Gtr_R_Proc"]
  FX_CHAIN
    ; Mirror of Gtr_L with phase-inverted cab (IR B)

[TRACK "Guitar_Bus"]
  FX_CHAIN
    VST3 "Mix-Glue"            PRESET="Guitar_Bus_Glue"
    VST3 "Stereo-Widener"      PRESET="Guitar_Wide"

[TRACK "Lead_Vox_Proc"]
  FX_CHAIN
    VST3 "Breathing-Suppressor"
    VST3 "Guttural-Deepener"   PRESET="Deep_Slam"
    VST3 "Vocal-Crusher"       PRESET="Lo_Fi_Crunch"
    VST3 "Pig-Squeal-Exciter"  PRESET="Squeal_Light"
    VST3 "Slam-Verb"           PRESET="Gated_Metal"
    VST3 "Vocal-Layerer"       PRESET="Wide_3Layer"

[TRACK "Vox_Bus"]
  FX_CHAIN
    VST3 "Mix-Glue"

[TRACK "FX_Sends"]
  ; Parallel reverb return
  FX_CHAIN
    VST3 "Slam-Verb"           PRESET="Huge_Cave"

[TRACK "Master_Bus"]
  FX_CHAIN
    VST3 "Mix-Glue"            PRESET="Master_Glue"
    VST3 "Impact-Saturator"    PRESET="Tape_Sat"
    VST3 "Stereo-Widener"      PRESET="Master_Width"
    VST3 "Slam-Limiter"        PRESET="Streaming_-14LUFS"
  MASTER_SEND 1

[AUTOMATION_LANES]
  ; Pre-built lanes on key parameters
  "Gtr_L_Proc/Slam-Chugger/chug_tightness" WRITE_ENABLE
  "Gtr_L_Proc/Slam-Gate/threshold"          WRITE_ENABLE
  "Lead_Vox_Proc/Guttural-Deepener/dry_wet" WRITE_ENABLE
  "Master_Bus/Slam-Limiter/input_gain"       WRITE_ENABLE

[RENDER_SETTINGS]
  FORMAT  WAV
  BITDEPTH 32
  SAMPLERATE 48000
  NORMALIZE 0
  TAIL 2.0
  RENDER_STEMS 1


SECTION 6 — BUILD INSTRUCTIONS

6.1 — Repository Layout

SlamcoreProSuite/
├── CMakeLists.txt                  # Root CMake; scans all plugins
├── cmake/
│   ├── FindVST3SDK.cmake
│   ├── FindJUCE.cmake
│   ├── Slamcore_Helpers.cmake      # Macro: add_slamcore_plugin()
│   └── Packaging.cmake
├── extern/
│   ├── VST3_SDK/                   # git submodule: steinbergmedia/vst3sdk
│   ├── JUCE/                       # git submodule: juce-framework/JUCE
│   └── rubberband/                 # static lib for Vocal-Layerer
├── shared/
│   ├── SlamcoreDSP/                # shared DSP utilities (filters, waveshapers)
│   │   ├── Filters.h / .cpp
│   │   ├── Waveshapers.h / .cpp
│   │   ├── Envelopes.h / .cpp
│   │   └── Convolution.h / .cpp
│   └── SlamcoreMIDI/               # shared MIDI utilities
│       ├── MIDIMap.h
│       └── GrooveEngine.h / .cpp
├── plugins/
│   ├── guitar/
│   │   ├── SlamChugger/
│   │   ├── GutterDrive/
│   │   ├── DissonanceGen/
│   │   ├── SlamCab/
│   │   ├── PalmMuteTightener/
│   │   ├── LowEndStabilizer/
│   │   └── SlamGate/
│   ├── drums/
│   │   ├── PingSnareEnhancer/
│   │   ├── GravityBlastAssistant/
│   │   ├── KickThumper/
│   │   ├── OverheadSmasher/
│   │   ├── CymbalClarifier/
│   │   └── SlamDrumBus/
│   ├── vocals/
│   │   ├── GutturalDeepener/
│   │   ├── PigSquealExciter/
│   │   ├── VocalCrusher/
│   │   ├── BreathingSuppressor/
│   │   ├── SlamVerb/
│   │   └── VocalLayerer/
│   └── utilities/
│       ├── SubDropGenerator/
│       ├── ImpactSaturator/
│       ├── StereoWidener/
│       ├── MixGlue/
│       ├── SlamLimiter/
│       └── ProjectOrganizer/
├── agents/
│   ├── AutoDrummerAgent/
│   │   ├── MIDIEngine.h / .cpp
│   │   └── GrooveTemplates.json
│   └── TaskAgent/
│       ├── IntentParser.h / .cpp
│       └── CommandExecutor.h / .cpp
├── assets/
│   ├── ir/                         # Cabinet IR WAV files
│   ├── presets/                    # VST3 .vstpreset files
│   └── templates/                  # REAPER .RPP templates
├── tests/
│   ├── dsp/
│   │   ├── test_waveshaper.cpp
│   │   ├── test_filters.cpp
│   │   ├── test_convolution.cpp
│   │   └── test_vectors/           # bit-exact reference WAV files
│   └── integration/
│       ├── test_latency.cpp
│       └── test_vst3_scan.cpp
├── installer/
│   ├── windows/
│   │   ├── SlamcoreInstaller.iss   # Inno Setup script
│   │   └── Resources/
│   └── macos/
│       ├── SlamcoreInstaller.pkgproj  # Packages.app project
│       └── Resources/
└── README.md


6.2 — Root CMakeLists.txt

cmake_minimum_required(VERSION 3.26)
project(SlamcoreProSuite VERSION 1.0.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ── Paths ──────────────────────────────────────────────────────────────────
set(VST3_SDK_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/extern/VST3_SDK"
    CACHE PATH "Path to VST3 SDK root")
set(JUCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/extern/JUCE"
    CACHE PATH "Path to JUCE root")

# ── JUCE ───────────────────────────────────────────────────────────────────
add_subdirectory("${JUCE_ROOT}" JUCE EXCLUDE_FROM_ALL)

# ── VST3 SDK ───────────────────────────────────────────────────────────────
# VST3 SDK ships its own CMakeLists; include only necessary targets
set(SMTG_ADD_VST3_PLUGINS_SAMPLES OFF CACHE BOOL "" FORCE)
set(SMTG_ADD_VSTGUI_SUPPORT       ON  CACHE BOOL "" FORCE)
add_subdirectory("${VST3_SDK_ROOT}" VST3_SDK EXCLUDE_FROM_ALL)

# ── Shared DSP lib ─────────────────────────────────────────────────────────
add_library(SlamcoreDSP STATIC
    shared/SlamcoreDSP/Filters.cpp
    shared/SlamcoreDSP/Waveshapers.cpp
    shared/SlamcoreDSP/Envelopes.cpp
    shared/SlamcoreDSP/Convolution.cpp
    shared/SlamcoreMIDI/GrooveEngine.cpp
)
target_include_directories(SlamcoreDSP PUBLIC shared/)
target_link_libraries(SlamcoreDSP PRIVATE
    juce::juce_dsp
    juce::juce_audio_basics
)

# ── Macro: add_slamcore_plugin ─────────────────────────────────────────────
include(cmake/Slamcore_Helpers.cmake)

# ── All plugins ────────────────────────────────────────────────────────────
add_subdirectory(plugins/guitar/SlamChugger)
add_subdirectory(plugins/guitar/GutterDrive)
add_subdirectory(plugins/guitar/DissonanceGen)
add_subdirectory(plugins/guitar/SlamCab)
add_subdirectory(plugins/guitar/PalmMuteTightener)
add_subdirectory(plugins/guitar/LowEndStabilizer)
add_subdirectory(plugins/guitar/SlamGate)
add_subdirectory(plugins/drums/PingSnareEnhancer)
add_subdirectory(plugins/drums/GravityBlastAssistant)
add_subdirectory(plugins/drums/KickThumper)
add_subdirectory(plugins/drums/OverheadSmasher)
add_subdirectory(plugins/drums/CymbalClarifier)
add_subdirectory(plugins/drums/SlamDrumBus)
add_subdirectory(plugins/vocals/GutturalDeepener)
add_subdirectory(plugins/vocals/PigSquealExciter)
add_subdirectory(plugins/vocals/VocalCrusher)
add_subdirectory(plugins/vocals/BreathingSuppressor)
add_subdirectory(plugins/vocals/SlamVerb)
add_subdirectory(plugins/vocals/VocalLayerer)
add_subdirectory(plugins/utilities/SubDropGenerator)
add_subdirectory(plugins/utilities/ImpactSaturator)
add_subdirectory(plugins/utilities/StereoWidener)
add_subdirectory(plugins/utilities/MixGlue)
add_subdirectory(plugins/utilities/SlamLimiter)
add_subdirectory(plugins/utilities/ProjectOrganizer)

# ── Tests ──────────────────────────────────────────────────────────────────
enable_testing()
add_subdirectory(tests)

# ── Packaging ──────────────────────────────────────────────────────────────
include(cmake/Packaging.cmake)


6.3 — Slamcore_Helpers.cmake (Macro)

# cmake/Slamcore_Helpers.cmake
# Wraps JUCE's juce_add_plugin for VST3 targets.
# Usage:
#   add_slamcore_plugin(
#     TARGET_NAME SlamChugger
#     PLUGIN_NAME "Slam-Chugger"
#     MANUFACTURER_NAME "SlamcoreDev"
#     MANUFACTURER_CODE ScDv
#     PLUGIN_CODE ScCg
#     SOURCES SlamChugger.cpp SlamChuggerProcessor.cpp SlamChuggerEditor.cpp
#   )

macro(add_slamcore_plugin)
  cmake_parse_arguments(ARG
    ""
    "TARGET_NAME;PLUGIN_NAME;MANUFACTURER_NAME;MANUFACTURER_CODE;PLUGIN_CODE"
    "SOURCES"
    ${ARGN}
  )

  juce_add_plugin(${ARG_TARGET_NAME}
    COMPANY_NAME        "${ARG_MANUFACTURER_NAME}"
    PLUGIN_MANUFACTURER_CODE ${ARG_MANUFACTURER_CODE}
    PLUGIN_CODE         ${ARG_PLUGIN_CODE}
    FORMATS             VST3
    PRODUCT_NAME        "${ARG_PLUGIN_NAME}"
    IS_SYNTH            FALSE
    NEEDS_MIDI_INPUT    FALSE
    NEEDS_MIDI_OUTPUT   FALSE
    IS_MIDI_EFFECT      FALSE
    VST3_AUTO_MANIFEST  TRUE
  )

  target_sources(${ARG_TARGET_NAME} PRIVATE ${ARG_SOURCES})

  target_compile_definitions(${ARG_TARGET_NAME}
    PUBLIC
      JUCE_WEB_BROWSER=0
      JUCE_USE_CURL=0
      JUCE_VST3_CAN_REPLACE_VST2=0
  )

  target_link_libraries(${ARG_TARGET_NAME}
    PRIVATE
      SlamcoreDSP
      juce::juce_audio_processors
      juce::juce_audio_plugin_client
      juce::juce_dsp
      juce::juce_gui_basics
    PUBLIC
      juce::juce_recommended_config_flags
      juce::juce_recommended_lto_flags
      juce::juce_recommended_warning_flags
  )
endmacro()


6.4 — Example Per-Plugin CMakeLists.txt

# plugins/guitar/SlamChugger/CMakeLists.txt
add_slamcore_plugin(
  TARGET_NAME     SlamChugger
  PLUGIN_NAME     "Slam-Chugger"
  MANUFACTURER_NAME "SlamcoreDev"
  MANUFACTURER_CODE ScDv
  PLUGIN_CODE     SCcg
  SOURCES
    SlamChuggerProcessor.cpp
    SlamChuggerEditor.cpp
)


6.5 — Example Processor Stub (C++)

// plugins/guitar/SlamChugger/SlamChuggerProcessor.cpp
// VST3 SDK 3.7.x + JUCE 7.x
// Implements: Slam-Chugger DSP per Section 2

#include <juce_audio_processors/juce_audio_processors.h>
#include "SlamcoreDSP/Waveshapers.h"
#include "SlamcoreDSP/Filters.h"
#include "SlamcoreDSP/Envelopes.h"

class SlamChuggerProcessor : public juce::AudioProcessor
{
public:
    SlamChuggerProcessor()
      : AudioProcessor(BusesProperties()
          .withInput ("Input",  juce::AudioChannelSet::stereo(), true)
          .withOutput("Output", juce::AudioChannelSet::stereo(), true))
    {
        // Register all parameters - names MUST match YAML snake_case spec
        addParameter(p_input_gain   = new juce::AudioParameterFloat(
            "input_gain",   "Input Gain",   -24.0f, 24.0f,  0.0f));
        addParameter(p_drive        = new juce::AudioParameterFloat(
            "drive",        "Drive",          0.0f,100.0f, 40.0f));
        addParameter(p_chug_tightness = new juce::AudioParameterFloat(
            "chug_tightness","Chug Tightness",0.0f,100.0f, 65.0f));
        addParameter(p_waveshape_mode = new juce::AudioParameterChoice(
            "waveshape_mode","Waveshape Mode",
            {"Soft","Hard","Asymm","Fuzz"}, 1));
        addParameter(p_resonance    = new juce::AudioParameterFloat(
            "resonance",    "Resonance",      0.5f,  6.0f,  1.2f));
        addParameter(p_low_blend    = new juce::AudioParameterFloat(
            "low_blend",    "Low Blend",      0.0f,100.0f, 75.0f));
        addParameter(p_output_gain  = new juce::AudioParameterFloat(
            "output_gain",  "Output Gain",  -24.0f, 12.0f,  0.0f));
        addParameter(p_dry_wet      = new juce::AudioParameterFloat(
            "dry_wet",      "Dry/Wet",        0.0f,  1.0f,  1.0f));
        addParameter(p_oversample   = new juce::AudioParameterBool(
            "oversample_enable","Oversample", true));
    }

    ~SlamChuggerProcessor() override = default;

    //==========================================================================
    void prepareToPlay(double sampleRate, int samplesPerBlock) override
    {
        juce::dsp::ProcessSpec spec;
        spec.sampleRate       = sampleRate;
        spec.maximumBlockSize = (uint32)samplesPerBlock;
        spec.numChannels      = getTotalNumOutputChannels();

        // Recalculate filter coefficients
        hpfFilter.prepare(spec);
        updateFilterCoefficients(sampleRate);

        // 2× oversampler (min-phase FIR, 128 taps)
        oversampler = std::make_unique<juce::dsp::Oversampling<float>>(
            spec.numChannels,
            1,  // 2^1 = ×2
            juce::dsp::Oversampling<float>::filterHalfBandPolyphaseIIR,
            true,   // isMaximumQuality
            false   // shouldUseIntegerLatency
        );
        oversampler->initProcessing(samplesPerBlock);

        dcBlocker.prepare(spec);
        auto dcCoeffs = juce::dsp::IIR::Coefficients<float>::makeHighPass(
            sampleRate, 6.0f);
        *dcBlocker.coefficients = *dcCoeffs;
    }

    void releaseResources() override
    {
        oversampler.reset();
    }

    //==========================================================================
    void processBlock(juce::AudioBuffer<float>& buffer,
                      juce::MidiBuffer& /*midi*/) override
    {
        juce::ScopedNoDenormals noDenormals;

        const float inputGaindB  = p_input_gain->get();
        const float driveNorm    = p_drive->get() / 100.0f;
        const float outputGaindB = p_output_gain->get();
        const float dryWet       = p_dry_wet->get();
        const bool  doOversample = p_oversample->get();
        const int   waveMode     = p_waveshape_mode->getIndex();

        // Save dry
        juce::AudioBuffer<float> dryBuffer(buffer.getNumChannels(),
                                           buffer.getNumSamples());
        dryBuffer.copyFrom(0, 0, buffer, 0, 0, buffer.getNumSamples());
        if (buffer.getNumChannels() > 1)
            dryBuffer.copyFrom(1, 0, buffer, 1, 0, buffer.getNumSamples());

        // Input gain
        buffer.applyGain(juce::Decibels::decibelsToGain(inputGaindB));

        // Processing block
        juce::dsp::AudioBlock<float> block(buffer);

        auto process = [&](juce::dsp::AudioBlock<float>& blk)
        {
            // HPF
            juce::dsp::ProcessContextReplacing<float> hpfCtx(blk);
            hpfFilter.process(hpfCtx);

            // Waveshaper
            for (size_t ch = 0; ch < blk.getNumChannels(); ++ch)
            {
                auto* data = blk.getChannelPointer(ch);
                for (size_t n = 0; n < blk.getNumSamples(); ++n)
                    data[n] = Slamcore::waveshape(data[n], driveNorm, waveMode);
            }
        };

        if (doOversample)
        {
            auto osBlock = oversampler->processSamplesUp(block);
            process(osBlock);
            oversampler->processSamplesDown(block);
        }
        else
        {
            process(block);
        }

        // DC block
        juce::dsp::ProcessContextReplacing<float> dcCtx(block);
        dcBlocker.process(dcCtx);

        // Output gain
        buffer.applyGain(juce::Decibels::decibelsToGain(outputGaindB));

        // Dry/Wet mix
        for (int ch = 0; ch < buffer.getNumChannels(); ++ch)
        {
            buffer.applyGain(ch, 0, buffer.getNumSamples(), dryWet);
            buffer.addFrom(ch, 0, dryBuffer, ch, 0,
                           buffer.getNumSamples(), 1.0f - dryWet);
        }
    }

    //==========================================================================
    // Required VST3 host info
    bool hasEditor()                       const override { return true;  }
    bool acceptsMidi()                     const override { return false; }
    bool producesMidi()                    const override { return false; }
    bool isMidiEffect()                    const override { return false; }
    double getTailLengthSeconds()          const override { return 0.0;   }
    int getNumPrograms()                   const override { return 1;     }
    int getCurrentProgram()                const override { return 0;     }
    void setCurrentProgram(int)                  override {}
    const juce::String getProgramName(int) const override { return {};   }
    void changeProgramName(int, const juce::String&) override {}
    const juce::String getName()           const override
        { return "Slam-Chugger"; }

    void getStateInformation(juce::MemoryBlock& destData) override
    {
        auto state = parameters.copyState();
        std::unique_ptr<juce::XmlElement> xml(state.createXml());
        copyXmlToBinary(*xml, destData);
    }

    void setStateInformation(const void* data, int size) override
    {
        auto xmlState = getXmlFromBinary(data, size);
        if (xmlState != nullptr)
            parameters.replaceState(
                juce::ValueTree::fromXml(*xmlState));
    }

private:
    void updateFilterCoefficients(double sampleRate)
    {
        // HPF centred at chug_tightness mapped 80–400 Hz
        const float tightNorm = p_chug_tightness->get() / 100.0f;
        const float hpfFreq   = 80.0f + tightNorm * 320.0f;
        *hpfFilter.coefficients =
            *juce::dsp::IIR::Coefficients<float>::makeHighPass(
                sampleRate, hpfFreq, p_resonance->get());
    }

    juce::AudioParameterFloat*  p_input_gain      = nullptr;
    juce::AudioParameterFloat*  p_drive            = nullptr;
    juce::AudioParameterFloat*  p_chug_tightness   = nullptr;
    juce::AudioParameterChoice* p_waveshape_mode   = nullptr;
    juce::AudioParameterFloat*  p_resonance        = nullptr;
    juce::AudioParameterFloat*  p_low_blend        = nullptr;
    juce::AudioParameterFloat*  p_output_gain      = nullptr;
    juce::AudioParameterFloat*  p_dry_wet          = nullptr;
    juce::AudioParameterBool*   p_oversample       = nullptr;

    juce::dsp::IIR::Filter<float>  hpfFilter;
    juce::dsp::IIR::Filter<float>  dcBlocker;
    std::unique_ptr<juce::dsp::Oversampling<float>> oversampler;

    juce::AudioProcessorValueTreeState parameters {
        *this, nullptr, "SlamChugger",
        juce::AudioProcessorValueTreeState::ParameterLayout{}
    };

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SlamChuggerProcessor)
};

// Factory function required by JUCE VST3 wrapper
juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter()
{
    return new SlamChuggerProcessor();
}


6.6 — Build Commands: Windows

:: Prerequisites: Visual Studio 2022 (MSVC 17), CMake 3.26+, Git
:: Run in Developer Command Prompt for VS 2022

:: 1. Clone repo and submodules
git clone --recurse-submodules https://github.com/YourOrg/SlamcoreProSuite.git
cd SlamcoreProSuite

:: 2. Configure (Release, x64)
cmake -B build_win_x64 ^
  -G "Visual Studio 17 2022" ^
  -A x64 ^
  -DCMAKE_BUILD_TYPE=Release ^
  -DVST3_SDK_ROOT="%CD%\extern\VST3_SDK" ^
  -DJUCE_ROOT="%CD%\extern\JUCE"

:: 3. Build all plugins
cmake --build build_win_x64 --config Release --parallel

:: 4. Locate .vst3 bundles
:: Output: build_win_x64\plugins\guitar\SlamChugger\SlamChugger_artefacts\Release\VST3\Slam-Chugger.vst3

:: 5. Install to REAPER
:: VST3 plugin bundle = folder with .vst3 extension containing:
::   Slam-Chugger.vst3\
::     Contents\
::       x86_64-win\
::         Slam-Chugger.vst3   <-- DLL renamed .vst3
:: REAPER install path: %APPDATA%\REAPER\UserPlugins\
:: or any path listed under REAPER > Preferences > Plug-ins > VST

xcopy /E /I /Y "build_win_x64\...\Slam-Chugger.vst3" ^
  "%APPDATA%\REAPER\UserPlugins\Slam-Chugger.vst3\"

:: 6. Run REAPER VST scan
:: REAPER > Options > Preferences > Plug-ins > VST > Re-scan

:: 7. Run tests
ctest --test-dir build_win_x64 --output-on-failure -C Release


6.7 — Build Commands: macOS

# Prerequisites: Xcode 14+, CMake 3.26+, Git, Homebrew
# Tested on macOS 12 Monterey and 14 Sonoma

# 1. Clone repo and submodules
git clone --recurse-submodules https://github.com/YourOrg/SlamcoreProSuite.git
cd SlamcoreProSuite

# 2. Configure Universal Binary (x86_64 + arm64)
cmake -B build_mac \
  -G Xcode \
  -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" \
  -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 \
  -DCMAKE_BUILD_TYPE=Release \
  -DVST3_SDK_ROOT="$(pwd)/extern/VST3_SDK" \
  -DJUCE_ROOT="$(pwd)/extern/JUCE"

# 3. Build all plugins
cmake --build build_mac --config Release --parallel $(sysctl -n hw.ncpu)

# 4. Locate .vst3 bundles
# Output: build_mac/plugins/guitar/SlamChugger/SlamChugger_artefacts/Release/VST3/Slam-Chugger.vst3
# macOS VST3 bundle structure:
#   Slam-Chugger.vst3/
#     Contents/
#       MacOS/
#         Slam-Chugger          <-- Mach-O Universal Binary
#       Resources/
#         moduleinfo.json
#       Info.plist

# 5. Install to REAPER
# System-wide: /Library/Audio/Plug-Ins/VST3/
# User:        ~/Library/Audio/Plug-Ins/VST3/
# REAPER user: ~/Library/Application Support/REAPER/UserPlugins/

cp -r "build_mac/.../Slam-Chugger.vst3" \
  ~/Library/Audio/Plug-Ins/VST3/

# 6. Code-sign (required for Gatekeeper on macOS 13+)
codesign --force --deep --sign "Developer ID Application: YourName (TEAMID)" \
  ~/Library/Audio/Plug-Ins/VST3/Slam-Chugger.vst3

# 7. REAPER re-scan
# REAPER > Preferences > Plug-ins > VST > Re-scan

# 8. Run tests
ctest --test-dir build_mac --output-on-failure -C Release

# 9. REAPER project templates install
mkdir -p ~/Library/Application\ Support/REAPER/ProjectTemplates/
cp assets/templates/*.RPP \
  ~/Library/Application\ Support/REAPER/ProjectTemplates/


6.8 — IR & Preset Asset Install

# macOS
REAPER_SUPPORT=~/Library/Application\ Support/REAPER
cp -r assets/ir/       "$REAPER_SUPPORT/Data/SlamcoreIR/"
cp -r assets/presets/  "$REAPER_SUPPORT/Presets/SlamcoreProSuite/"

# Windows (PowerShell)
$R = "$env:APPDATA\REAPER"
Copy-Item -Recurse assets\ir\      "$R\Data\SlamcoreIR\"
Copy-Item -Recurse assets\presets\ "$R\Presets\SlamcoreProSuite\"


SECTION 7 — TESTING CHECKLIST

7.1 — DSP Unit Tests (Bit-Exact)

// tests/dsp/test_waveshaper.cpp
// Build with: add_subdirectory(tests) in root CMakeLists.txt
// Framework: Catch2 (included via FetchContent)

#include <catch2/catch_all.hpp>
#include "SlamcoreDSP/Waveshapers.h"

// Test vector: known input → expected output (pre-computed reference)
TEST_CASE("SoftClip waveshaper DC accuracy", "[waveshaper]")
{
    // Input: 0.5 amplitude DC, drive=0.5, mode=Soft
    float input    = 0.5f;
    float expected = 0.4620981f;  // tanh(0.5 * pi) normalized
    float result   = Slamcore::waveshape(input, 0.5f, 0 /*Soft*/);
    REQUIRE(result == Approx(expected).epsilon(1e-5f));
}

TEST_CASE("Hard clip saturates at 1.0", "[waveshaper]")
{
    float result = Slamcore::waveshape(2.0f, 1.0f, 1 /*Hard*/);
    REQUIRE(result <= 1.0f);
    REQUIRE(result >= -1.0f);
}

TEST_CASE("Waveshaper zero input = zero output", "[waveshaper]")
{
    for (int mode = 0; mode < 4; ++mode)
        REQUIRE(Slamcore::waveshape(0.0f, 0.5f, mode) == Approx(0.0f));
}

// Additional test vectors loaded from tests/dsp/test_vectors/*.wav
// Use libsndfile in test suite to load reference files and compare
// sample-by-sample with tolerance ε = 1e-6f

// tests/dsp/test_filters.cpp
TEST_CASE("HPF -3dB point at cutoff frequency", "[filters]")
{
    // Generate 1-second sine at fc, measure output amplitude
    // Expected: 0.707 (-3 dB) ± 0.01
}

TEST_CASE("HPF passes signals above cutoff", "[filters]")
{
    // Sine at 10× fc should pass at ≈ unity gain
}

TEST_CASE("Filter coefficient update on SR change no-crash", "[filters]")
{
    // Call prepareToPlay(44100, 512), then prepareToPlay(96000, 256)
    // No exceptions, no NaN output
}

// tests/dsp/test_convolution.cpp
TEST_CASE("Convolution with unit impulse = input passthrough", "[convolution]")
{
    // Load unit_impulse.wav (single 1.0 sample, zero elsewhere)
    // Convolve input signal
    // Expected: output == input (bit-exact within float precision)
}

TEST_CASE("Convolution latency reported correctly", "[convolution]")
{
    // Instantiate SlamCab, getLatencySamples() must equal partitioned block size
    REQUIRE(slamCab.getLatencySamples() == 64);
}


7.2 — Latency Tests

// tests/integration/test_latency.cpp

struct LatencySpec {
    const char* plugin_name;
    int         expected_latency_samples;
    int         tolerance_samples;
};

static const LatencySpec LATENCY_TABLE[] = {
    {"Slam-Chugger",          0,   0},  // zero-latency
    {"Gutter-Drive",          0,   0},
    {"Slam-Cab",             64,   2},  // partitioned convolution
    {"Dissonance-Gen",     2048,   0},  // FFT window
    {"Slam-Gate",             0,  10},  // 0–10 ms lookahead
    {"Slam-Limiter",          4,   0},  // true-peak lookahead
    {"Cymbal-Clarifier",    128,   0},  // linear-phase FIR
    {"Breathing-Suppressor",  0,   0},  // gate mode
};

TEST_CASE("All plugins report correct latency", "[latency]")
{
    for (auto& spec : LATENCY_TABLE)
    {
        auto plugin = instantiate_vst3(spec.plugin_name);
        plugin->prepareToPlay(48000, 256);
        int reported = plugin->getLatencySamples();
        REQUIRE(reported >= spec.expected_latency_samples - spec.tolerance_samples);
        REQUIRE(reported <= spec.expected_latency_samples + spec.tolerance_samples);
    }
}


7.3 — CPU Profiling Steps

1. Build Release with profiling symbols: add -pg (GCC/Clang) or /Zi (MSVC)
2. Per-plugin benchmark:
   a. Instantiate single plugin instance
   b. Call prepareToPlay(48000, 256)
   c. Render 60 seconds of pink noise (use juce::Random for DSP input)
   d. Measure wall-clock time; compute %CPU = (processingTime / realTime) * 100
   e. Assert CPU% ≤ budget in Section 2 per plugin

3. Stress test: instantiate all 25 plugins simultaneously on same buffer
   Budget: ≤ 35% combined @ 48 kHz / 256 samples / i7-10th-gen

4. Tools:
   - Windows: VTune Amplifier or Windows Performance Toolkit (WPT)
   - macOS:   Instruments.app (Time Profiler + CPU Counters)
   - Cross:   perf (Linux CI), Callgrind (Valgrind)

5. Memory: Valgrind / AddressSanitizer on all process() paths
   - Zero heap allocs inside processBlock() (use prepareToPlay for allocation)
   - No data races (ThreadSanitizer)


7.4 — REAPER Scanning Compatibility Checklist

[ ] All .vst3 bundles pass REAPER 6.8x plugin scanner without errors
[ ] Plugin names appear exactly as specified in catalog (no trailing spaces)
[ ] All parameters appear in REAPER automation lanes with correct names
[ ] Parameter ranges match YAML spec (normalize/denormalize round-trip)
[ ] Preset loading via REAPER FX browser works for all preset banks
[ ] Bypass (IComponent::setActive(false)) produces true bypass (zero processing)
[ ] Double-precision processing flag correctly handled
    (VST3 Vst::kSample64 if host requests it)
[ ] IProcessContextRequirements::getProcessContextRequirements() returns
    kNeedTempo | kNeedTimeSignature | kNeedTransportState
[ ] Sample-accurate MIDI scheduling verified:
    - Place MIDI note at exact sample 0; verify audio output begins at sample 0
[ ] Plugin state save/restore round-trip (savePreset/loadPreset via REAPER)
[ ] Multiple instances of same plugin operate independently (no shared static state)
[ ] GUI opens and closes without crash; automation works with GUI closed
[ ] Windows: works in REAPER 64-bit (x64 DLL confirmed)
[ ] macOS: Universal Binary validates: lipo -info Slam-Chugger
    → Architectures in the fat file: x86_64 arm64
[ ] REAPER > Preferences > Plug-ins > VST > Re-scan completes < 30 seconds
    for all 25 plugins
[ ] No console errors in REAPER log (Help > Show REAPER console)


SECTION 8 — PACKAGING

8.1 — Installer Layout

SlamcoreProSuite_v1.0.0_Windows_x64/
├── SlamcoreProSuite_Setup_v1.0.0_Win64.exe   ← Inno Setup installer
└── (embedded)
    ├── VST3\
    │   ├── Slam-Chugger.vst3\
    │   ├── Gutter-Drive.vst3\
    │   ├── ... (all 25 plugins)
    ├── Data\
    │   └── SlamcoreIR\
    │       ├── SlamCab_4x12_V30_SM57_Center.wav
    │       ├── ... (all IR files)
    ├── Presets\
    │   └── SlamcoreProSuite\
    │       ├── Guitar\
    │       ├── Drums\
    │       ├── Vocals\
    │       └── Utilities\
    └── ProjectTemplates\
        ├── SlamcoreDemo.RPP
        ├── SlamcoreTracking.RPP
        └── SlamcoreMixdown.RPP

SlamcoreProSuite_v1.0.0_macOS_Universal/
├── SlamcoreProSuite_v1.0.0_macOS.pkg    ← Packages.app signed installer
└── (embedded)
    ├── /Library/Audio/Plug-Ins/VST3/
    │   ├── Slam-Chugger.vst3
    │   ├── ... (all 25 plugins)
    ├── ~/Library/Application Support/REAPER/Data/SlamcoreIR/
    ├── ~/Library/Application Support/REAPER/Presets/SlamcoreProSuite/
    └── ~/Library/Application Support/REAPER/ProjectTemplates/


8.2 — Inno Setup Script Snippet (Windows)

; installer/windows/SlamcoreInstaller.iss
[Setup]
AppName=SlamcoreProSuite
AppVersion=1.0.0
DefaultDirName={autopf}\SlamcoreProSuite
OutputBaseFilename=SlamcoreProSuite_Setup_v1.0.0_Win64
Compression=lzma2/ultra64
SolidCompression=yes
ArchitecturesInstallIn64BitMode=x64

[Files]
; VST3 plugins → REAPER UserPlugins
Source: "dist\VST3\*"; DestDir: "{userappdata}\REAPER\UserPlugins"; \
  Flags: ignoreversion recursesubdirs createallsubdirs

; IR files
Source: "dist\Data\SlamcoreIR\*"; DestDir: "{userappdata}\REAPER\Data\SlamcoreIR"; \
  Flags: ignoreversion recursesubdirs createallsubdirs

; Presets
Source: "dist\Presets\SlamcoreProSuite\*"; \
  DestDir: "{userappdata}\REAPER\Presets\SlamcoreProSuite"; \
  Flags: ignoreversion recursesubdirs createallsubdirs

; Project Templates
Source: "dist\ProjectTemplates\*.RPP"; \
  DestDir: "{userappdata}\REAPER\ProjectTemplates"; \
  Flags: ignoreversion

[Icons]
Name: "{group}\SlamcoreProSuite README"; Filename: "{app}\README.txt"

[Run]
Filename: "{app}\README.txt"; Description: "View README"; \
  Flags: postinstall shellexec


8.3 — Naming Conventions

Plugin bundle  : <PluginName-As-In-Catalog>.vst3
  Examples     : Slam-Chugger.vst3, Gutter-Drive.vst3
DLL/dylib name : must match bundle folder name (VST3 SDK requirement)
Preset files   : <PresetBankName>_<PluginName>.vstpreset
  Examples     : Modern_Djent_SlamChugger.vstpreset
IR files       : SlamCab_<Cab>_<Mic>_<Position>.wav  (48 kHz, 24-bit, mono)
REAPER templates: Slamcore<TemplateName>.RPP


8.4 — User README

================================================================================
SLAMCORE PRO SUITE v1.0.0 — USER README
================================================================================

SYSTEM REQUIREMENTS
  Windows : 10/11 (64-bit), REAPER 6.8x+, VST3 host
  macOS   : 12.0+ (Intel + Apple Silicon), REAPER 6.8x+, VST3 host
  RAM     : 4 GB minimum, 8 GB recommended
  CPU     : Quad-core 2.5 GHz minimum; hexa-core recommended for full stack

INSTALLATION
  Windows : Run SlamcoreProSuite_Setup_v1.0.0_Win64.exe
            Plugins install to %APPDATA%\REAPER\UserPlugins\
  macOS   : Open SlamcoreProSuite_v1.0.0_macOS.pkg
            Plugins install to /Library/Audio/Plug-Ins/VST3/
  After install: REAPER > Options > Preferences > Plug-ins > VST > Re-scan

PLUGIN LOCATIONS (for manual install)
  Windows : %APPDATA%\REAPER\UserPlugins\
  macOS   : ~/Library/Audio/Plug-Ins/VST3/
            or /Library/Audio/Plug-Ins/VST3/ (system-wide)

PROJECT TEMPLATES
  Location : REAPER > File > Project Templates
  Templates: SlamcoreDemo, SlamcoreTracking, SlamcoreMixdown

AUTO-DRUMMER AGENT
  Usage    : Insert AutoDrummerAgent as MIDI effect on a MIDI track.
             Select genre template from combo box; adjust humanization.
             Press Generate to create a REAPER MIDI item (N bars).

TASK AGENT (Atom Integration)
  1. Install reaper-api-bridge package in Atom
  2. Open Atom command palette: Slamcore: Open Task Agent
  3. Type natural-language commands (see Section 4 examples)

RECOMMENDED BUFFER SIZE
  Tracking  : 64 or 128 samples (≤3 ms @ 48 kHz)
  Mixing    : 256 or 512 samples
  NOTE: Slam-Cab adds 64-sample latency (reported to host, REAPER compensates)
        Cymbal-Clarifier adds 128-sample latency (REAPER compensates)

PRESET LOCATIONS
  Windows : %APPDATA%\REAPER\Presets\SlamcoreProSuite\
  macOS   : ~/Library/Application Support/REAPER/Presets/SlamcoreProSuite/
  Load    : Right-click plugin header in REAPER FX chain > Load preset

IR FILES (Slam-Cab)
  Location: <REAPER_DATA>\SlamcoreIR\
  Format  : WAV, 48 kHz, 24-bit, mono
  Load    : Click ir_a_slot or ir_b_slot file selector in Slam-Cab GUI

SUPPORT
  Logs    : REAPER > Help > Show REAPER console
  SDK Ref : https://steinbergmedia.github.io/vst3_doc/
  REAPER  : https://www.reaper.fm/sdk/plugin/plugin.php

================================================================================
END README
================================================================================


End of SlamcoreProSuite Build Spec v1.0.0 — BuildAgent v1.0
Total plugins: 25 | Auto-drum templates: 8 | Guitar preset banks: 12 per plugin
VST3 SDK 3.7.x | JUCE 7.x | CMake 3.26+ | Windows 10/11 x64 | macOS 12+ Universal