- 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: Transitions FX
Phase 1: FX Transition Map
- 1.1 Add
FX_TRANSITIONSdict toscripts/compose.py:{boundary_index: (type, start_offset, length, fade_in, fade_out)}with 8 entries matching design boundary map - 1.2 Add
FX_ROLE = "fx"constant referencing ATONAL_ROLES membership
Phase 2: Build FX Track
- 2.1 Implement
build_fx_track(sections, offsets, selector, seed=0)— iteratesFX_TRANSITIONS, computes clip positions from offsets, selects FX samples - 2.2 For each boundary: call
selector.select_one(role="fx", seed=seed + idx)to pick sample - 2.3 Create
ClipDef(position, length, name, audio_path, fade_in, fade_out)per boundary - 2.4 Build
TrackDef("Transition FX", volume=0.72, clips=[...], send_level={reverb: 0.08, delay: 0.05}) - 2.5 Add docstring explaining boundary map and FX types (riser/impact/sweep/transition)
Phase 3: Integration
- 3.1 Call
build_fx_track()inmain()after clap track, before pad track - 3.2 Verify send wiring loop handles new track (existing code; confirm no regression)
Phase 4: Testing & Verification
- 4.1 Write unit test:
build_fx_trackreturns TrackDef with exactly 8 clips - 4.2 Write unit test: clip positions and fade values match design's boundary map
- 4.3 Write unit test: all clips have
audio_pathset (not None) - 4.4 Write integration test:
compose.py --bpm 99 --key Am --output /tmp/test.rppproduces valid .rpp with "Transition FX" track - 4.5 Run full
pytestsuite — all 110 existing tests pass