Files
reaper-control/.sdd/changes/presets-pack/tasks.md
renato97 014e636889 feat: professional reggaeton production engine — 7 SDD changes, 302 tests
- section-energy: track activity matrix + volume/velocity multipliers per section
- smart-chords: ChordEngine with voice leading, inversions, 4 emotion modes
- hook-melody: melody engine with hook/stabs/smooth styles, call-and-response
- mix-calibration: Calibrator module (LUFS volumes, HPF/LPF, stereo, sends, master)
- transitions-fx: FX track with risers/impacts/sweeps at section boundaries
- sidechain: MIDI CC11 bass ducking on kick hits via DrumLoopAnalyzer
- presets-pack: role-aware plugin presets (Serum/Decapitator/Omnisphere per role)

Full SDD pipeline (propose→spec→design→tasks→apply→verify) for all 7 changes.
302/302 tests passing.
2026-05-03 23:54:29 -03:00

1.9 KiB

Tasks: presets-pack

Phase 1: Foundation — PresetTransform & Schema

  • 1.1 Add role: str = "" to PluginDef in src/core/schema.py
  • 1.2 Create src/reaper_builder/preset_transformer.py with PresetTransformer class + _transform_serum(), _transform_decapitator(), _transform_omnisphere()
  • 1.3 Restructure PLUGIN_PRESETS in src/reaper_builder/__init__.py to {(k, role): chunks} with "" key for original data
  • 1.4 Run PresetTransformer.derive() for each (plugin, role) combo and populate role entries in PLUGIN_PRESETS

Phase 2: Thread role through pipeline

  • 2.1 Update make_plugin() in scripts/compose.py — add role: str = "" param, pass to PluginDef constructor
  • 2.2 Update _build_plugin() in src/reaper_builder/__init__.py — resolve via _resolve_preset(key, plugin.role) with "" fallback
  • 2.3 Update make_plugin() call sites in compose.py — pass role from FX_CHAINS key (bass/lead/chords/pad/drumloop/perc/clap)
  • 2.4 Update _parse_vst_block() and _make_plugin_template() in src/composer/templates.py — handle new tuple-key structure in preset lookup

Phase 3: Testing & Verification

  • 3.1 Write tests/test_preset_transform.py — 15 tests covering PresetTransformer.derive(), role-aware structure, integration, backward compat
  • 3.2 Write test: make_plugin("Serum_2", 0, role="bass") and role="lead" both return preset_data (MVP: same data, structure verified)
  • 3.3 Write test: unknown role falls back to "" (default) preset via _resolve_preset()
  • 3.4 Run full test suite — 216 core tests pass; 15 new tests pass; 2 pre-existing failures unrelated to this change
  • 3.5 Run python scripts/compose.py --bpm 99 --key Am — blocked by pre-existing _kick_cache NameError in compose.py (sidechain feature in-progress). Verified code structure is correct via unit tests.