2026-09-13 13:24:18 +02:00
|
|
|
|
# galdr
|
|
|
|
|
|
|
|
|
|
|
|
A terminal **grid synthesizer**. Signal flows downward through a field of
|
|
|
|
|
|
single-glyph unit generators; every incoming MIDI note voices the whole grid;
|
|
|
|
|
|
the mix is rendered low-latency to PipeWire. It is orca's voice — the same
|
|
|
|
|
|
esoteric, spatial approach to programming, but for making sound instead of
|
|
|
|
|
|
sending events.
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
orca-rs ──MIDI/OSC/UDP──▶ galdr ──PipeWire──▶ speakers
|
|
|
|
|
|
compose the pattern voice it (spectrust -p visualizes it)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## The grid
|
|
|
|
|
|
|
|
|
|
|
|
Signal flows **down**: each cell takes the sample from the cell above as its
|
2026-09-13 14:06:12 +02:00
|
|
|
|
input. Glyphs are **UPPERCASE** operators. A digit `0`–`9` to the left/right is
|
|
|
|
|
|
a constant parameter; a lowercase letter `a`–`z` reads MIDI CC (`a` = CC 0).
|
2026-09-13 13:24:18 +02:00
|
|
|
|
|
2026-09-13 14:06:12 +02:00
|
|
|
|
| glyph | unit generator | left / right param |
|
|
|
|
|
|
|---|---|---|
|
|
|
|
|
|
| `O` | sine | ratio |
|
|
|
|
|
|
| `A` | saw | ratio |
|
|
|
|
|
|
| `U` | pulse | width |
|
|
|
|
|
|
| `V` | triangle | — |
|
|
|
|
|
|
| `N` | noise | — |
|
|
|
|
|
|
| `L` `H` `B` | low / high / band-pass (SVF) | cutoff / resonance |
|
|
|
|
|
|
| `E` | envelope (gated by the note) | attack / release |
|
|
|
|
|
|
| `S` | soft clip (tanh) | drive |
|
|
|
|
|
|
| `C` | hard clip | threshold |
|
|
|
|
|
|
| `F` | wavefolder | amount |
|
|
|
|
|
|
| `D` | decimate / bitcrush | rate |
|
|
|
|
|
|
| `G` | gain | amount |
|
|
|
|
|
|
| `R` | ring modulator | ratio |
|
|
|
|
|
|
| `M` | mix — adds the cell to its **left** | — |
|
|
|
|
|
|
| `!` | output to master | — |
|
2026-09-13 13:24:18 +02:00
|
|
|
|
|
|
|
|
|
|
Each `!` sums into the master, so parallel columns stack timbres or voices.
|
|
|
|
|
|
A note plays every column at once.
|
|
|
|
|
|
|
|
|
|
|
|
Example — a filtered saw with an envelope:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
2026-09-13 14:06:12 +02:00
|
|
|
|
A saw at the note pitch
|
|
|
|
|
|
L lowpass, cutoff from the digit to its left...
|
|
|
|
|
|
E ...enveloped by the note gate
|
2026-09-13 13:24:18 +02:00
|
|
|
|
! ...to master
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Editing the grid recompiles and hot-swaps the running program without dropping
|
2026-09-13 14:06:12 +02:00
|
|
|
|
audio. There is no embedded scope — run a spectrum analyzer (e.g. `spectrust`)
|
|
|
|
|
|
on the side if you want one.
|
2026-09-13 13:24:18 +02:00
|
|
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
galdr [--latency <frames>] [--poly <n>] [--rate <hz>] [--midi-name <s>]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
galdr creates a virtual MIDI input port named **galdr**; connect orca or any
|
|
|
|
|
|
sequencer/DAW to it. `--midi-name` connects to an existing port instead.
|
|
|
|
|
|
Cursor keys move; type a glyph to place it; Backspace clears; Esc quits.
|
|
|
|
|
|
|
|
|
|
|
|
Runtime deps: PipeWire and ALSA (MIDI). Built in Rust; reuses the native
|
|
|
|
|
|
PipeWire path from spectrust.
|