- 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.
1.9 KiB
1.9 KiB
Tasks: presets-pack
Phase 1: Foundation — PresetTransform & Schema
- 1.1 Add
role: str = ""toPluginDefinsrc/core/schema.py - 1.2 Create
src/reaper_builder/preset_transformer.pywithPresetTransformerclass +_transform_serum(),_transform_decapitator(),_transform_omnisphere() - 1.3 Restructure
PLUGIN_PRESETSinsrc/reaper_builder/__init__.pyto{(k, role): chunks}with""key for original data - 1.4 Run
PresetTransformer.derive()for each (plugin, role) combo and populate role entries inPLUGIN_PRESETS
Phase 2: Thread role through pipeline
- 2.1 Update
make_plugin()inscripts/compose.py— addrole: str = ""param, pass toPluginDefconstructor - 2.2 Update
_build_plugin()insrc/reaper_builder/__init__.py— resolve via_resolve_preset(key, plugin.role)with""fallback - 2.3 Update
make_plugin()call sites incompose.py— passrolefromFX_CHAINSkey (bass/lead/chords/pad/drumloop/perc/clap) - 2.4 Update
_parse_vst_block()and_make_plugin_template()insrc/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")androle="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_cacheNameError in compose.py (sidechain feature in-progress). Verified code structure is correct via unit tests.