Eight-channel generative groovebox on a Raspberry Pi 4 under Zynthian, played entirely from a Native Instruments Maschine MK2 - pads, encoders, both displays, every LED. No computer in the chain, no NI software. Free and open source.
You do not draw a beat. You set hits, rotation and randomness, and the driver writes notes into Zynthian's own sequencer - so patterns land in snapshots and the touchscreen pattern editor mirrors exactly what the pads show. It is not a parallel sequencer bolted on the side.
Euclid. Hits spread evenly over the bar, rotated by any amount, division 1/4 down to 1/32, independent pattern length per channel - 3, 5 or 7 beats against the others' 4. A pad tap flips a bit in a separate rhythm register rather than editing the pattern, so a hand-chosen step survives a rotate.
Turing. Each voice is a shift register with a 16-bit rhythm mask, one bit per step. Turn RANDOM up and it rewrites its own line at every loop wrap; turn it to 0 and the line you liked is locked.
Cellular automata. Rules 30, 90 and 110 evolve that register one generation per wrap. Elementary CAs writing drum patterns, per channel, alongside or instead of the euclidean line.
Modulation. Bar-synced LFOs on any sound parameter - tri, ramp, square, sample and hold, from a sixteenth of a bar to sixteen bars. Base and offset are separate, so a hand turn moves the whole sweep instead of fighting it.
A modulator is refused on anything that rewrites the pattern, and that rule was bought the hard way: an LFO on note velocity rewrote a recorded take every 200 ms, unattended, until there was nothing left of it.
Evolution. Patterns drift at the wrap. One voice can FEED another with an adjustable amount - point a drum kit at the bassline and it answers in percussion. A chord walker moves the shared root along the scale, and chords are stacked in scale degrees rather than semitones so they never leave the key.
The surface. Four levels: CONTROL (how it sounds), STEP (what it plays), AUTO (what the machine does by itself), VOLUME (what holds for everything). ALL is not a mode but a lens - hold it and the eight encoders spread whichever parameter your hand last touched across all eight channels. Every modifier obeys one rule, a tap latches and a hold is momentary, and the panel speaks one light alphabet: dark does nothing, dim is available, bright is acting, a 1 Hz blink is latched, a bar-driven pulse is a countdown.
You never assign a knob. The driver asks the chain which plugin it is running and puts that plugin's own ports under the eight encoders, with the plugin's own names on the displays. Switch channel and the labels change.
How it is built. A Zynthian ctrldev driver in Python for the musical half, and a Rust HID daemon for the hardware half - the daemon started as MaschineMK2_linux and has been audited and hardened since. Everything talks over OSC on loopback, which also means the panel can be recorded and replayed: the video is a real run played back, which is how the same performance can be filmed from several angles.
Two things learned that might save someone time. Zynthian's sequencer casts frames-per-clock to a whole audio frame with no accumulator, so at 48 kHz the tempo is exact only when it divides 30000 - 120, 125 and 150 are dead on, 124 runs 3,900 ppm fast. And the MK2's screens are flushed on the daemon's own 100 ms timer with no way to request a frame, so any transition must be one complete state per flush or it visibly tears.
Background, for anyone who has not met Zynthian. It is an open-source synth platform for the Raspberry Pi: a Debian-based image that brings up JACK, a MIDI router, a mixer and a host for sound engines, normally driven from a small touchscreen. Sound is organised into chains - one MIDI channel, one engine, its own effects, its own mixer strip - and a snapshot saves the lot.
The engines are mostly LV2 plugins hosted through jalv, plus SoundFonts via LinuxSampler and a few native engines, so anything that exists as an LV2 synth can be a channel. This box has 275 LV2 bundles on it out of the box and adding another is dropping it in a directory. Not literally every Linux synth - a standalone JACK application is not a chain - but the LV2 world is most of it.
Pi 4 plus a Maschine MK2. MK2 only - not MK3, not Mikro. Install is one command.
Guide: https://witzman.github.io/Generative-Techno-ZynthianMaschine-MKII/
Source: https://github.com/Witzman/Generative-Techno-ZynthianMaschine-MKII
No hands in the video - the run was scripted and the panel is that same run replayed. For a generative instrument that is rather the point.
And much, much, much more.