Files
galdr/README.md
T
Bendik Aagaard LynghaugandClaude Opus 4.8 e68d50a78f Uppercase operator glyphs, more effects, drop embedded spectrum
- Operators are now UPPERCASE (orca-style): O A U V N sources, L H B SVF
  filters (with resonance), E G R envelope/gain/ringmod, S C F D shapers
  (soft/clip/fold/decimate), M mix, ! out. Digits = constants, lowercase = CC.
- TUI rewritten on crossterm reusing orca-rs's grid-view approach (centered
  canvas, per-glyph colour); the spectrum is gone - run spectrust on the side.
- Drops the ratatui and rustfft deps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLUwWE2KmFPzhKaf67tWbx
2026-09-13 14:06:12 +02:00

66 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
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).
| 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 | — |
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:
```
A saw at the note pitch
L lowpass, cutoff from the digit to its left...
E ...enveloped by the note gate
! ...to master
```
Editing the grid recompiles and hot-swaps the running program without dropping
audio. There is no embedded scope — run a spectrum analyzer (e.g. `spectrust`)
on the side if you want one.
## 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.