Place step circles by proportional position in the bar (beat = column start) instead of centring in per-lane slots, so same-meter lanes' beats land at the same x (e.g. the 8-step hat's beats sit directly under the 4-step kick/snare). Cap circle radius at 6 (was up to ~18). Verified by printing per-lane beat x-positions + rendering the grid. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| __pycache__ | ||
| code.py | ||
| font_l.bin | ||
| font_m.bin | ||
| font_s.bin | ||
| programs.json | ||
| README.md | ||
PM_K‑1 "Kit" — CircuitPython edition (USB drive + editor)
The CircuitPython firmware for the 52Pi EP‑0172 Pico kit. Unlike the MicroPython version
(../pico/main.py), this makes the Pico mount as a USB drive (CIRCUITPY) that carries the
firmware and your tracks — so you can edit on the web and reprogram it without Thonny. It runs the
same program‑string language as https://metronome.varasys.io.
Status: experimental, phase 1. This drives the screen/touch/joystick/buzzer and reads your grooves from
programs.json. The editor's one‑click "Save to device" and USB‑MIDI audio‑to‑computer are landing in later phases. The simpler MicroPython firmware (../pico/main.py) remains the rock‑solid fallback — and the Pico can't be bricked (BOOTSEL → drag a MicroPython.uf2back).
Install
- Flash CircuitPython: hold BOOTSEL, plug in, and drop the CircuitPython
.uf2for your board onto theRPI‑RP2drive (https://circuitpython.org/board/raspberry_pi_pico/ — or the Pico 2 / W build). It reboots and aCIRCUITPYdrive appears. - Copy everything from the bundle onto
CIRCUITPY(drag‑and‑drop — it's a normal drive now):code.py(this firmware — runs on boot)programs.json(your grooves)font_s.bin,font_m.bin,font_l.bin(the anti‑aliased fonts — kept as files to save RAM)
- It starts immediately. Editing
programs.json(or re‑saving it from the editor) makes CircuitPython auto‑reload with the new tracks.
Controls (same as the MicroPython build)
- Touch: on‑screen
◀◀ / ▶ / ▶▶(prev · play/stop · next) and− / TAP / +. - Joystick: up/down = tempo, left/right = previous/next groove.
- Button A (GP15) play/stop · Button B (GP14) tap tempo.
- RGB LED flashes each beat; buzzer clicks (accent/normal/ghost).
programs.json
{ "title": "PolyMeter",
"programs": [ { "name": "Four on the floor", "prog": "t120;kick:4;snare:4=.x.x;hatClosed:4/2" } ] }
Each prog is a program string from the web editor. Add/replace entries and save — the device reloads.
Calibration (flip flags at the top of code.py)
- Red/blue swapped: flip
MADCTLbetween0x48(default) and0x40. - Colours look negative: toggle
INVERT_COLORS. - Taps land wrong: set
TOUCH_DEBUG = True, watch the serial output, then setTOUCH_SWAP_XY/TOUCH_INVERT_X/TOUCH_INVERT_Y. - Joystick reversed: toggle
JOY_INVERT_X/JOY_INVERT_Y. - LED too bright / too dim: change
LED_BRIGHTNESS(0..1, default 0.15). - Screen tearing: the SPI panel has no tearing-effect sync;
SPI_BAUD(default 62.5 MHz) is pushed fast to minimise it — lower it only if the display is unstable. - Screen blank / garbled: the panel lot may differ; drop
SPI_BAUD, and if it's a 240×320 ILI9341 instead of the 320×480 ST7796, the init/size need changing (this targets the 320×480 you have). - RGB LED is driven by the core
neopixel_writemodule — no library to install. If it stays dark, your CircuitPython build is unusually missing that module (everything else still works).
If code.py ever errors, CircuitPython prints the traceback on the screen and over USB serial —
copy that to me and I'll fix it.
The fonts are the same baked anti‑aliased blobs as the MicroPython build (see ../pico/gen_font.py).