livepilot-notes
This skill should be used when the user asks to "write notes", "add a melody", "chord progression", "rhythm pattern", "MIDI notes", "transpose", "quantize", "Euclidean rhythm", "counterpoint", "scale", "key detection", "harmony", or wants to create, edit, or analyze MIDI content in Ableton Live.
MIDI Notes — Create, Edit, and Analyze
Write melodies, chords, rhythms, and generative patterns in Ableton Live clips. Every note operation follows the Live 12 API.
Note API Cycle
Four operations form the core CRUD cycle for MIDI notes:
- Create:
add_notes(track_index, clip_index, notes)— write new notes into a clip - Read:
get_notes(track_index, clip_index)— retrieve all notes with IDs, pitches, timings - Update:
modify_notes(track_index, clip_index, modifications)— change existing notes bynote_id - Delete:
remove_notes(track_index, clip_index, start_time, duration, pitch_start, pitch_end)— clear a region, orremove_notes_by_id(track_index, clip_index, note_ids)— surgical deletion by ID
Always create a clip first with create_clip(track_index, clip_index, length) before adding notes to it.
Note Format
When calling add_notes, each note requires:
{
"pitch": 60,
"start_time": 0.0,
"duration": 0.5,
"velocity": 100,
"mute": false
}
When reading with get_notes, each note also returns Live 12 extended fields:
note_id— unique identifier for modify/remove operationsprobability— 0.0 to 1.0, per-note trigger probability (Live 12 feature)velocity_deviation— -127.0 to 127.0, randomizes velocity on each triggerrelease_velocity— 0.0 to 127.0, note-off velocity
Use modify_notes with note_id to update any field on existing notes — pitch, velocity, timing, probability, mute state.
Duplication and Transposition
duplicate_notes(track_index, clip_index, time_offset)— copy all notes forward bytime_offsetbeats. Use for pattern repetition: a 4-beat pattern duplicated at offset 4.0 creates an 8-beat loop.transpose_notes(track_index, clip_index, semitones, start_time, duration)— shift pitches in a region by semitones. Positive = up, negative = down.transpose_smart(track_index, clip_index, semitones, key)— transpose with scale awareness. Notes stay within the target key, avoiding chromatic collisions.
Quantization
quantize_clip(track_index, clip_index, grid, amount) snaps note start times to a rhythmic grid.
Grid enum values:
- 0 = None (no quantize)
- 1 = 1/4 notes
- 2 = 1/8 notes
- 3 = 1/8 triplets
- 4 = 1/8 + triplets (combined grid)
- 5 = 1/16 notes
- 6 = 1/16 triplets
- 7 = 1/16 + triplets (combined grid)
- 8 = 1/32 notes
The amount parameter (0.0-1.0) controls how far notes move toward the grid. Use 1.0 for rigid quantize, 0.5-0.7 for humanized feel.
Theory Integration
Run these checks before firing any clip with melodic content:
identify_scale(track_index, clip_index)— detect the scale from existing notes (Krumhansl-Schmuckler algorithm). Returns key, mode, and confidence.detect_theory_issues(track_index, clip_index, strict=true)— check for out-of-key notes, parallel fifths, voice crossing, augmented/diminished accidents. Thestrictflag enables all checks.- Fix problems with
modify_notes— adjust offending pitches before the user hears them.
The theory engine knows 7 standard modes. Exotic scales (Hijaz, Hungarian minor, whole tone) produce false "out of key" warnings. Cross-reference flagged pitches against the intended scale manually. Use key="C hijaz" for Hijaz/Phrygian Dominant keys.
Harmony Analysis and Suggestions
analyze_harmony(track_index, clip_index)— identify chords in a clip, returns chord names, qualities, root notes, and progression analysissuggest_next_chord(track_index, clip_index, key)— given the current harmonic context, suggest the next chord with voice leading and functional reasoningharmonize_melody(track_index, clip_index, key, style)— generate harmony notes for an existing melody. Returns a note array ready foradd_noteson a separate track.generate_countermelody(track_index, clip_index, key, species)— generate a counterpoint line against existing notes. Species 1-5 follow classical counterpoint rules. Returns notes foradd_notes.
Both harmonize_melody and generate_countermelody return note arrays — do not call them and discard the output. Place the results into a clip with add_notes.
Generative Algorithms
Euclidean Rhythms
generate_euclidean_rhythm(pulses, steps, pitch, velocity, duration) — distribute pulses as evenly as possible across steps using the Bjorklund algorithm. Returns a note array. The tool identifies named rhythms automatically (e.g., 3 pulses in 8 steps = "tresillo", 5 in 8 = "cinquillo").
layer_euclidean_rhythms(layers) — stack multiple Euclidean patterns for polyrhythmic textures. Each layer specifies pulses, steps, pitch, and velocity. Returns a combined note array spanning all layers, ready for a single add_notes call or split across tracks.
Minimalist Techniques
generate_tintinnabuli(melody_pitches, key, mode, position) — implement Arvo Part's technique: a T-voice (triad arpeggio) against a M-voice (stepwise melody). Returns two-voice note data.
generate_phase_shift(pattern, shift_amount, repetitions) — implement Steve Reich's phasing: two identical patterns drifting apart over time. One voice holds steady while the other shifts by shift_amount per repetition.
generate_additive_process(melody_pitches, iterations) — implement Philip Glass's additive technique: melody expanded by adding one note per iteration, building complexity gradually.
All generative tools return note arrays. Place them in clips with add_notes.
Neo-Riemannian Harmony
navigate_tonnetz(chord, transform)— apply PRL (Parallel, Relative, Leading-tone) transforms to a chord. Returns the neighbor chord and its relationship.find_voice_leading_path(start_chord, end_chord)— find the shortest harmonic path between two chords through Tonnetz space. Returns intermediate chords.classify_progression(chords)— identify the neo-Riemannian transform pattern in a chord sequence (e.g., PRL cycle, hexatonic, octatonic).suggest_chromatic_mediants(chord)— return all chromatic mediant relations with film score usage notes. Useful for dramatic harmonic shifts.
MIDI File I/O
export_clip_midi(track_index, clip_index, file_path)— export a session clip's notes to a .mid fileimport_midi_to_clip(track_index, clip_index, file_path)— load a .mid file into a clip, replacing existing notesanalyze_midi_file(file_path)— offline analysis of any .mid file (tempo, note count, structure). No Ableton connection needed.extract_piano_roll(file_path)— return a 2D velocity matrix (pitch x time) from a .mid file for visualization
Pitch Audit — Mandatory Before Firing
Before playing any clip with melodic or harmonic content:
identify_scaleon every melodic track — verify all tracks share the same tonal centeranalyze_harmonyon chordal tracks — verify chord quality (no accidental augmented/diminished)detect_theory_issues(strict=true)— check all theory rules- Report a clear tuning summary to the user before proceeding
- Fix wrong notes with
modify_notesbefore firing
Reference
Supporting references live in the livepilot-core skill's references/ directory:
livepilot-core/references/midi-recipes.md— drum patterns by genre, chord voicings, scale tables, hi-hat articulations, humanization, polymetric layering