Newsequencertriggermidi-hostdrums

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

Workshop Computer panelGlobal Fill MacroPattern Map XPattern Map YMap ModulationFill ModulationExternal ClockPattern ResetTrigger Lane 3Aux OutputTrigger Lane 1Trigger Lane 2

Controls

Main knob

Global Fill Macro
Scales all lanes together using per-lane scale/offset from config

X knob

Pattern Map X
Horizontal position on the Grids pattern map

Y knob

Pattern Map Y
Vertical position on the Grids pattern map

Switch

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

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

CV 1

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

CV 2

Fill Modulation
Global fill offset in Z middle; all three lane density offsets in Z up (after knob takeover)

Pulse 1

External Clock
When patched, internal clock is bypassed and swing is ignored; follows external pulse edges

Pulse 2

Pattern Reset
Rising edge resets pattern phase to the start of the bar

Outputs

CV 1

Trigger Lane 3
Digital pulse-style trigger for lane 3

CV 2

Aux Output
Configurable accent, clock, or lane 3 mirror output

Pulse 1

Trigger Lane 1
Grids-style trigger output for drum/voice lane 1

Pulse 2

Trigger Lane 2
Grids-style trigger output for drum/voice lane 2

LEDs

LED 1

Beat Tick
Flashes on each beat tick (1 PPQ)

LED 2

Fill Macro Level
Brightness reflects global fill macro position

LED 3

Lane 1 Activity
Lights on lane 1 trigger events

LED 4

Map X Level
Brightness reflects pattern map X position

LED 5

Lane 2 Activity
Lights on lane 2 trigger events

LED 6

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 Z in middle)
  • Fill macro control (switch Z in middle)
  • Per-lane density with Main / X / Y when switch Z is 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)

  1. Flash UF2/82_Computer_Grids.uf2 (produced by a successful Build below, or supplied with the release).
  2. With no pulse clock patched to PulseIn1, internal clock runs automatically.
  3. With Z in the middle (normal): turn X / Y for map, Main for fill macro. With Z up: Main = lane 1 density, X = lane 2, Y = lane 3 (map stays where you left it in middle).
  4. Patch outputs:
    • PulseOut1 and PulseOut2 for trigger lanes 1 and 2
    • CVOut1 for trigger lane 3 (digital pulse-style output)
    • CVOut2 for 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 (CVOut1 pulse)
  • Pattern map (X/Y on the Grids) uses the held knob map from the last middle position (CVIn1 applies 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 / Y adjust 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:

  • Main adjusts chaos/randomness (used by the pattern engine)
  • X adjusts internal BPM (bpm10 in config; used for the internal clock)
  • Y adjusts 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 1
  • PulseOut2: trigger lane 2
  • CVOut1: 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 command 0x02 and a 7-bit-packed config payload (see sysex_spec.json).
  • Apply To Device — sends current UI values via SysEx 0x03 to update running behavior (applied on the audio core on the next block).
  • Save To Card — SysEx 0x04 marks 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:

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 (ComputerCard audio on core 1, housekeeping + USB on core 0)
  • GridsCard.cpp / GridsCard.h - card behavior, UI, clocking, I/O, SysEx handling
  • GridsEngine.cpp / GridsEngine.h - pattern evaluation logic
  • GridsResources.cpp / GridsResources.h - Grids map node resources used for interpolation
  • ConfigStore.cpp / ConfigStore.h - persistent flash config
  • sysex_spec.json — web/editor integration spec for config payloads (request/response command bytes included)
  • web/ — browser GUI for reading/writing config over Web MIDI SysEx
  • context.md — maintainer notes (Web MIDI over localhost, USB dual-core pitfalls, product string Workshop Grids for 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).

Verify your download

Confirm the file you downloaded really is that new firmware.

macOS / Linux (Terminal)

shasum -a 256 firmware.uf2

Linux also has sha256sum firmware.uf2.

Windows (PowerShell)

Get-FileHash firmware.uf2 -Algorithm SHA256

Compare the result to the SHA256 on the website — it should match exactly.

Back to all programs Back to top