quiver-dsp 0.1.0

A modular audio synthesis library using Arrow-style combinators and graph-based patching
Documentation
# Preset Library

Quiver includes a library of preset patches for learning and quick starts.

## Using Presets

```rust,ignore
use quiver::prelude::*;

let library = PresetLibrary::new();

// List all presets (`list` / `by_category` are associated functions)
for preset in PresetLibrary::list() {
    println!("{}: {}", preset.name, preset.description);
}

// Get by category
let basses = PresetLibrary::by_category(PresetCategory::Bass);

// Search by tag
let acid = library.search_tags(&["acid"]);

// Build a preset (`get` returns Option, `build` returns Result)
if let Some(preset) = library.get("Moog Bass") {
    let patch = preset.build(44100.0)?;
}
```

## Categories

| Category | Description |
|----------|-------------|
| `Classic` | Iconic synth sounds |
| `Bass` | Bass patches |
| `Lead` | Lead/solo sounds |
| `Pad` | Sustained pad sounds |
| `Percussion` | Drums and percussion |
| `Effect` | Effects and textures |
| `SoundDesign` | Experimental sounds |
| `Tutorial` | Learning examples |

## Classic Presets

### Moog Bass

```
Category: Bass
Tags: moog, classic, warm

Architecture:
  VCO (saw) → Ladder Filter → VCA
  ADSR → Filter + VCA

Character:
  Deep, warm, punchy bass with filter sweep
```

### Juno Pad

```
Category: Pad
Tags: juno, warm, lush

Architecture:
  VCO (saw + sub) → SVF → VCA → Chorus
  Slow ADSR → Filter + VCA

Character:
  Wide, warm pad with subtle movement
```

### 303 Acid

```
Category: Bass
Tags: 303, acid, squelchy

Architecture:
  VCO (saw) → Diode Ladder → VCA
  Fast ADSR → Filter (high resonance)

Character:
  Classic acid squelch with resonant filter
```

### Sync Lead

```
Category: Lead
Tags: sync, aggressive, lead

Architecture:
  Master VCO → sync → Slave VCO
  LFO → Slave pitch
  SVF → VCA

Character:
  Cutting, aggressive lead with sync sweep
```

### PWM Strings

```
Category: Pad
Tags: strings, pwm, ensemble

Architecture:
  VCO (pulse) → SVF → VCA
  LFO → Pulse width
  Detuned voice layering

Character:
  Lush string ensemble with movement
```

## Tutorial Presets

### Basic Subtractive (Difficulty: 1)

```
Purpose: Learn VCO → VCF → VCA chain

Modules:
  - VCO: Basic oscillator
  - SVF: Lowpass filter
  - VCA: Volume control

Try:
  - Change waveform (saw/sqr/tri)
  - Adjust filter cutoff
  - Add resonance
```

### Envelope Basics (Difficulty: 1)

```
Purpose: Learn ADSR envelope shaping

Modules:
  - VCO → VCF → VCA
  - ADSR envelope

Try:
  - Adjust attack for slow fade-in
  - Short decay for plucky sounds
  - Sustain level for held notes
  - Release for pad tails
```

### Filter Modulation (Difficulty: 2)

```
Purpose: Learn LFO → filter modulation

Modules:
  - VCO → VCF → VCA
  - LFO → filter cutoff

Try:
  - Adjust LFO rate
  - Try different LFO waveforms
  - Change modulation depth
```

### FM Basics (Difficulty: 3)

```
Purpose: Intro to FM synthesis

Modules:
  - Carrier VCO
  - Modulator VCO → Carrier FM

Try:
  - Adjust C:M ratio
  - Change modulation depth
  - Envelope the FM amount
```

### Polyphony Intro (Difficulty: 3)

```
Purpose: Learn voice allocation

Modules:
  - 4-voice polyphonic patch
  - VoiceAllocator

Try:
  - Play chords
  - Change allocation mode
  - Add unison/detune
```

## Sound Design Presets

### Metallic Ring

```
Category: SoundDesign
Tags: ring, metallic, experimental

Architecture:
  VCO1 × VCO2 (ring mod)
  Inharmonic ratio

Character:
  Bell-like metallic tones
```

### Noise Sweep

```
Category: SoundDesign
Tags: noise, sweep, texture

Architecture:
  Noise → Resonant filter
  LFO → filter sweep

Character:
  Evolving filtered noise
```

### Wavefold Growl

```
Category: SoundDesign
Tags: wavefold, aggressive, bass

Architecture:
  VCO → Wavefolder → Filter

Character:
  Aggressive, harmonically rich growl
```

## Building Custom Presets

```rust,ignore
// Create preset info
let info = PresetInfo {
    name: "My Preset".to_string(),
    category: PresetCategory::Lead,
    description: "A custom lead sound".to_string(),
    tags: vec!["custom".into(), "lead".into()],
    difficulty: 2,
};

// Build the patch
fn build_preset(sample_rate: f64) -> Patch {
    let mut patch = Patch::new(sample_rate);
    // ... add modules and connections ...
    patch
}
```

## Preset File Format

Presets can be saved as JSON:

```json
{
  "name": "My Preset",
  "category": "Lead",
  "description": "Description here",
  "tags": ["custom", "lead"],
  "patch": {
    "modules": [...],
    "cables": [...],
    "parameters": {...}
  }
}
```

See [Serialization](../how-to/serialization.md) for details.