max / audiofiles
git clone https://makenot.work/git/max/audiofiles.git
git clone git@ssh.makenot.work:max/audiofiles.git
git send-email --to audiofiles@patches.makenot.work
Project: Audiofiles by max
| Name | Size | |
|---|---|---|
| .cargo/ | ||
| benchmarks/ | ||
| crates/ | ||
| dist/ | ||
| docs/ | ||
| scripts/ | ||
| .gitignore | 1.1 KB | |
| af-logo-1024.png | 13.4 KB | |
| bento.toml | 1008 B | |
| Cargo.lock | 181.3 KB | |
| Cargo.toml | 4.6 KB | |
| CHANGELOG.md | 5.6 KB | |
| CLA.md | 6.4 KB | |
| clippy.toml | 898 B | |
| CONTRIBUTING.md | 12.1 KB | |
| icon.svg | 1.4 KB | |
| LICENSE | 4.4 KB | |
| README.md | 8.4 KB | |
| rust-toolchain.toml | 86 B | |
| synckit.toml | 313 B |
README
audiofiles
A sample manager with content-addressed storage and a virtual file system. Standalone desktop app built with Rust, egui, and SQLite.
Prerequisites
- Rust (stable toolchain, 2024 edition)
No platform-specific audio libraries are required. Audio decoding uses Symphonia (pure Rust), SQLite is bundled via rusqlite, and the standalone app uses cpal for system audio output.
Build and Run
# Standalone app
cargo run -p audiofiles-app
# Standalone app -- import a folder on launch
cargo run -p audiofiles-app -- /path/to/samples
# Run all workspace tests
cargo test --workspace
# Benchmarks (developers only; needs a corpus, see scripts/corpus.py)
cargo run --release -p audiofiles-bench # analysis pipeline
cargo run --release -p audiofiles-bench -- ingest # import and query
cargo run --release -p audiofiles-bench -- accuracy # bpm/key vs ground truth
cargo run --release -p audiofiles-bench -- layer-eval # classifier layer, cross-validated
# AF_BENCH_EVAL_LABELS=family (default),
# family-tom-split, instrument
Workspace Architecture
Six crates:
| Crate | Path | Role |
|---|---|---|
audiofiles-core | crates/audiofiles-core/ | Domain library. SQLite database, content-addressed store (SHA-256), audio decoding (Symphonia), analysis pipeline (loudness, BPM, key, spectral features), VFS, tag system, VP-tree similarity index. |
audiofiles-browser | crates/audiofiles-browser/ | Shared egui UI. File list, detail panel, waveform display, search/filter, import wizard, analysis progress, export, themes. |
audiofiles-app | crates/audiofiles-app/ | Standalone desktop app via eframe. System audio (cpal), drag-and-drop import, native drag-out to Finder/DAWs, system tray, CLI import, OTA updates. |
audiofiles-sync | crates/audiofiles-sync/ | Cloud sync via SyncKit. Pushes/pulls sample metadata, tags, and VFS structure across devices. E2E encrypted. |
audiofiles-rhai | crates/audiofiles-rhai/ | Rhai scripting engine for device export profiles. Transforms sample metadata and file layout for hardware samplers. |
audiofiles-bench | crates/audiofiles-bench/ | Benchmark binary. Analysis-pipeline timing, vault ingest and query latency, BPM/key accuracy against labeled corpora, and cross-validated per-class accuracy for the classifier layer. Not shipped in the app. |
Dependency flow: audiofiles-core is the leaf -> audiofiles-rhai and audiofiles-sync depend on core -> audiofiles-browser depends on core, sync, and rhai -> audiofiles-app depends on browser and core. audiofiles-bench depends on core only.
Theme loading comes from makeover, published to crates.io. Shared libraries from ../../MNW/shared/: synckit-client (cloud sync SDK).
Features
Storage & Organization
- Content-addressed storage: samples stored by SHA-256 hash, automatic deduplication
- Virtual file system: organize samples in virtual directories independent of disk location, multiple VFS roots
- Tag system: hierarchical dot-notation tags with auto-suggestions from analysis results
- Smart folders: saved filter queries that update dynamically
- Collections: cross-VFS sample groupings
Audio Analysis
- Analysis pipeline: loudness (peak/RMS/LUFS), BPM detection, key detection, spectral analysis
- Classification: deterministic DSP features feed a layered tag pipeline (user-authored rules, then k-NN over the samples you have already tagged). Multi-label, and every tag records where it came from. No trained model ships in the binary. See
docs/ml_classifier.md - Loop detection: identifies seamless loops via amplitude envelope analysis
- Similarity search: VP-tree indexed fingerprinting for finding similar and duplicate samples (O(log n) lookup)
- Waveform display: pre-computed peak data with click-to-seek playback
Search & Filtering
- Text search: FTS5 indexed across filenames, tags, and metadata
- Parameter filters: BPM range, duration range, loudness range, key selector
- Tag prefix matching: type a tag prefix to filter by hierarchy
Editing
- Destructive editing: trim, fade in/out, normalize, reverse, gain adjust
- Edit history: full undo/redo stack per sample
- Bulk operations: bulk delete, move, rename, tag across selections
- Rename engine: pattern-based renaming with tokens (name, bpm, key, index, etc.)
Device Export
- Rhai export profiles: scriptable export for 14 hardware samplers: M8, Digitakt, Digitakt II, Octatrack, Model:Samples, SP-404 MKII, MPC, Polyend Tracker, Deluge, Blackbox, Volca Sample 2, OP-1, Circuit Rhythm, Maschine+
Playback & Integration
- MIDI instrument: chromatic and multi-sample playback modes with 8-voice polyphony and ADSR envelopes
- Native drag-out: drag samples from the file list directly to Finder, Desktop, or any DAW (macOS + Windows)
- System tray: minimize to tray, quick access
Infrastructure
- Cloud sync: cross-device sync of metadata, tags, and VFS via SyncKit (E2E encrypted, ChaCha20-Poly1305 + Argon2)
- OTA updates: background update checker with consent dialog
- Bundled themes: dark, light, and high-contrast variants in TOML format, from the shared makeover crate
- Audio formats: WAV, FLAC, MP3, OGG, AIFF (via Symphonia, pure Rust)
- Platforms: macOS, Windows, Linux (standalone, no backend required)
Key Paths
| What | Where |
|---|---|
| Domain library | crates/audiofiles-core/src/ |
| Tag rules (Layer A) | crates/audiofiles-core/src/rules.rs |
| Starter filename rule pack | crates/audiofiles-core/src/starter_rules.rs |
| Benchmarks + corpus builder | crates/audiofiles-bench/, scripts/corpus.py |
| UI components | crates/audiofiles-browser/src/ |
| Desktop app shell | crates/audiofiles-app/src/ |
| Device export profiles | crates/audiofiles-rhai/plugins/bundled/ |
| Architecture | docs/architecture.md |
Verifying a release
Every Linux release artifact (.AppImage, .deb) is published with a detached
minisign signature beside it, named
<artifact>.minisig. audiofiles does not update itself, so running this check is
the only thing that tells you a download is the build we published.
Download both files, then:
minisign -Vm Audiofiles-<version>-<arch>.AppImage -p makecreative.pub
The public key is dist/makecreative.pub in this repository:
untrusted comment: Make Creative, LLC release key (minisign)
RWSMMbsBuZY5GfFRHPd19bZAVcyFAI4zsUlPjC5RaS/5tL7zT45SpjD9
You can also pass it inline instead of saving the file:
minisign -Vm Audiofiles-<version>-<arch>.AppImage -P 'RWSMMbsBuZY5GfFRHPd19bZAVcyFAI4zsUlPjC5RaS/5tL7zT45SpjD9'
Expect Signature and comment signature verified. Any other result means the
file is not what we published. Do not run it.
Contributing
This project is licensed under PolyForm Noncommercial 1.0.0. Make Creative, LLC owns the codebase and needs to hold clear title to all of it, so contributions work a little differently here than on a permissively licensed project.
Found a bug, or something small and obviously wrong? Open a bug report rather than sending a patch. A clear report of what you did, what happened, and what you expected is worth more to us than a diff, and it saves you the paperwork below.
Want to build something substantial? Write to info@makenot.work first. We are open to paying for contributions that matter, and we would rather agree on scope and terms before you spend your evenings on it than after.
Sending code directly? Any code you submit is covered by the Contributor License
Agreement in CLA.md, which assigns copyright in the contribution to Make Creative,
LLC. Read it before you send anything. Add these lines to your commit message to
record that you accept it:
Make-Creative-CLA: 1.0.0
Signed-off-by: Your Name <your@email>
We may decline a contribution for any reason, including that it is not something we want to maintain.