82 Computer Grids
Grids-inspired trigger sequencer for the Workshop Computer. Control pattern map and fill with knobs, or per-lane density when switch Z is up. Internal clock with swing, or follow external clock on PulseIn1. Configure and save settings via the Web MIDI SysEx editor (Chrome recommended).
Panel
Controls
Global Fill Macro
Scales all lanes together using per-lane scale/offset from config
Pattern Map X
Horizontal position on the Grids pattern map
Pattern Map Y
Vertical position on the Grids pattern map
Per-Lane Density: Main / X / Y set density for lanes 1–3; pattern map is held from the last middle position
Pattern Map: X / Y set pattern map position; Main is the global fill macro
Alt Layer Toggle: Hold down to toggle the alt layer (knob pickup/catch). While alt is active and Z is middle, Main / X / Y edit chaos, BPM, and swing
Tap Tempo: Briefly press and release Down to set internal clock tempo from the tap interval (ignored when an external clock is patched)
Inputs & Outputs
Inputs
Outputs
Inputs
Map Modulation
Adds to pattern map X, Y, or XY blend (per config). Held off after Z middle↔up flip until X or Y is moved past takeover deadband
Fill Modulation
Global fill offset in Z middle; all three lane density offsets in Z up (after knob takeover)
External Clock
When patched, internal clock is bypassed and swing is ignored; follows external pulse edges
Pattern Reset
Rising edge resets pattern phase to the start of the bar
Outputs
Trigger Lane 3
Digital pulse-style trigger for lane 3
Aux Output
Configurable accent, clock, or lane 3 mirror output
Trigger Lane 1
Grids-style trigger output for drum/voice lane 1
Trigger Lane 2
Grids-style trigger output for drum/voice lane 2
LEDs
Beat Tick
Flashes on each beat tick (1 PPQ)
Fill Macro Level
Brightness reflects global fill macro position
Lane 1 Activity
Lights on lane 1 trigger events
Map X Level
Brightness reflects pattern map X position
Lane 2 Activity
Lights on lane 2 trigger events
Lane 3 / Aux Activity
Lane 3 or aux output activity; also indicates when alt layer is active
README
82_Computer_Grids
Grids-inspired trigger sequencer firmware for the Music Thing Workshop Computer.
Features:
- X/Y map control (switch
Zin middle) - Fill macro control (switch
Zin middle) - Per-lane density with Main / X / Y when switch
Zis up (pattern map is held from the last middle position) - Internal clock with optional external clock on
PulseIn1(swing applies to the internal clock only) - Reset on
PulseIn2 - Alt layer on long-press (
Z) with knob pickup/catch behavior - USB MIDI SysEx configuration transport with persistent flash config
Quick Start (User)
- Flash
UF2/82_Computer_Grids.uf2(produced by a successful Build below, or supplied with the release). - With no pulse clock patched to
PulseIn1, internal clock runs automatically. - With
Zin the middle (normal): turnX/Yfor map,Mainfor fill macro. WithZup:Main= lane 1 density,X= lane 2,Y= lane 3 (map stays where you left it in middle). - Patch outputs:
PulseOut1andPulseOut2for trigger lanes 1 and 2CVOut1for trigger lane 3 (digital pulse-style output)CVOut2for aux output (accent/clock/lane3 mirror, configurable)
Controls
Switch Z — middle (normal)
- Knob
X: pattern map X position - Knob
Y: pattern map Y position - Knob
Main: global fill macro (all lanes, with per-lane scale/offset from config) - Middle ↔ up: when you flip between middle and up, the current sound is kept until you move that knob more than a small deadband (so the same physical position does not jump to a new meaning).
Switch Z — up (per-lane density)
- Knob
Main: density for trigger lane 1 (PulseOut1) - Knob
X: density for lane 2 (PulseOut2) - Knob
Y: density for lane 3 (CVOut1pulse) - Pattern map (X/Y on the Grids) uses the held knob map from the last middle position (
CVIn1applies once you have “taken over” X or Y after switching — see Inputs below)
Switch Z — down (momentary)
- Short press (press then release): tap tempo (internal clock only)
- Long press: toggle alt layer (knob pickup/catch). With middle + alt:
Main/X/Yadjust chaos, BPM, and swing. With up, knobs stay on per-lane density; randomness (chaos) is still whatever you last set in middle+alt.
Alt Layer
When alt layer is active:
Mainadjusts chaos/randomness (used by the pattern engine)Xadjusts internal BPM (bpm10in config; used for the internal clock)Yadjusts swing (50% straight … 75% shuffle)
Changes are persisted with deferred flash save.
Inputs and Outputs
Inputs
PulseIn1: external clock input- If connected, firmware follows external clock edges (straight timing; swing is ignored).
- If not connected, internal clock runs (BPM + swing from config / alt layer / web editor).
PulseIn2: reset input- Rising edge resets pattern phase.
CVIn1: map modulation input- Assignable target: X, Y, or blended XY (via config).
- While map knobs are frozen after a middle↔up change, CV1 is held off until you move X or Y past the takeover deadband (avoids double-applying the same offset).
CVIn2: fill modulation input- Middle: adds to the global fill macro after Main has taken over following a middle↔up flip (initially on at power-up).
- Up: adds to all three lane densities after any of Main / X / Y has taken over following a flip.
Outputs
PulseOut1: trigger lane 1PulseOut2: trigger lane 2CVOut1: trigger lane 3 (digital pulse behavior)CVOut2: aux output mode (accent / clock / lane3 mirror)
LED Behavior
- LED 0: beat tick blink
- LED 1: fill macro brightness (middle) or lane 1 density (up)
- LED 2: lane 1 trigger activity
- LED 3: map X brightness (middle) or lane 2 density (up)
- LED 4: lane 2 trigger activity
- LED 5: lane 3/aux activity or alt-layer indicator (middle); lane 3 density brightness (up)
Web GUI
A basic web editor is included in:
web/index.html
Open it in a Web MIDI-enabled browser, click Connect Web MIDI, select the card MIDI input/output, then use:
- Read From Device — sends SysEx request
0x01; the card replies with command0x02and a 7-bit-packed config payload (seesysex_spec.json). - Apply To Device — sends current UI values via SysEx
0x03to update running behavior (applied on the audio core on the next block). - Save To Card — SysEx
0x04marks config for flash write after about 1.5 s of no further changes (same deferred save as knob/SysEx edits). - Load Defaults — fills the editor with built-in defaults (does not talk to the card until you Apply/Save).
- Start Monitor — periodically sends read requests and refreshes the UI.
The web UI includes paired sliders + numeric fields for main continuous parameters. The Backup section can export/import JSON snapshots of the editor state.
Connection notes:
- Use a USB-C data cable.
- Close Serial Monitor / other apps that may already own the device/MIDI port.
- Use a Chromium-family browser with Web MIDI SysEx enabled (iOS/Safari browsers are generally unsupported).
Attribution and licensing
This firmware includes adaptations derived from Mutable Instruments Grids:
- Pattern-map structure and interpolation approach inspired by Grids pattern generator
- Adapted node resource data used by the Grids map
Original project:
- Mutable Instruments / pichenettes eurorack Grids source:
- Module documentation:
The upstream Mutable Grids source is released under GPLv3 (or later). This folder is licensed accordingly; see COPYING for the folder-scoped licensing notice and caveat.
Credit
- Original Grids design and firmware: Emilie Gillet / Mutable Instruments
- Workshop Computer adaptation in this folder: community adaptation for Music Thing Workshop Computer by @philmillman
- Lots of inspiration and code borrowed from other cards in this repo, especially
20_reverb(USB bring-up and dual-core layout).
Releases
- Release 0.1.0 — April 30, 2026
- Initial release
- Includes:
- Grids-inspired trigger sequencer
- Web MIDI SysEx configuration
- Basic browser GUI for reading/writing config
- Persistent flash config
Build
I highly recommend using the computercard-dev-env.
From this folder:
make
That runs the Pico SDK CMake build and copies UF2s into UF2/. Without that helper, configure and build with CMake the same way as other Workshop_Computer/releases/* CMake cards.
UF2 output is copied to:
UF2/82_Computer_Grids.uf2
Flash
Use your normal Workshop Computer flashing workflow (debug probe/OpenOCD or UF2 drag-and-drop workflow as used in this repo).
Serve the web editor
Serve web/ over http://localhost (or HTTPS), not file://, so the browser exposes Web MIDI — for example from this folder: python3 -m http.server 8080 --directory web.
Files of interest
main.cpp- dual-core startup (ComputerCardaudio on core 1, housekeeping + USB on core 0)GridsCard.cpp/GridsCard.h- card behavior, UI, clocking, I/O, SysEx handlingGridsEngine.cpp/GridsEngine.h- pattern evaluation logicGridsResources.cpp/GridsResources.h- Grids map node resources used for interpolationConfigStore.cpp/ConfigStore.h- persistent flash configsysex_spec.json— web/editor integration spec for config payloads (request/response command bytes included)web/— browser GUI for reading/writing config over Web MIDI SysExcontext.md— maintainer notes (Web MIDI over localhost, USB dual-core pitfalls, product stringWorkshop Gridsfor MIDI port filtering)
The GUI implements the same 7-bit block packing scheme documented in sysex_spec.json.
USB MIDI bring-up matches 20_reverb: 200 MHz boot clock, tusb_config.h with device + host on rhport0, tinyusb_host linked, 100 ms delay, then tud_init(0) or tuh_init(0) from USB_HOST_STATUS / board revision (same logic as reverb’s usb_worker), then board_init(). tud_task() / tuh_task() run on core 0; 48 kHz audio runs on core 1 (like reverb’s audio_worker).