quiver-dsp 0.1.0

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

The mathematics underlying Quiver's design and DSP algorithms.

## Category Theory

### Quivers

A **quiver** $Q = (V, E, s, t)$ consists of:
- $V$: Set of vertices (objects)
- $E$: Set of edges (arrows/morphisms)
- $s: E \to V$: Source function
- $t: E \to V$: Target function

In Quiver:
- Vertices = Modules
- Edges = Patch cables
- Source/Target = Output/Input ports

### The Free Category

Given a quiver $Q$, the **free category** $\text{Path}(Q)$ has:
- Objects: Same as $Q$'s vertices
- Morphisms: Paths (sequences of composable arrows)
- Composition: Path concatenation

This is what `patch.compile()` computes.

### Arrow Laws

For arrows $f: A \to B$, $g: B \to C$, $h: C \to D$:

**Identity:**
$$\text{id}_B \circ f = f \circ \text{id}_A = f$$

**Associativity:**
$$(h \circ g) \circ f = h \circ (g \circ f)$$

**First/Second:**
$$\text{first}(f) = f \times \text{id}$$
$$\text{second}(f) = \text{id} \times f$$

## Digital Signal Processing

### Sampling Theory

**Nyquist-Shannon Theorem:**
A signal can be perfectly reconstructed if sampled at rate $f_s > 2f_{max}$.

At 44.1 kHz: $f_{max} = 22.05$ kHz

### Z-Transform

The z-transform converts discrete signals to the z-domain:

$$X(z) = \sum_{n=-\infty}^{\infty} x[n] z^{-n}$$

Unit delay: $z^{-1}$ (one sample delay)

### Transfer Functions

**Lowpass filter (1-pole):**
$$H(z) = \frac{1-p}{1-pz^{-1}}$$

Where $p = e^{-2\pi f_c / f_s}$

**State-Variable Filter:**
$$\begin{aligned}
\text{LP} &= \text{LP}_{n-1} + f \cdot \text{BP}_{n-1} \\
\text{HP} &= \text{input} - \text{LP} - q \cdot \text{BP}_{n-1} \\
\text{BP} &= f \cdot \text{HP} + \text{BP}_{n-1}
\end{aligned}$$

## Waveform Mathematics

### Sine Wave

$$x(t) = A \sin(2\pi f t + \phi)$$

### Sawtooth (Band-Limited)

Fourier series:
$$x(t) = \frac{2}{\pi} \sum_{k=1}^{\infty} \frac{(-1)^{k+1}}{k} \sin(2\pi k f t)$$

### Square Wave

$$x(t) = \frac{4}{\pi} \sum_{k=1,3,5,...}^{\infty} \frac{1}{k} \sin(2\pi k f t)$$

Only odd harmonics!

### Triangle Wave

$$x(t) = \frac{8}{\pi^2} \sum_{k=1,3,5,...}^{\infty} \frac{(-1)^{(k-1)/2}}{k^2} \sin(2\pi k f t)$$

## Envelope Mathematics

### Exponential Segments

**Attack (charging capacitor):**
$$v(t) = V_{max} (1 - e^{-t/\tau})$$

**Decay/Release (discharging):**
$$v(t) = V_{start} \cdot e^{-t/\tau}$$

Time constant $\tau$: time to reach $1 - 1/e \approx 63.2\%$

### RC Time Constant

$$\tau = RC$$

For envelope times: $\tau = \text{time} / \ln(1000) \approx \text{time} / 6.9$

## FM Synthesis

### Basic FM Equation

$$y(t) = A \sin(2\pi f_c t + I \sin(2\pi f_m t))$$

- $f_c$: Carrier frequency
- $f_m$: Modulator frequency
- $I$: Modulation index

### Sidebands

FM produces sidebands at:
$$f_c \pm n \cdot f_m \quad (n = 1, 2, 3, ...)$$

Number of significant sidebands ≈ $I + 1$

### Bessel Functions

Amplitude of each sideband given by Bessel functions:
$$A_n = J_n(I)$$

## Filter Response

### Pole-Zero Form

$$H(z) = \frac{\sum_{k=0}^{M} b_k z^{-k}}{\sum_{k=0}^{N} a_k z^{-k}}$$

### Cutoff Frequency

For bilinear transform:
$$\omega_d = \frac{2}{T} \tan\left(\frac{\omega_a T}{2}\right)$$

### Resonance (Q)

$$Q = \frac{f_0}{\Delta f}$$

Where $\Delta f$ is bandwidth at -3dB.

High Q → narrow peak → self-oscillation

## Analog Modeling

### Thermal Noise

$$V_n = \sqrt{4kTRB}$$

- $k$: Boltzmann constant
- $T$: Temperature (K)
- $R$: Resistance
- $B$: Bandwidth

### Saturation Functions

**Tanh (soft):**
$$y = \tanh(x \cdot \text{drive})$$

**Polynomial (3rd order):**
$$y = x - \frac{x^3}{3}$$

**Asymmetric:**
$$y = \tanh(a \cdot x^+) - \tanh(b \cdot x^-)$$

## V/Oct System

### Pitch to Frequency

$$f = f_0 \cdot 2^V$$

$f_0 = 261.63$ Hz (C4) at 0V

### Frequency to Pitch

$$V = \log_2\left(\frac{f}{f_0}\right)$$

### Semitone

$$\Delta V = \frac{1}{12} \text{ V} \approx 83.33 \text{ mV}$$

### Cent

$$\Delta V = \frac{1}{1200} \text{ V} \approx 0.833 \text{ mV}$$

## SIMD Mathematics

### Vectorized Operations

For 4-wide SIMD:
$$[a_1, a_2, a_3, a_4] + [b_1, b_2, b_3, b_4] = [a_1+b_1, a_2+b_2, a_3+b_3, a_4+b_4]$$

Single instruction, multiple data.

### Block Processing

Process $N$ samples per function call:
- Reduces function call overhead by factor of $N$
- Enables vectorization
- Improves cache locality

## References

- Smith, J.O. *Mathematics of the Discrete Fourier Transform*
- Välimäki, V. *Discrete-Time Synthesis of the Sawtooth Waveform*
- Mac Lane, S. *Categories for the Working Mathematician*
- Chowning, J. *The Synthesis of Complex Audio Spectra by Means of FM*