Skip to main content

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:

CratePathRole
audiofiles-corecrates/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-browsercrates/audiofiles-browser/Shared egui UI. File list, detail panel, waveform display, search/filter, import wizard, analysis progress, export, themes.
audiofiles-appcrates/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-synccrates/audiofiles-sync/Cloud sync via SyncKit. Pushes/pulls sample metadata, tags, and VFS structure across devices. E2E encrypted.
audiofiles-rhaicrates/audiofiles-rhai/Rhai scripting engine for device export profiles. Transforms sample metadata and file layout for hardware samplers.
audiofiles-benchcrates/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

WhatWhere
Domain librarycrates/audiofiles-core/src/
Tag rules (Layer A)crates/audiofiles-core/src/rules.rs
Starter filename rule packcrates/audiofiles-core/src/starter_rules.rs
Benchmarks + corpus buildercrates/audiofiles-bench/, scripts/corpus.py
UI componentscrates/audiofiles-browser/src/
Desktop app shellcrates/audiofiles-app/src/
Device export profilescrates/audiofiles-rhai/plugins/bundled/
Architecturedocs/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.

License

PolyForm Noncommercial 1.0.0