Computer Grids
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).