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
This commit is contained in:
Bendik Aagaard Lynghaug
2026-09-13 14:06:12 +02:00
co-authored by Claude Opus 4.8
parent d2778e169a
commit e68d50a78f
7 changed files with 305 additions and 500 deletions
+24 -17
View File
@@ -14,20 +14,26 @@ orca-rs ──MIDI/OSC/UDP──▶ galdr ──PipeWire──▶ speakers
## The grid
Signal flows **down**: each cell takes the sample from the cell above as its
input. The left and right neighbour glyphs are parameters — a digit `0`–`9` is
a constant, a letter `a`–`z` reads MIDI CC (`a` = CC 0).
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 |
|---|---|
| `~` | sine (ratio ← left) |
| `^` | saw (ratio ← left) |
| `_` | pulse (width ← left) |
| `v` | triangle |
| `*` | noise |
| `f` | lowpass (cutoff ← left) |
| `e` | envelope, attack/release ← left/right, gated by the note |
| `s` | shaper / drive ← left |
| `!` | output to master |
| 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.
@@ -35,14 +41,15 @@ A note plays every column at once.
Example — a filtered saw with an envelope:
```
^ saw at the note pitch
f lowpass, cutoff from the digit to its left...
e ...enveloped by the note gate
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.
audio. There is no embedded scope — run a spectrum analyzer (e.g. `spectrust`)
on the side if you want one.
## Usage