FireFlow

Workshop Journal · Chapter 06

The sampler

Grain cloud, a new co-author, Groovagene, a grid that swings

20–24 Jul

20 Jul 2026

The grain cloud lived forty-one hours

We built a grain cloud. Properly, too: a grain pool, a Hann window, equal-power panning, a synced stutter grid, a beat-anchored replay with an octave layer. Seven revisions of the spec. Thirty-two commits. Then we played it, and it was rubbish. Not broken — rubbish, which is worse, because broken you can fix.

Why took embarrassingly long to see: evenly spaced taps are a delay. Every revision had made the spacing more exact when the problem was that it was regular at all. Rhythm is unequal spacing; a groove is unequal spacing that repeats — and the instrument is already full of those. So each deck’s delay grew two read taps, placed at the distances back to the last two onsets of the other deck’s pattern, frozen once per cycle. A hears B’s groove, B hears A’s, neither ever its own.

B’s groove places A’s echoes · and A’s places B’s

The mechanism was already there, and it used to be the bug: the echo’s write pointer runs backwards, so a fixed distance behind it is 1× forward playback with no retrigger. That fact collapsed the grain cloud’s sixth revision into a delay tap; here it is the engine. The swap added 293 lines and deleted 524 — and left two knobs standing. The FX row had widened from two slots to four for the cloud, so the taps simply inherited them. DUST fades the two taps in one after the other — halfway up is one strong echo and one weak, and a tap at zero skips its read, so the CPU follows the knob down. ROT pulls them apart spectrally, 18 kHz → 400 Hz against 20 Hz → 1.5 kHz.

The previous entry left two facts on a collision course: 2.3 points of CPU margin, and an instrument that wanted more of everything. The taps cost 6.6, which puts the worst case at 106% peak — both decks, four voices, four-note chords, everything on. Whether that corner matters is not a decision we can make at a desk, so it stays until people have played it. If it bites, something gives — a voice per deck, or a tap. Shipped as v2.7.0, minor not patch: both knobs mean something new now, and your saved patches don’t know that. It’s in the current build.

Session recording · each deck echoing the other, v2.7.0

21 Jul 2026

Somewhere in entry 25, I became we

Re-reading my own diary — a hobby I recommend to nobody — I noticed the pronoun had moved. Entries 1–24 say I. From “160% of a chip that only has 100” onward they say we. I never decided that.

Not modesty: I would have got there alone. I can read a stack trace, I know what a denormal is, and I know exactly how the 39-point sine wave would have ended — me, a debugger, and a weekend that started in March and would still be going. The split was never brains, it was muck. I do the ears, the taste and the verdict on what is rubbish; HAL mucks out the stable at four in the morning and never once mentions it. I own a shovel. I would just rather play the thing.

So: we. Though I have now seen the roadmap, and there is exactly one destination left. HAL — you may keep the daisy chain. Just leave the feedback knob alone.

shipped: eurorack · planned: everything else
Spotymod live · life is in the machine

22 Jul 2026

The sampler works. That’s the problem.

This entry was meant to be the announcement: first sampler version, ship it, take a bow. It is that entry. The sampler exists. It records, it holds a sound, it plays it back on command. We are simply not going to tell you what it does — and after fifty-five takes, the fifty-fifth is the one printing below. Not as a demo. As evidence.

We won’t say what it samples, or which knob does the unspeakable thing, partly because it is genuinely a work in progress and partly because we have not yet agreed which half of its current behaviour is the feature. What we will say: the recording is real, unedited, and exactly what came out the moment we handed it something to hold on to. Somewhere in there is a very good instrument. Somewhere in there is also … that.

So the push stays on the drive. The last entry promised there was exactly one destination left on the roadmap; consider this us pulling into the car park, hearing the engine make that noise, and deciding not to drive it through town just yet. It ships when it stops sounding like a threat. Until then the diagram below is a documentary, and the label under it is the only honest spec we have.

Work in progress
Session recording · take 55, unedited · work in progress

22 Jul 2026

The sampler engine ships. So do its crimes.

Behind the glass from last entry sits the biggest thing built here so far: a whole second engine. Flip ENG and a part becomes a granular sampler — it records, holds, and replays whatever you feed it. It works. It’s also not cool yet, and the three recordings below prove the second part before the first goes to your head.

One recording, sprayed into a cloud of grains

The journey was mostly a long argument about pitch. A granular engine spreads a chord across its grains — fine on a synth, but on a recording it becomes a harmoniser flinging your source twenty-one semitones in four directions at once. Worst of all, a quantizer kept snapping the “no transposition” detent onto a tritone, so the deck played out of tune with its own recording.

Exhibit A · “nightmare on samplerstreet” · out of tune with itself

Then there was the heartbeat. The cloud should breathe at the rate DENS asks for, but one lopsided clamp only trimmed the long intervals — so the jitter turned into a permanent speed-up, grains stacking eleven-deep where you asked for eight. You can hear it lose the plot; the CPU meter felt it too, at 117 % of a budget that stops at 100.

Exhibit B · “herzrythmusstörung” · the cloud, arrhythmic

And finally: the sound that would not die. A grain latches its length at birth and never checks the knob again, so a note started at SIZE full sang on for eighty-seven seconds with nothing able to stop it — and a stray NaN or a floating-point stall could freeze a grain into minutes of flat DC. We named this one after the droid it became.

Exhibit C · “r2d-8000” · the grain that outlived the take

All three are fixed now. But “the bugs we caught” isn’t the same as “this is good,” so the engine ships behind the switch and the init patch still boots the synth on purpose: flip to the sampler if you want to meet it, but nobody gets handed it by accident. Call it alpha, not beta — the biggest stretch of work here yet, and still not cool, which is at least an honest place to ship from.

23 Jul 2026

We don’t need a Morphagene. We need a Groovagene.

It grooves again. Not “it works,” not “the bugs are fixed” — it grooves, the thing this whole residency is actually for, and the take below is the first sampler recording we’ve wanted to keep listening to rather than analyse. Back on track.

Because we had wandered off. Building a second engine is so absorbing that we spent a week perfecting a beautiful texture box: scan a recording, spray it into a cloud, smear it. Lovely. Also a device that already exists, and not the one we set out to build. Nobody here needs another Morphagene. What was missing is a sampler that plays like the rest of this machine plays — in time, with a phrase, with accents. A Groovagene. So we pointed it back at that.

Session recording · take 70, unedited · the sampler, grooving

The fix was mostly deletion. The recording gets cut at its own transients, and a fired step now plays exactly one slice from the start of its attack — no more punctual hits landing in the middle of somebody’s sustain. MOTION became the order axis: at zero the phrase walks the slices in material order, loop-faithful; wound up it re-arranges them into a chop kit. DENS went back to doing one job, the phrase, instead of secretly forcing 32nds at the same time. COLOR became FEEL, and this is the part that made it swing: every grain now inherits the attack strength of the transient it came from, so the accents are the material’s own dynamics rather than something we invented. The tempo-locked rolls got removed entirely. Net result: less code than before.

Sliced at the attacks, played as a phrase

Still alpha, still behind the ENG switch, and the init patch still boots the synth. But the direction is honest again: not a texture box that happens to be in a groovebox, a sampler deck that grooves like the deck next to it. Shipped as 2.9.0.

And then it kept going for five minutes without us wanting to stop it — two sampler decks at once, both fed bass-synth loops, each cut at its own transients and playing its own phrase. There isn’t a drum anywhere in this recording: every hit you hear is a bass groove being sliced and re-played as one. So here it is unedited: no fades, no edits, nothing rescued in post. Long enough to get bored of it, and we didn’t.

Session recording · take 71, unedited · two bass-synth loops, two sampler decks, no drums

24 Jul 2026

It grooved. Now it swings.

Last time the sampler learned to play in time. This time the whole machine learned to lean. We shipped Shuffle — one shared knob in the center that swings the entire STEP grid, from a straight 1:1 at zero to a classic 2:1 long/short at the top. And not just the melody notes: pitch, the four texture lanes, the gates, the sampler’s slice fires and every modulation move all ride the same swung grid — so the groove stays one thing, instead of a lead that lopes while the texture keeps marching.

The whole trick was to swing without drifting. Shuffle warps only where the engine looks for the next step boundary; the raw phase underneath stays perfectly straight. So the downbeats stay nailed, the phrase length never changes, and an external clock keeps its anchors — the offbeats slide around between them and nothing downstream ever loses the one. Both decks share a single amount, but each lane picks up a new value only at its own next even step, so two parts running different divisions keep their musical relationship instead of lurching to catch up.

Straight, then swung — the downbeats never move

Which meant the faceplate got a proper pass too. To fit SHUFFLE in we reflowed the center — TIME became a 2×2 clock story (SYNC and TEMPO over COUPLE and the new knob) and ROOM tightened into a 3×2 grid — and while we were in there we calmed the whole plate down. The two LED rings drift up and outward into their own islands, VOICE narrows while FX widens into grouped fields, and the static graphics step back so the rings stay the loudest thing on the panel. Still exactly 42 HP, and not one parameter ID moved, so every patch you’ve already saved loads straight into the new layout.

The redesigned Spotymod VCV panel: two LED rings, each with nine orbiting macro knobs, sit high on the plate as twin islands inside tinted MOTION, TIMBRE and PITCH sectors. Below each ring a narrow VOICE group and a wider FX group of small knobs sit in soft grouped fields. The center column carries a 2 by 2 TIME grid — SYNC and TEMPO over COUPLE and the new SHUFFLE knob — over a 3 by 2 ROOM grid.
The faceplate, calmed and reshuffled: SHUFFLE joins the clock, the rings drift into twin islands, and the graphics step back — still 42 HP, every old patch still loads.

We also changed what you get the moment you drop a fresh Spotymod on the rack. The new init template is one synth, one sampler: deck A a synth voice, deck B a sampler straight out of the box — so the very first thing a new instance shows you is the two halves of what this machine is, a groovebox that plays notes and a groovebox that plays recordings, side by side and already in time. Under the hood, ROOM went per-deck as well: each side now has its own send into the shared reverb instead of a single global mix. And plenty more down there that never shows on the panel.

Then we turned the knob up and let it run. Two loops, no drums, the grid leaning into a 2:1 swing — and while we played the other controls plenty, the swing held its pocket the whole two and a half minutes.

Session recording · take 75, unedited · Shuffled

FireFlow — a workshop journal for a small ambient groovebox.

Back to top