πΉ Quiver
A modular audio synthesis library using Arrow-style combinators and graph-based patching.
Table of Contents
- Project Status
- Why Quiver?
- Features
- Architecture
- Quick Start
- Documentation
- Examples
- Development
- Contributing
- License
π§ Project Status
Quiver is pre-1.0 and under active development. There are no published releases yet β depend on it via git if you want to experiment. The three-layer architecture is in place and the module set is broad, but the public API is still evolving and may change between commits without notice. Expect rough edges; feedback and contributions are very welcome.
π€ Why Quiver?
Traditional audio synthesis libraries often force you to choose between:
- Low-level control with verbose, error-prone code
- High-level convenience that hides the signal flow
Quiver gives you both. Inspired by category theory and modular synthesizers, it provides:
| Approach | Benefit |
|---|---|
| π Arrow Combinators | Compose modules like functions with type-safe operators |
| ποΈ Patch Graph | Visual, intuitive signal routing like hardware modular synths |
| ποΈ Analog Modeling | Authentic warmth with component drift and saturation |
| β‘ Zero Allocation | Real-time safe with predictable performance |
// Compose modules functionally with Arrow-style combinators
let synth = oscillator >>> filter >>> amplifier;
// Or patch them like hardware, jack to jack
patch.connect.unwrap;
How Quiver Compares
Quiver's niche is an embeddable, Rust-first modular-synth graph with hardware-style
semantics β a no_std core plus first-class WebAssembly bindings.
| Quiver | FunDSP | VCV Rack | Glicol / Web Audio | |
|---|---|---|---|---|
| Form | Rust library | Rust library | Desktop application | DSL / browser graph |
| Model | Modular graph + Arrow combinators | Combinator DSP graphs | Patchable rack of plugins | Live-coding / node graph |
| Semantics | Hardware-style ports (V/Oct, gate, CV, normalled jacks) | Signal-flow operators | Eurorack-style modules | Audio nodes / DSL |
no_std core |
β | partial | β | β |
| WASM bindings | β (first-class) | via wasm-pack | β | β (browser-native) |
| Zero-alloc audio path | β | β | n/a | n/a |
If you want a signal-flow combinator DSP library, FunDSP is excellent and an inspiration. If you want a finished desktop instrument, use VCV Rack. Quiver is for building modular instruments and tools β in native apps, plugins, or the browser β from Rust.
β¨ Features
- π Typed Combinators: Compose audio modules using category-theory-inspired operators (
>>>,***,&&&) - ποΈ Graph-Based Patching: Build complex synthesizer patches with a flexible node/cable system
- ποΈ Analog Modeling: Realistic VCO drift, filter saturation, and component tolerances
- πΉ Polyphony: Built-in voice allocation with multiple algorithms
- β‘ SIMD Optimization: Optional vectorized processing for performance-critical applications
- πΎ Serialization: Save and load patches as JSON
- π§
no_stdSupport: Run on embedded systems and WebAssembly targets
ποΈ Architecture
Quiver is built in three composable layers:
graph TD
subgraph "Layer 3: Patch Graph"
VCO[VCO] --> VCF[VCF]
VCF --> VCA[VCA]
VCA --> Output[Output]
VCO --> LFO[LFO]
LFO --> VCF
ADSR[ADSR] --> VCA
end
subgraph "Layer 2: Port System"
Ports["SignalKind: Audio | V/Oct | Gate | Trigger | CV<br/>ModulatedParam: Linear | Exponential | V/Oct ranges"]
end
subgraph "Layer 1: Typed Combinators"
Combinators["Chain (>>>) | Parallel (***) | Fanout (&&&) | Feedback"]
end
Output ~~~ Ports
Ports ~~~ Combinators
Layer 1 - Combinators: Functional composition with type-safe signal flow Layer 2 - Ports: Rich metadata for inputs/outputs with modulation support Layer 3 - Graph: Visual patching with cables, mixing, and normalled connections
π Quick Start
Add Quiver to your Cargo.toml (the package is published as quiver-dsp
because the bare name quiver was taken on crates.io; the library name is
still quiver, so imports are use quiver::...):
[]
= "0.1"
Feature Flags
| Feature | Default | Description |
|---|---|---|
std |
Yes | Full functionality including OSC, plugins, visualization (implies alloc) |
alloc |
No | Serialization, presets, and I/O for no_std + heap environments |
simd |
No | SIMD vectorization for block processing (works with any tier) |
wasm |
No | WebAssembly bindings (wasm-bindgen) + TypeScript types (tsify); implies alloc. Powers packages/@quiver/wasm and the browser synth demo |
no_std Support
Quiver supports three tiers for different environments. All tiers are no_std
but require a global allocator β the core graph uses Box/Vec/String, so
there is no allocator-free tier:
# Tier 1: Core DSP only (no_std, heap required β bring your own #[global_allocator])
= { = "0.1", = false }
# Tier 2: With serialization & presets (WASM web apps)
= { = "0.1", = false, = ["alloc"] }
# Tier 3: Full std (desktop apps, default)
= "0.1"
| Tier | DSP | Serialize | Presets | I/O | OSC/Plugins | Visual |
|---|---|---|---|---|---|---|
| Core | β | |||||
alloc |
β | β | β | β | ||
std |
β | β | β | β | β | β |
Build a subtractive synthesizer voice β VCO β VCF β VCA, shaped by an ADSR envelope:
use *;
π Documentation
| Resource | Description |
|---|---|
| π User Guide | Comprehensive tutorials and concepts |
| π API Reference | Rustdoc documentation |
| π‘ Examples | Runnable example patches |
| πΊοΈ DEVELOPMENT.md | Architecture decisions and roadmap |
π΅ Examples
Run the examples to hear Quiver in action:
# Simple patch demo
# FM synthesis tutorial
# Polyphonic synth
# See all examples
Example Patches
| Example | Description |
|---|---|
simple_patch |
Basic VCO β VCF β VCA signal chain |
tutorial_fm |
FM synthesis with modulator/carrier |
tutorial_polyphony |
Polyphonic voice allocation |
tutorial_subtractive |
Classic subtractive synthesis |
howto_midi |
MIDI input handling |
π οΈ Development
# Setup development environment (installs tools and git hooks)
# Run all checks (format, lint, test)
# Run tests with coverage (80% threshold)
# Format and lint
# Generate changelog
# See all available commands
See DEVELOPMENT.md for the development roadmap and architecture decisions.
π€ Contributing
Contributions are welcome! Please read our Contributing Guidelines before submitting a PR.
Areas Where Help is Appreciated
| Area | Examples |
|---|---|
| π DSP Algorithms | Filter models, oscillator antialiasing, effects |
| π§ͺ Testing | Audio comparison tests, performance benchmarks |
| π Documentation | Tutorials, examples, API docs |
| ποΈ Modules | Classic hardware module implementations |
Quick Contribution Guide
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-filter) - Make your changes
- Run checks (
make check) - Commit with conventional commits
- Open a Pull Request
Look for issues labeled good first issue to get started!
π License
This project is licensed under the MIT License - see the LICENSE file for details.