TouchPlaited v1.8.0 — the screen answers back
TouchPlaited v1.8.0:
- The OLED is a real UI now (status row, hold progress bars, knob-pickup screen, arp pool),
- e.g. I added info that shows what the modifiers combo's are.
- two audio bugs that found
- "distorts at polyphony 4" was gain staging
- and the Six-Op crackle is capped per engine.
- Mobile visualizer improved.
https://github.com/jonwaterschoot/TouchPlaited/releases/tag/v1.8.0
The full LLM overview of this round of changes:
The LLM overview:
Two rounds in one release. The 128×32 OLED stops being a mirror of the last thing you touched and starts answering questions — what's loaded, what a held combo is about to do, why a knob isn't responding. And building the instrumentation for that turned up two audio faults that had been described as separate mysteries: the output stage was saturating every voice from silence, and four held notes on an expensive engine sat above the load-shedder's threshold with the shedder structurally unable to fire.
Neither of those was on the plan. The screen work is what found them.
Added
- A status row. ~2 s after you stop touching anything the screen stops showing the last action and says where you are instead — Seq shows genre and transport, Rec shows which pad you're editing and cycles between what's loaded in it and the two ways out, Arp/Mel and Basic Pitch show the sub-state and the loaded model, and Basic Pitch adds the root next to the scale.
- Held combos show a progress bar, with a note under it saying what crossing the next threshold does, then a flash confirming what changed. The re-randomize holds, the sound-edit toggle and the recording entry all report themselves this way instead of leaving you counting seconds.
- A held modifier lists what it unlocks. Hold P0, P1 or P2 without pressing anything else and the screen fills with that modifier's combos, scrolling if there are more than four.
- Knob pickup got its own screen. The value row shows the stored value that's actually in effect, in its own units — a BPM, a note name, a word — and a track underneath carries a tall post at the value the pot has to reach and a block at where the pot is now. Drive the block onto the post and the knob takes over. No arithmetic, and it works the same whatever the value is.
- Arp/Hold shows the note pool. Seven columns, one per musical pad, each naming its pitch class with a filled marker if it's in the pool and a hollow one if it isn't. It's also the idle home screen while notes are latched, because in Hold you can't look at the pool by pressing a pad — pressing a pad is what takes notes out of it.
- A live capture indicator. A blinking circle top-right marks the two states you have to leave deliberately: Seq slot editing, and live capture in Arp/Mel Rec. Alongside it, five dots track the recording layers — filled, hollow for muted, and the take being recorded into pulses with the circle.
- Step chance on S34 in Seq, replacing Punch. Punch was a single global knob feeding only the kick's timbre; S34 now scales every step's own authored chance up or down instead. The screen names the zone rather than showing a percentage, because a raw % reads backwards here:
always fireat full left,as authoredat center,sparse 2.4xto the right. Steps authored "always" — a four-on-the-floor kick — are never affected. Punch isn't gone: the kick can be any model, so the parameter still exists and now rides Drive (S30) as double duty on the models where it applies. - Named density stages on S33: strong · main · ghosts · full, so you can see which weight layers are firing instead of reading a percentage. The range is 1–4 now, so knob-minimum no longer reaches a silent state.
- S35 names the pattern, and its position in the genre —
fourfloor 1/6rather than a percentage. - Recording transport cycles. In Arp/Mel Rec, P2 + P10 now goes capturing → looping (punched out) → stopped, rather than only starting and stopping — punching out stops new capture and leaves the loop running.
- Drum hits carry the pattern's accents as MIDI velocity on ch 10. Everything you play still leaves at velocity 100 (the pads aren't pressure-sensitive); sequencer steps are the exception.
- Five new drum patterns, and the pattern editor's round-trip is fixed.
Changed
-
Held-note ceiling is now per engine — 3 on the expensive ones (Six-Op A/B/C, Speech, Particle, String, Modal), 4 elsewhere, replacing v1.7.0's flat 4. Measured on hardware with Six-Op C: idle 16%, then 41 / 58 / 75 / 92% for one to four held voices — so four held already sits at 92-95% against a 90% shed threshold, and gate-held voices are exactly the ones the shedder can never touch. A fifth note briefly makes five awake voices, since the released one's tail keeps rendering; that transient is the crackle, and it's why the fault seemed intermittent.
-
The output limiter has a linear region instead of bending from zero. The old curve was
x/(1+|x|), which has no linear region at all: a single quiet voice was already ~3.5 dB down and shaped before anything came near the ceiling, and four voices under a hall tail put 5–6 into the curve for roughly 15 dB of saturation across the whole waveform. That is what "distorts at polyphony 4" actually was — gain staging, not CPU. Below the knee the signal now passes untouched; above it the same curve takes over, rescaled so value and slope match at the crossing.Two things to expect when you flash this. The instrument is ~5 dB louder at one voice than it was — check your levels before you play. And one-to-four voices now spans +0.8 dB where the old curve gave +4.1 dB, so chords sound cleaner but add less weight; a bounded output with an unscaled voice sum has to compress somewhere. Both are tunable at
kLimitKneeif you build your own. -
Arp octave range moved to P0 + P10/P11, and undo layer took over P1 + P10. The screen names the octave span it lands on rather than just the direction.
-
OLED redraws cost much less: only changed pages go out to the display, and the shared-bus interlock with the MPR121 touch controller is held per page rather than per frame — which is what makes the 40 ms redraw interval safe. Worth knowing if you're chasing frame rate: the ceiling is audio load, not the bus. At 79% CPU a frame took ~52 ms against ~13 ms of actual I2C traffic. Moving the display to its own faster bus was built, rewired and measured, and changed nothing observable — the flag survives as
-DOLED_I2C4(it costs TRS MIDI), but there's no reason to use it. -
libDaisy bumped for the SSD1306 128×32 driver fixes (also filed upstream as electro-smith/libDaisy#634) and a UART error-callback fix.
Fixed
- The genre switch was one position out. SW1's raw reading (0 centre, 1 up, 2 down) was mapped to a panel position before being displayed, but the genre latch indexed the pattern registry with the raw value — so display and audio disagreed by one position: panel-left labelled IDM played Electro, and so on around. Both now go through the same mapping. Boot still lands on Techno.
- The base octave hit its rail silently. P10/P11 in Basic Pitch clamped at ±3 with no LED blink, while root, arp octave range, the layer stack and undo all blink at their limits. Every rail on the panel answers the same way now.
- Frame timing used a microsecond counter that wraps every ~21.5 s, so the measurement build reported nonsense roughly three times a minute.
- Seven documentation bugs found by reading MANUAL.md and README.md against the source rather than against the notes — including a MIDI-out claim the accent work above had made false in the same document, and a voice count that had never been right.
Visualizer
The webapp mirrors all of the above over protocol v11, and then got a pass of its own:
- The emulated 128×32 screen stopped tracking the drawing below a certain size — it clamped its dot grid and then sized itself from the clamp, so at small zooms it floated clear of the panel entirely.
- The expanded display sat on the user LED, hiding the limit and state blinks, which read nowhere else on the drawing.
- Every display setting is now in one settings bar instead of two rows that had each grown their own idiom, and the menu is grouped rather than one flat list.
- Mobile: the drawing sizes itself to the viewport without pinching (
100vhwas the viewport with the phone's URL bar hidden, so the bottom of the device sat under the browser chrome), re-fits when you turn the phone, and there's a Keep screen awake toggle — which is the thing that actually breaks a mobile session.
Installing
TouchPlaited.bin runs from QSPI flash, so the Daisy bootloader must be on the Seed first (one-time per device — see the README). Then put the Seed in bootloader mode (tap RESET, LED pulses) and upload the .bin with the Daisy Web Programmer, or:
dfu-util -a 0 -s 0x90040000:leave -D TouchPlaited.bin
Full controls reference: MANUAL.md