Skip to content

TouchPlaited v1.8.0 — the screen answers back

Choose a tag to compare

@jonwaterschoot jonwaterschoot released this 07 Aug 02:03
· 19 commits to main since this release

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
TouchPlaited_dynamicvisualizer_v1-8
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 fire at full left, as authored at center, sparse 2.4x to 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/6 rather 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 kLimitKnee if 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 (100vh was 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