Skip to main content

.vibrai project files

A .vibrai file is a plain YAML text file — a song blueprint. It sits next to your .als file and describes:
  • Sections — the named parts of the arrangement (Verse 1, Chorus 1, Drop, etc.), their lengths, tension category, and positions.
  • Parts — what plays in each section: which track, which generator, and any scale or variation overrides.
  • Templates — arrangement-view clip placements and automation slot definitions.
  • Generation settings — global tempo, scale (root + name), and a deterministic seed.
Project files are human-readable, version-controllable, and round-trippable. The same file + the same seed always produces byte-identical output, so .vibrai files are a lightweight way to version-control your music. The vibrai capture command (CLI) or capture_project tool (MCP) creates a .vibrai from whatever is currently in your Live set — you don’t have to write one from scratch.

Generators

The engine ships four generators. Each generator receives a section’s tension level, the active scale, and a stable seed, and produces a set of MIDI notes: Euclidean — for rhythmic parts (kick, snare, hi-hat, percussion, crash, fill, roll). Uses the Bjorklund algorithm to spread hits evenly across a step grid. Tension controls density: higher tension = more hits; lower tension = sparser patterns. Melodic — for line-based parts (bass, lead, arp, riff, melody, hook, solo). Walks a 16-step grid over a chord progression chosen per tension category, drawing pitches from a per-genre melodic cell that defines step density, interval pool, octave range, and accent shape. Scale-aware and deterministic per seed. Ambient — for sustained harmonic parts (pads, chords, ambience, loops). Generates drop-2 chord voicings from a bank of chord progressions, chosen per tension category. Scale-aware: output respects the resolved scale for each (section, part) pair. FxSweep — for FX risers and releases. Emits one whole-note trigger per bar of the section; the rising or falling motion itself is a filter-cutoff sweep the arrangement engine writes as automation (exponential up for a riser, exponential down for a release). In a .vibrai part, the generator: field accepts Euclidean, Melodic, Ambient, or FxSweep. Genre presets (.vibraigenre files) wire each part type to the appropriate generator and configure section lengths, tempo, and templates. Fourteen genre libraries ship with Vibrai today.

Theme and variation

A Vibrai arrangement is built around a theme extracted from the first section (by position). Every other section’s output is derived from that theme, not from scratch — this guarantees coherence across a song. Variation operators let you modify the theme per-section without breaking coherence. Three operators ship today, applied in fixed order (transposedensitymotif) regardless of the order you write them in YAML: Variation is relative to the theme, not cumulative. Section 3’s output depends only on the theme + section 3’s own variation block — never on section 2. This means you can re-render a single section without affecting any other, and vibrai generate --dry-run can preview individual sections safely.
Scale overrides follow a Part > Section > Global precedence, resolved field-by-field. A Part can override only the root note while inheriting the Section’s scale name. This lets a single section set a key for all its parts while one part (say, the arp) plays in a different mode.

Harvested phrases

Generators synthesize notes. Harvested phrases are the alternative: literal MIDI you played, lifted out of your own Live set and replayed. Vibrai never authors phrase content. The only way one enters a genre is vibrai genre extract --faithful, which captures a phrase per part per section from the set you have open. A harvested phrase reaches a section two ways:
  • In the section it was captured from, it replays verbatim — the notes you played, transposed only by the scale root. That capture is ground truth, so nothing adjusts it.
  • In a section that has no phrase of its own, the part borrows one from elsewhere and re-fits it to that section’s chords: each note shifts by the root offset of the chord window it lands in, so intervals inside a window stay intact and the riff tracks the harmony.
The re-fit is what makes harvesting worth doing. A set with two recorded sections yields two phrases, and a genre has six to twelve — without borrowing, your riff would be absent from most of the song. Two details worth knowing:
  • Drum phrases are pooled but never re-fitted. A drum pitch is a pad identity, not a scale degree, so shifting it by a chord root would turn a kick into a tom.
  • A phrase carries the tension of the section it came from, and borrowing prefers a matching tension. Phrases captured before that field existed show as any — still eligible anywhere, just never preferred over a real match.

Curating a harvest

Extraction is indiscriminate, so phrase list shows you what it took and phrase remove drops a capture that did not survive contact with the rest of the song.
1

Harvest the open set

2

See what it captured

Each row reports the preset, part type and ordinal, the source section, that section’s tension, bar count, and note count.
3

Drop a capture you do not want

--confirm is required — this rewrites the genre file and cannot be undone. Built-in genres are read-only and rejected.
4

Regenerate and listen

Generated notes pass through the genre’s style modifiers — swing, humanize, ornaments, dropout — which vary per bar and can mask what a phrase is doing. To hear the phrase layer on its own, generate with --swing 0 --humanize 0 --ornaments 0 --dropout 0.
Both operations exist on the MCP surface as list_phrases and remove_phrase. See Phrase for the full parameter reference.