TouchPlaited v1.9.0:
- The kick stops being random. Eleven kicks chosen by ear replace the kick pad's engine-and-range pool — deep 808s, sweeping 909s, a stacked 909-over-808, and a few from engines never meant to be drums.
- Step them with P0 + P10/P11 while the pattern plays; the screen names each one (
K05 909 SWEEP). - Three knobs become Tone / Punch / Body, bounded per preset so they mean the same thing on every kick and can't be turned out of kick territory.
- Step them with P0 + P10/P11 while the pattern plays; the screen names each one (
- The kick is a priority voice now — protected from being cut for the first 150 ms of every hit.
- Two voice-pool faults fixed, one of them latent since the drum sequencer shipped: the pool was cutting live drum tails while finished voices sat idle beside them.
https://github.com/jonwaterschoot/TouchPlaited/releases/tag/v1.9.0
Two things to expect when you flash this. Your saved settings reset once — the kick's preset identity is not something a slot's parameters can carry, so the record layout changed and old records are discarded rather than misread. And randomized kits sound different: the kick now draws a named preset instead of rolling an engine and a parameter range.
The full LLM overview of this round of changes:
The LLM overview:
The open question was "can more kicks come from existing engines, or do they need writing?" The answer was yes to the first — nothing was added to the Plaits DSP, and no new engine was needed. What was missing was reachable parameter space, in four places you only find by reading the DSP rather than the knob names.
Twenty candidates were built, auditioned on hardware twice, and eleven kept. What the listening cut was a family and a technique rather than a scatter of numbers.
The part that wasn't on the plan is three voice-pool faults, two of them older than this work. They only surfaced because the kick finally had a tail worth holding a voice for.
Why the old kick was two mediocre choices
The kick pool was two engines wide, and neither entry was reaching the good part of its own engine:
- Engine 21 renders two different drums — an 808-style analog one on OUT, an "inadvertently 909-ish" synthetic one on AUX — and the Blend fader crossfades them. But the kit randomizer pinned blend at 0.5, so every random kick was the same half-and-half compromise. That was the "very synth sound".
- Engine 10 plays two octaves below its note. The pool's 36–48 range put the FM kick's fundamental at 16–33 Hz with a modulation index of 0.18 — an inaudible fundamental and almost no harmonics. That was the "low energy" one.
- Tails were cut twice, by a short pool range and then again by Tightness. The analog resonator's Q is
1500 · 2^(morph·80/12); the long kicks weren't missing, they were unreachable. harmonicson engine 21 is three controls in a row — attack FM, then self-FM, then overdrive on the analog side; sweep depth then sweep length on the synthetic side. Both the grit and the long pitch drops live above 0.5, where the pool's range stopped.
What the auditions cut, and why it's worth knowing
- All six 2-op FM presets read as regular synth rather than as drums. That's one verdict about engine 10, not six sets of numbers: its only envelope is the LPG in ping mode, so an FM kick has no pitch drop of its own and lands as a bass note with a fast decay. It can be tuned into kick territory; it arrives there sounding like a bass note.
- Two of three layered presets failed — a noise transient over a deep 808 crackled, an FM snap sat too high — while the one that layers engine 21 with itself survived. A layer has to be the same instrument twice, or it reads as a fault or as a second sound. That one is also the cheapest of the three: one engine, both of its drums, no second render path.
- One preset was cut in the second pass for a resource reason, and it turned into the most useful finding of the round — see The LPG tail trap below.
All four "outside bet" engines held up, which was not the expected result.
Added
- The kick bank — eleven fixed, numbered kicks in
synth/kick_presets.h, reachable three ways: P0 + P10/P11 steps it from Seq or from Recording on the kick pad; P0 + S35 at full right is a 12th model position (KICK BANK) past the eleven engines, on the kick pad only; and S32 sweeps the whole bank once a preset is loaded. It rails rather than wraps, with the usual limit blink at each end. - Tone / Punch / Body on S33 / S34 / S37. These are named for what they do to a kick, not for the engine parameter underneath — they land on the same three fields whatever engine each preset is built from, and each sweeps inside a window chosen for that preset. So one gesture means one thing across all eleven, and no knob can be turned out of kick territory (full-travel harmonics on Additive is a chord; full-travel resonance on VA+VCF is a whistle). Nothing was taken away to make room: S37 in Recording was already the OUT↔AUX blend, which on engine 21 is the 808↔909 control — it only gains bounds and a better name.
- Kick voices are stolen and shed last, protected for a fixed 150 ms from each strike. That covers the attack and body, which is the part whose loss reads as a dropped downbeat.
- The screen names what's loaded — on the confirm flash, on S32's own readout, and in the status row while you're recording the kick pad. Held-modifier lists and the P0+P10/P11 callout name it too.
Changed
- The kick's random pool is the bank.
kDrumKickis deleted — its two entries were exactly the two rejected sounds, and for reasons a parameter range can't fix. A randomized kit now gets a kick somebody chose, and one you can name afterwards. The other six slots keep their engine-and-range pools, where the variety is the point. - Drive's push on the kick is per preset. It works by opening the kick's timbre, which on the bass drum engine is also its brightness and click — so turning Drive up used to make every deep kick bright. Deep presets take 0.15–0.35 of it now; bright ones keep most.
- A loaded kick preset is exempt from Tightness. S37 compresses every other morph-decay tail by up to 5×, which is enough to make the deep presets unrecognisable. Per-slot decay (S31 in Recording) is the right way to shorten one kick.
- Drum one-shots sleep at −60 dBFS instead of −80. A pitched voice is held by a finger and its release tail is worth following to the noise floor; a drum's last 20 dB is inaudible under a kit, while the voice it occupies is not.
- The settings record layout changed (see the note at the top).
Fixed
- The voice pool never reused sleeping voices — latent since the background drum sequencer shipped. Drum voices never get a NoteOff, so their slot id stays set forever and the free-slot scan could never see a finished one; the pool went straight to stealing the oldest sounding voice while a silent one sat unused beside it. With six voices shared by seven drums that happens constantly. This was the single biggest cause of drum tails being cut short, and it had nothing to do with the kick.
- The LPG tail trap. Presets on non-drum engines are the only ones whose tail is Plaits' low-pass gate rather than the engine's own envelope, and the LPG in ping mode ignores the one-shot gate entirely and falls violently slowly. Measured off the envelope code: decay 0.45 holds a voice for 2.5 s, 0.60 for 4.5 s, 0.72 for 7.4 s. One preset was authored at 0.72, so every kick masked the kit with four seconds of 55 Hz sine and permanently cost one of six voices. It's cut; the other two LPG presets are re-authored down to 0.34 / 0.30; and the −60 dBFS sleep threshold above is the net under it.
- Kick priority, first attempt, reserved rather than prioritised. Keying the protection on "still making sound" held one or two of six voices for most of a bar with the new long kicks, and the other six drums thrashed what was left. It's a 150 ms window from the strike now. (The tell was that a freshly randomized kit sounded right for about a bar first — for that bar the oldest voices still belonged to the previous kit and had already finished, so stealing them was inaudible.)
- S37's pickup was armed against the wrong value on the P0 release edge while recording a kick preset — the raw blend rather than its position in the Body window. Several presets sit at blend 0.0, so that armed a rail, which catches on any 3% nudge; Body jumped the moment S37 was touched after using P0 for anything, the preset stepper included.
- Engine 0's harmonics and timbre were swapped in the engine reference table. Harmonics is resonance and timbre is the cutoff, not the other way round. The visualizer always had it right, so the table was the only place the error lived.
- Four stale claims in MANUAL.md, found by reading it against the source rather than against the notes — including a kick pool that no longer exists, and a voice-cost figure that was true of two presets that had been cut.
Visualizer
The webapp mirrors all of it over protocol v12: a new state byte carries which preset is loaded, so the app names it on the emulated screen, on the P0+P10/P11 and S32 callouts, in the Recording status row, and logs every change by name — the on-device flash is gone in 220 ms, and a curation pass needs to be readable afterwards. Older firmware simply reports no preset; the decoder guards on frame length as it always has.
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 — the kick bank has its own section.