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

