- 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.5 KiB
1.5 KiB
Tasks: 808 Bass Sidechain Ducking
Phase 1: Schema — Foundation
- 1.1 Add
CCEventdataclass (controller: int,time: float,value: int) tosrc/core/schema.py - 1.2 Add
midi_cc: list[CCEvent] = field(default_factory=list)toClipDefinsrc/core/schema.py - 1.3 Update
asdictif used; verifysong.validate()passes with emptymidi_cc
Phase 2: Kick Cache + CC Generation
- 2.1 Add constants
_KICK_CONFIDENCE_THRESHOLD=0.6,_CC11_DIP=50,_CC11_HOLD=0.02,_CC11_RELEASE=0.18toscripts/compose.py - 2.2 Add
_get_kick_cache(drumloop_paths: list[str], bpm: float) -> dict[str, list[float]]toscripts/compose.py - 2.3 Modify
build_bass_track()to acceptkick_cache: dict[str, list[float]]parameter; generate CC events for kicks in range - 2.4 Update
main()to build kick cache from drumloop paths and pass tobuild_bass_track()
Phase 3: Builder CC Emission
- 3.1 Modify
_build_midi_source()insrc/reaper_builder/__init__.pyto mergenotes + ccevents and emitE B0 0B {value:02x}lines - 3.2 Verify delta cursor correctly advances across CC events (CC events contribute zero ticks)
Phase 4: Testing
- 4.1 Unit test
CCEventdataclass round-trip intests/test_schema.py - 4.2 Unit test
_build_midi_source()emitsB0 0Blines for clips withmidi_cc - 4.3 Integration test
build_bass_track()populatesmidi_ccwhen kick cache present - 4.4 Regression: run existing 261 tests, verify all pass unchanged