Repository navigation
Added
- Riff-locked drum generation: a new
riffCLI subcommand andDrumGeneratorAPI.analyze_riff()analyze a recorded guitar/bass riff's rhythmic accents via onset detection (librosa) and lock a genre plugin's kick pattern onto them, while snare, hi-hat, cymbals, fills, and drummer styling still come from the normal generation pipeline untouched (#57). V1 scope: the riff is analyzed as one representative bar and tiled to fill--bars. RiffLockTransformmodification, applied viaPluginManager.apply_riff_lock()(routed through thepluginsdomain rather thangenerationimportingmodificationsdirectly, per this project's existing DDD domain-boundary rules).- Snare-accent-reaction:
SnareAccentReactionreacts the snare to the same riff accents, in eitherreinforcemode (velocity-boosts existing snare hits near a strong accent) orstabmode (inserts a unison snare hit at very strong accents where riff-lock placed a kick but no snare was nearby, deterministically collapsing to reinforce instead of stacking a second hit when an existing snare is already close by). New--snare-mode/--snare-stab-thresholdCLI flags andGenerationParameters.riff_snare_mode/riff_snare_stab_thresholdfields; defaults to"off"(no behavior change unless explicitly enabled). - New
midi_drums.analysispackage (a sibling ofmidi_drums.ai, not nested in it, so importing onset-detection code doesn't drag in the LangChain/pydantic-ai stack) and a newaudioextras group (uv sync --group audio: librosa, soundfile, numpy). - New REAPER
create_beat_from_riff.luaaction: select a riff item and run it to get a kick-locked drum pattern back. Uses the take's own audio source directly when available, or a bar-aligned time-selection render for MIDI/VSTi takes; corrects for riffs that don't start on a bar line via--offset-beats.
Fixed
- REAPER's
io.popencommand construction is now routed throughcmd /S /C, avoiding a Windows quote-stripping bug that corrupted commands built from multiple quoted segments (surfaced as'...' is not recognizedin AI-agent mode). - CLI stdout/stderr are reconfigured to UTF-8 on Windows, avoiding a
UnicodeEncodeErrorcrash when AI-generated text containing non-ASCII characters is piped through REAPER'sio.popen. GetUserInputsdialogs increate_song_sections.luaare now wide enough to comfortably read and edit free-text fields, especially the AI description prompt.- The AI agent's system prompt now requires a complete song structure (6-8+ sections, including a chorus/hook and an outro) instead of allowing it to infer a bare 2-section song from a partial description.
- Release-notes generation (
release.yml) no longer emits a spurious leading/trailing blank line around each version's changelog section.
No breaking changes - riff_snare_mode defaults to "off" (identical to pre-feature behavior) and every other addition is a new optional field/method/CLI flag; see docs/RELEASING.md for what counts as this project's public API surface.