tunes
A standalone Rust library for music composition, synthesis, and audio generation with real-time, concurrent playback and control. Build complex musical pieces with an intuitive, expressive API — no runtime dependencies required.
Perfect for algorithmic music, game audio, generative art, and interactive installations.
Features
- Music Theory: Scales, chords, patterns, progressions, and transposition
- Composition DSL: Fluent API for building musical sequences
- Sections & Arrangements: Create reusable sections (verse, chorus, bridge) and arrange them
- Synthesis: FM synthesis, Granular synthesis, filter envelopes, wavetable oscillators
- Sample Playback: Load and play WAV files with pitch shifting
- Rhythm & Drums: Drum grids, euclidean rhythms, 808-style synthesis, and pattern sequencing
- Instruments: 100+ Pre-configured synthesizers, bass, pads, leads, guitars, percussion, brass, strings, woodwinds and more
- Effects, Automation and Filters: Delay, reverb, distortion, chorus, modulation, tremolo, autopan, gate, limiter, compressor, bitcrusher, eq, phaser, flanger, saturation, filters
- Musical Patterns: Arpeggios, ornaments, tuplets, classical techniques
- Algorithmic Sequences: Primes, Fib, 2^x, Markov, L-map, Collatz, Euclidean, Golden ratio, random/bounded walks, Thue-Morse, Recamán's, Van der Corput, L-System, Cantor, Shepherd, Cellular Automaton, and many more
- Tempo & Timing: Tempo changes, time signatures (3/4, 5/4, 7/8, etc.), key signatures with modal support
- Key Signatures & Modes: Major, minor, and all 7 Greek modes (Dorian, Phrygian, Lydian, etc.)
- Real-time Playback: Cross-platform audio output with concurrent mixing, live volume/pan control
- Audio Export: WAV (uncompressed), FLAC (lossless ~50-60% compression), STEM export
- MIDI Import/Export: Import Standard MIDI Files and export compositions to MIDI with proper metadata
- Sample Import: Load and manipulate WAV samples
- Live Coding: Hot-reload system - edit code and hear changes instantly
Installation
Add this to your Cargo.toml:
[]
= "0.7.0"
Platform Requirements
Linux users need ALSA development libraries:
# Debian/Ubuntu
# Fedora/RHEL
macOS and Windows work out of the box with no additional dependencies.
Quick Start: Super simple!!
Real-time Playback
use *;
Export to WAV
use *;
Export to FLAC (Lossless Compression)
use *;
Sample Playback
use *;
MIDI Import/Export
use *;
Live Coding (Hot Reload)
# 1. Copy the template
# 2. Start live coding mode
# 3. Edit my_live.rs and save - hear changes instantly!
The live coding system watches your file and automatically:
- ✅ Recompiles when you save
- ✅ Stops the old version
- ✅ Starts playing the new version
- ✅ Shows compilation errors in real-time
Perfect for iterative composition, live performances, and experimentation!
// my_live.rs - edit and save to hear changes!
use *;
Important:
- Don't use
.repeat(1000)- it creates too many events for smooth real-time synthesis - Instead, use a regular
loopto play the mixer repeatedly - Buffer size 4096 works well for most systems (increase to 8192 or 16384 if you hear glitches)
Comparison with Other Music Programming Libraries
tunes occupies a unique position in the music programming landscape:
| Feature | SuperCollider | Sonic Pi | Leipzig | Strudel | tunes | Music21 |
|---|---|---|---|---|---|---|
| Type safety | No | No | No (Clojure) | Partial (TS) | Yes (Rust) | No |
| Real-time audio | Yes | Yes | Yes (Overtone) | Yes (Web Audio) | Yes | No |
| Sample playback | Yes | Yes | Yes (Overtone) | Yes | Yes | No |
| WAV export | Yes (manual) | No | Via Overtone | No (browser) | Yes (easy) | Yes |
| FLAC export | Yes (manual) | No | No | No | Yes (easy) | No |
| MIDI import | Yes | No | No | No | Yes | Yes |
| MIDI export | Yes | No | No | No | Yes | Yes |
| Live coding | Yes | Yes | Partial | Yes | Yes | No |
| Easy to learn | No | Yes | Medium | Yes | Yes | Yes |
| No dependencies | No (needs SC) | No (needs Ruby) | No (Clojure+SC) | No (browser/Node) | Yes | No |
| Algorithmic patterns | Yes | Yes | Yes | Yes | Yes | Yes |
| Music theory | Manual | Manual | Yes | Some | Yes (built-in) | Yes |
| Standalone binary | No | No | No | No | Yes | No |
| Embeddable | No | No | No | No | Yes | No |
When to use tunes
tunes excels at:
- Building Rust applications with music generation (games, art installations, tools)
- Algorithmic composition with type-safe APIs
- Offline music generation and batch processing
- Learning music programming without complex setup
- Prototyping musical ideas with immediate feedback
Use alternatives if you need:
- SuperCollider: Extreme synthesis flexibility and live coding ecosystem
- Sonic Pi: Classroom-ready live coding with visual feedback
- Leipzig: Functional composition with Clojure's elegance
- Strudel: Browser-based collaboration and live coding
- Music21: Academic music analysis and score manipulation
tunes' unique position
tunes is the only standalone, embeddable, type-safe music library with synthesis + sample playback. It compiles to a single binary with no runtime dependencies, making it ideal for:
- Rust game developers (Bevy, ggez, etc.)
- Desktop music applications
- Command-line music tools
- Embedded audio systems
Documentation
Run cargo doc --open to view the full API documentation with detailed examples for each module.
Testing
- The library includes 882 comprehensive tests and 255 doc tests ensuring reliability and correctness.
Examples
Run the included 60+ examples to hear the library in action:
# Sample playback (WAV file loading and playback)
# Export to WAV file
# Synthesis showcase (FM, filters, envelopes)
# Theory and scales
# Effects and effect automation (dynamic parameter changes over time)
# And many more...
Note: Use --release for examples with very complex synthesis to avoid audio underruns.
License
MIT OR Apache-2.0
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.