Skip to content

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bravoh-daw

crates.io docs.rs License: MIT

Parse DAW project files in pure Rust — no DAW installation required.

One library, four formats, one unified schema:

Format Extension Under the hood
Ableton Live .als gzipped XML
FL Studio .flp binary event stream
Logic Pro .logicx bundle + ProjectData binary
REAPER .rpp plain-text chunk format

Every parser returns the same ParsedIntelligence struct, so downstream code never cares which DAW a project came from.

Why

Project files are where the real story of a track lives — tempo, arrangement, plugin chains, sample choices, routing. But each DAW buries that story in a different proprietary format, and the existing tooling is scattered across single-format libraries in different languages. bravoh-daw gives you all four majors behind one function call, fast enough to run on every file-save event.

Extracted from BRAVOH Studio, where these parsers run in production on real artists' projects every day.

Quick start

CLI

cargo install bravoh-daw
bravoh-daw my_track.als
{
  "daw": "Ableton Live",
  "daw_version": "Ableton Live 12.0",
  "bpm": 124.0,
  "tracks": [
    { "name": "Drums", "type": "audio", "plugins": [] },
    { "name": "Bass Synth", "type": "midi", "plugins": [] }
  ],
  "plugins": [],
  "samples": [],
  "midi_tracks": [],
  "markers": [],
  "mixer": {
    "total_tracks": 2,
    "audio_tracks": 1,
    "midi_tracks": 1,
    "return_tracks": 0,
    "group_tracks": 0,
    "has_sidechain": false
  },
  "automated_params": []
}

Library

[dependencies]
bravoh-daw = "0.1"
// Auto-detect the format from the extension
let intel = bravoh_daw::parse("my_track.als")?;
println!("{} @ {:?} BPM, {} tracks", intel.daw, intel.bpm, intel.tracks.len());

// Or parse as a specific format
use bravoh_daw::Daw;
let intel = bravoh_daw::parse_as("weird_name.backup", Daw::AbletonLive)?;

What gets extracted

Field Ableton Live FL Studio Logic Pro REAPER
BPM
Time signature
DAW version
Tracks (name + type)
Plugins (name + kind + count)
Samples
MIDI stats (notes, pitch range)
Markers
Mixer summary (track counts, sidechain)
Automated parameters
Duration + swing

Reliability doctrine

These formats are proprietary and partially reverse-engineered. The rule this crate lives by:

If a field can't be parsed dependably, it is omitted — never guessed.

That's why the matrix above has gaps. A missing field (None / empty vec) means "this DAW doesn't expose it reliably", not "we forgot". Logic Pro is the extreme case: its ProjectData binary is undocumented, so the parser extracts only what survives string-level analysis (plugin chains, samples, markers, routing) and refuses to report values that Logic itself computes unreliably.

Corrupt or truncated files return an error instead of panicking — every parser is fuzz-tested against garbage input in its test suite.

MSRV

Rust 1.87.

Contributing

Issues and PRs welcome — especially:

  • Sample project files from different DAW versions (the more real-world fixtures, the better)
  • Field coverage improvements for FL Studio and Logic Pro
  • Support for more DAWs (Cubase .cpr, Studio One .song, Bitwig .bwproject)

Run the gates before pushing — ./gates.sh (macOS/Linux) or .\gates.ps1 (Windows), which wrap:

cargo test && cargo clippy --all-targets -- -D warnings && cargo fmt --check

License

MIT © 2026 BRAVOH


Part of BRAVOH open source, the OSS initiative from the team building BRAVOH — the AI operating system for music artists.

About

Parse Ableton Live, FL Studio, Logic Pro & REAPER project files in pure Rust — one unified schema

Topics

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages