Workflows
1. Generate From a Prompt
ableton-composer generate "dusty trip-hop with smoky keys and slow drums" \
--tracks "Bass,Drums,Pad,Lead,Chords,FX" \
--provider openai
Use this when you want a fast prompt-to-set workflow without prior analysis.
2. Analyze an Album
Use this workflow with your own material, licensed material, or synthetic/example sets. The reference bundle is meant to capture structural signals for your workflow, not to recreate a protected recording.
ableton-composer analyze sets/reference-collection \
--scope album \
--artist "Example Artist" \
--album "Midnight Signals"
This writes a hierarchical album bundle with:
core.jsonharmony.jsonrhythm.jsonarrangement.jsonprompt.jsonbundle.json
3. Generate From an Album Bundle
ableton-composer generate "moody electronic sketch with restrained hooks" \
--style profiles/albums/example-artist/midnight-signals/bundle.json \
--tracks "Bass,Drums,Pad,Lead,Chords,FX" \
--provider openai \
--sections 4 \
--chunk-size 2
Use chunking for larger prompts or album-scale style bundles.
4. Transcribe an Audio Sketch to MIDI
ableton-composer transcribe audio/idea.wav --engine basic-pitch --out midis/idea.mid
ableton-composer transcribe audio/idea.wav --to-set sets/idea/
ableton-composer transcribe audio/song.wav --separate-first --stem vocals --to-set sets/song-vocal-line/
ableton-composer transcribe audio/song.wav --separate-first --stems bass,vocals --to-set sets/song-stems/
ableton-composer transcribe audio/song.wav --separate-first --stems bass,vocals --push --push-setup
ableton-composer transcribe audio/piano.wav --engine klangio --out midis/piano.mid --xml-out exports/piano.musicxml --to-set sets/piano/
Use this when you want to start from a hummed melody, instrument sketch, or rough audio idea and bring it into the existing MIDI/AbletonSong workflow. This path is optional and can use either the external Basic Pitch CLI or the hosted Klangio API.
The transcribed set path is useful when you want to:
- inspect the notes before pushing to Ableton
- critique or compare the result
- continue composing from the transcription rather than only exporting raw MIDI
- improve results by transcribing a simpler separated stem such as vocals or bass instead of the full mix
- merge multiple separated stems into one AbletonSong before pushing to Live
- switch to Klangio when you want an optional hosted engine that can return both MIDI and MusicXML with local caching
For one-shot WAV-to-Ableton workflows, transcribe can now separate a mix first, transcribe multiple stems with --stems or --all-stems, merge those symbolic tracks into one set, and optionally push the merged result straight into the open Ableton Live set with --push.
5. Separate a Mix Into Stems
ableton-composer separate audio/song.wav --engine demucs
ableton-composer separate audio/song.wav --out stems/separated/song/
ableton-composer separate audio/song.wav --manifest
Use this when you start from a stereo file and want to unlock the existing stems workflow. The current MVP:
- depends on the optional Demucs CLI
- writes a normalized output directory instead of exposing Demucs-internal folder layout
- preserves a
separation.jsonfile with source audio hash, engine, model, and output stems - can immediately write a standard stem manifest with
--manifest
This is the right precursor for both stem-manifest workflows and better per-stem transcription.
6. Generate With a Research Dossier
ableton-composer research genre "early 80s synth-pop" \
--out research/synth-pop-80s.json
ableton-composer palette generate research/synth-pop-80s.json \
--tracks "Drums,Bass,Pad,Lead,Keys,Vocals,FX" \
--historical-strictness loose
ableton-composer generate "melancholic pop pulse with restrained hooks" \
--dossier research/synth-pop-80s.json \
--palette palettes/early-80s-synth-pop-palette.json \
--historical-strictness loose \
--tracks "Drums,Bass,Pad,Lead,Keys,Vocals,FX" \
--provider openai
Use this when you want historically informed arrangement and production guardrails without depending only on vague prompt wording. Dossiers are additive: they work alongside style profiles instead of replacing them. The optional operational palette turns dossier guidance into concrete per-track constraints before note generation.
Research dossiers can now carry explicit historical guardrails too, for example period bounds, caution instruments, avoid-by-default lists, and historically plausible substitutes. Those guardrails are passed into generation as advisory constraints so the model can avoid obvious anachronisms by default.
If you want the model to stay much closer to the target era, switch to --historical-strictness strict. Use hybrid or modern when the goal is reinterpretation rather than reconstruction.
7. Build a Local Plugin Inventory
ableton-composer plugins scan
ableton-composer plugins enrich
ableton-composer plugins match research/synth-pop-80s.json
ableton-composer plugins scan --formats au,vst3,clap
ableton-composer plugins list
Use this before any plugin-aware preset or research workflow. The inventory is local, scans common macOS plugin folders for AU/VST/VST3/CLAP packages, and stores a structured JSON file that later commands can consume without scraping the filesystem directly.
The default list view is prompt-safe:
- it prints plugin name, format, inferred type, install scope, and a path hash
- it does not print raw filesystem paths unless you explicitly ask for
--no-prompt-safe - missing plugin directories are treated as normal and do not fail the scan
Use plugins enrich when you want the inventory to carry historical/emulation metadata, and plugins match <dossier> when you want dossier-aware buckets such as:
- recommended installed substitutes
- caution choices that are usable but slightly off-period
- avoid-by-default choices that conflict with dossier guardrails
8. Plan Presets From a Dossier
ableton-composer preset plan research/synth-pop-80s.json \
--palette palettes/early-80s-synth-pop-palette.json \
--installed-only
Use this when you want dossier and palette guidance to drive actual preset work. The preset plan:
- maps each role to candidate preset profiles under
profiles/presets/ - prefers installed devices confirmed by the local plugin inventory when possible
- generates a ready-to-use prompt per role
- warns when the best available candidate is weak, off-period, or not confirmed as installed
The intended next step is to pick one recommended profile and pass its prompt into preset generate.
9. Generate a Preset
ableton-composer preset generate \
profiles/presets/generic-analog-poly/bass.json \
"deep analog bass" \
--provider openai
This uses a preset profile plus preset-generate.md to create a structured parameter map.
10. Expand an Existing Set
ableton-composer expand sets/my-song \
--add "Strings,FX" \
--provider openai
Useful when you already have a harmonic structure and only want new supporting parts.
11. Import MusicXML With Chord Symbols
ableton-composer import-xml score.mxl \
--chord-track \
--out sets/imported-score/
When the MusicXML/MXL file contains harmony symbols, the importer stores them as section-level harmony metadata. With --chord-track, it also creates a MIDI Chords track and names the chord clip from the imported progression.
When the source file contains lyrics, the importer preserves them as section/clip metadata. Unpitched percussion parts are imported through MusicXML midi-unpitched mappings when available.
Use a custom track name when your Ableton set already has a dedicated harmony track:
ableton-composer import-xml score.mxl \
--chord-track "Harmony" \
--out sets/imported-score/
12. Export a Set Back to MusicXML / MXL
ableton-composer export-xml sets/imported-score \
--out exports/imported-score.musicxml
ableton-composer export-xml sets/imported-score \
--out exports/imported-score.mxl
This is the inverse interoperability path for MuseScore, Logic, and other notation-aware tools. The exporter:
- concatenates sections into one score timeline
- writes one part per track
- includes harmony symbols and lyrics when present
- packages compressed
.mxloutput when requested
13. Export a Set as MIDI for DAW Interoperability
ableton-composer export-midi sets/imported-score \
--out exports/imported-score.mid
Use MIDI export when the target is a DAW rather than notation software. The exporter:
- writes one MIDI track per AbletonSong track
- preserves track names
- preserves tempo and time signature
- concatenates section-relative notes into one absolute song timeline
14. Validate a Round-Trip
ableton-composer validate-roundtrip examples/ableton-song/chord-progression.song.json --via midi
ableton-composer validate-roundtrip examples/ableton-song/chord-progression.song.json --via musicxml
Use this when you want to measure what is preserved across interchange formats. The report highlights:
- note match percentage
- track-name overlap
- BPM and time-signature preservation
- section-count drift
- pitch/timing/duration mismatches
15. Critique a Generated Set
ableton-composer critique sets/my-song \
--rubric general \
--provider openai \
--out reports/my-song-critique.json
Use this when you want structured feedback before revising a piece. The critique is advisory rather than objective and can help identify:
- structural weaknesses
- role-balance problems
- idiomatic issues for a target instrumentation
- weak contrast or continuity between sections
Rubrics are file-based under prompts/critique/, so extending the system is mostly a prompt-authoring task rather than a code change.
If you want critique automatically after generation:
ableton-composer generate "moody electronic sketch with restrained hooks" \
--style profiles/albums/example-artist/midnight-signals/bundle.json \
--tracks "Bass,Drums,Pad,Lead,Chords,FX" \
--provider openai \
--sections 4 \
--chunk-size 2 \
--evaluate \
--rubric auto
16. Compare Drift
ableton-composer compare \
profiles/albums/example-artist/midnight-signals/bundle.json \
sets/my-generated-song
This reports:
- component scores for key, BPM, structure, role presence, and rhythm
- key agreement
- BPM drift
- rhythm by role
- role presence drift
When the source is an album, artist, or collection bundle, compare weights role presence, structure, and role-level rhythm more heavily than exact track-name matches.
17. Scan a Stem Folder
ableton-composer stems scan /path/to/song-stems \
--out stems/manifests/song-stems.stems.json
This creates a versioned stem manifest with:
- source root
- relative audio file paths
- default track names derived from filenames
- deterministic
role,group, andcolorclassification for common stem names - default
display_nameandorderfields for stable organization - preserved manual overrides when rescanning into the same manifest
Use this as the first step before building audio-track setup and Ableton stem loading workflows.
18. Prepare Ableton Audio Tracks From a Stem Manifest
ableton-composer stems setup stems/manifests/song-stems.stems.json
Use this after scanning/classifying stems and before actual audio clip loading. The setup step:
- creates missing audio tracks
- reuses tracks when the manifest name already exists
- applies track colors from the manifest when possible
Preview only:
ableton-composer stems setup stems/manifests/song-stems.stems.json --dry-run
ableton-composer stems setup stems/manifests/song-stems.stems.json --prefix-groups
You can also edit display_name and order in the manifest directly when you want to override the default grouping/order rules without changing the source filenames.
Current limitation: the Ableton remote API exposed through ableton-js can create and reuse tracks and inspect existing clips, but it does not currently expose a supported way to import arbitrary external audio files into Session View clip slots. So this step prepares the Live set structure; loading the actual stem audio into clips still needs manual drag-and-drop in Ableton or the REAPER import workflow below.
19. Prepare a REAPER Import Script From a Stem Manifest
ableton-composer stems reaper stems/manifests/song-stems.stems.json \
--bpm 120 \
--time-signature 4/4
Use this when the next step is comping, editing, or mixing in REAPER rather than Ableton. The generated Lua script:
- creates one track per stem and imports the audio file at timeline start
- optionally groups tracks into REAPER folder tracks by stem group
- applies track colors derived from the stem manifest
- sets the target project tempo and time signature before import
Run the generated .lua file from REAPER’s action list or script editor.
20. Generate a Portable Audio Render Plan
ableton-composer render-plan sets/my-song \
--stems stems/manifests/my-song.stems.json \
--out renders/plans/my-song.render-chain.json
Use this before implementing or invoking any offline audio engine. The render plan:
- maps song tracks to source types such as MIDI or external stems
- separates instrument placeholders from effect chains and mix settings
- defines per-track stem outputs plus a master chain and final mixdown target
- stays portable across future engines such as ffmpeg fallback or Pedalboard
21. Mix Existing Audio With ffmpeg Fallback
ableton-composer render-audio renders/plans/my-song.render-chain.json --dry-run
ableton-composer render-audio renders/plans/my-song.render-chain.json --normalize
ableton-composer convert-audio renders/my-song/mixdown.wav --out renders/my-song/mixdown.mp3
Use this when audio already exists as stems and you only need format conversion, simple summing, gain/pan application, or normalization. ffmpeg here is not a plugin host and does not render instruments from MIDI.
22. Process Existing Stems With Pedalboard
ableton-composer render-stems renders/plans/my-song.render-chain.json --dry-run
ableton-composer render-stems renders/plans/my-song.render-chain.json --out renders/my-song/pedalboard/
Use this when a render plan already points at external audio stems and you want an optional offline Python worker to process them. The current Pedalboard integration is intentionally narrow:
- it requires Python plus the
pedalboardpackage installed separately - it currently handles external audio stems only
- it does not synthesize MIDI tracks or emulate a DAW mixer/project renderer
- it writes per-track outputs using the same render-plan contract as the ffmpeg fallback
23. Typical Album-Style Loop
# analyze
ableton-composer analyze sets/source-album --scope album --artist "Artist" --album "Album"
# generate
ableton-composer generate "prompt" \
--style profiles/albums/artist/album/bundle.json \
--tracks "Bass,Drums,Pad,Lead,Chords,FX" \
--provider openai \
--sections 4 \
--chunk-size 2
# compare
ableton-composer compare \
profiles/albums/artist/album/bundle.json \
sets/generated-output
24. Export for Logic Pro
ableton-composer export-midi sets/my-song --target logic
ableton-composer export-xml sets/my-song --target logic
Use this when the next step is arranging or scoring in Logic Pro rather than round-tripping back into Ableton. The Logic target preset:
- prefixes part and track names with stable import order
- adds MIDI section markers from set section names
- writes MIDI key signature metadata when
meta.scaleis a simple major/minor key - reserves channel 10 for drum-like tracks during MIDI export
25. Generate a Static Song Report
ableton-composer report sets/example --out reports/example-report.md
ableton-composer report sets/example --out docs/content/reports/example-report.md
Use this when you want a lightweight inspection page for demos, thesis material, or internal review. The report includes:
- metadata snapshot for BPM, scale, signature, sections, tracks, and notes
- section timeline SVG
- energy curve SVG
- section, track, and role presence tables
- density summaries derived from notes per bar
When saved under docs/content/, the generated Markdown becomes part of the Minuto docs build automatically.
26. Export MIDI for REAPER
ableton-composer export-midi sets/my-song --target reaper
Use this when the next step is arranging or editing MIDI directly in REAPER. The REAPER target preset:
- keeps original track names instead of renaming them for score import order
- adds MIDI section markers from set section names
- reserves channel 10 for drum-like tracks during MIDI export
- writes to
exports/<name>-reaper.midunless you override--out
27. Build an Evaluation Pack for Thesis or User Studies
ableton-composer evaluation-pack \
sets/generated-a \
sets/generated-b \
--reference profiles/albums/example-artist/midnight-signals/bundle.json \
--roundtrip midi,musicxml \
--out reports/session-01
Add critique when you want qualitative feedback in the same bundle:
ableton-composer evaluation-pack \
sets/generated-a \
--reference profiles/albums/example-artist/midnight-signals/bundle.json \
--roundtrip midi \
--critique \
--rubric auto \
--provider openai \
--out reports/session-02
The command writes:
evaluation-pack.jsonwith structured per-target resultsREADME.mdwith a quick human-readable summary
This is the intended bridge between generation, compare, critique, and interoperability validation when you need repeatable evaluation artifacts.
29. Revise From Critique
ableton-composer critique sets/my-song --rubric auto --out reports/my-song.critique.json
ableton-composer revise sets/my-song \
--critique reports/my-song.critique.json \
--provider openai \
--out sets/my-song-revised/
Use this when the first symbolic generation is structurally promising but needs a second pass guided by explicit critique. The revision workflow:
- keeps the process in the symbolic domain instead of re-entering audio transcription
- reuses strengths from the original set where possible
- turns critique findings and suggested revisions into a fresh full AbletonSong output
- is a natural bridge between
generate,critique, and laterpush
Format Versioning
New full AbletonSong JSON outputs include a format marker:
{
"_format": {
"name": "AbletonSong",
"version": "0.3"
},
"meta": {},
"sections": []
}
Set directories store the same marker in meta.json; loaders lift it back to the full-song level. Older unversioned files still load normally and are upgraded to the current marker the next time they are saved by a command.
Notation Metadata Layer
MusicXML-oriented workflows can now persist an optional notation layer without affecting Ableton push. Typical locations are:
meta.notationfor key/time signature details from MusicXMLsection.notationfor original measure boundstrack.notationfor part ids, source names, and clef hintsnote.notationfor pitch spelling, note type, voice/staff, ties, and unpitched percussion display data
This keeps the core format MIDI-friendly while allowing better MusicXML export and future notation-aware features.
Provenance Metadata
New generated and imported songs also include optional meta.provenance metadata. This is reproducibility context, not musical content, and Ableton push ignores it.
Typical fields include:
source_type, such asgenerated,imported-musicxml,imported-midi, orpulled-abletonsource_pathandsource_formatfor importsprovider,model,prompt_summary, andprompt_hashfor AI generationstyle_profilewhen generation used a profile bundletransforms, a lightweight history of operations such asgenerate,import-xml,expand,split, orcompile
Older files without provenance still load normally. Commands that save the song again can add or append provenance history where practical.
Example Corpus
The repository includes a small synthetic corpus under examples/ for repeatable demos and smoke tests:
examples/ableton-song/*.song.jsonfor direct analysis and visualization testsexamples/musicxml/simple-harmony-lyrics.musicxmlfor MusicXML harmony/lyrics import testsexamples/midi/simple-melody.midfor MIDI import tests
Example commands:
ableton-composer analyze examples/ableton-song/multi-section-song.song.json \
--scope song \
--print
ableton-composer import-xml examples/musicxml/simple-harmony-lyrics.musicxml \
--chord-track \
--out /tmp/ac-simple-xml/
ableton-composer import-midi examples/midi/simple-melody.mid \
--out /tmp/ac-simple-midi/