Grid grammar:
- a base-36 glyph above a column's top operator tags it with a MIDI channel;
'>' right of the tag makes the channel mono-legato (60 ms slide)
- operators below a '!' form the stereo master chain: Z delay, W chorus,
plus any filter/shaper
- X: phase modulation by the cell to the left (and above), index from the right
- K: control envelope; left of an operator it drives that operator's left
param (2KL5 = 303 filter sweep)
- per-note params: @ velocity, ^ key tracking, ? random; registers now read
on the digit scale, so MIDI CC and UDP registers have full range
I/O:
- MIDI keeps the channel nibble
- UDP (orca's ';', port 49161): k7 register, *3 bang a column, @34O write
a glyph, #name load a patch
- --stems n: one mono PipeWire node per channel tag (galdr.ch<tag>),
sample-aligned with the master; separate nodes because a playback
stream's AUX ports deliver no data in PipeWire 1.6
- the audio thread reconnects when PipeWire restarts; status line shows it
- patches: ~/hometaping/<date>.galdr by default, .galdr extension, Ctrl+S,
GALDR_DEBUG=<file> logs events
Examples with render tests: drums, orchestra, acid.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The process callback filled the whole mapped buffer every cycle. PipeWire
sizes that buffer by clock.quantum-limit (8192 frames by default) while the
graph drives galdr at the 256-frame quantum we ask for, so each cycle did
~32x the work and everything past the quantum was dropped: choppy output,
constant deadline misses in pw-top, and envelopes that sounded 32x faster
than their settings. Use Buffer::requested (pipewire feature v0_3_49),
clamped to the buffer, with the --latency value as fallback.
tui: typing a glyph no longer advances the cursor to the right.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Grid is now dynamic (w/h up to a max, fixed-stride storage so slot indices
stay stable and content isn't remapped). Ruler marks (+) on empty cells for
orientation; cursor clamps on shrink; status shows the size.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLUwWE2KmFPzhKaf67tWbx
Full clear+redraw each frame flickered on terminals that ignore
synchronized-update (macOS Terminal over SSH). Now only changed cells
repaint; full clear happens only on resize or help toggle. The glyph
legend moves into a '?'-toggled help overlay; the bottom bar just shows
voices/latency and the quit/help hints.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLUwWE2KmFPzhKaf67tWbx
- 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
Signal flows downward through single-glyph unit generators; each MIDI note
voices the whole grid; the mix renders low-latency to PipeWire (reusing the
native path from spectrust). Grid edits recompile and hot-swap without
dropping audio. Pairs with orca (note/CC source) and spectrust (visualizer).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLUwWE2KmFPzhKaf67tWbx