Three fixes the user reported on 0.0.2:
1. Layout still overlapped. 0.0.2 ported the Kit's pixel positions verbatim,
but those were designed for 480 px of height; on 320 the same Y values
stack on top of each other. This pass actually scales everything down:
- BPM big number was FONT_L (~30 px tall) -> FONT_M (~16 px tall).
- Time + bar meters were FONT_M -> FONT_S, tightly stacked at y=32/44
instead of y=50/78.
- Setlist tab + CONT y=66 (was 118); track title y=82 (was 134).
- GRID_TOP=104 (was 138). Frees ~34 px more vertical room for the
pad grid.
- Modal panels: PX/PW shrunk to use less of the 240-wide canvas, RH
22 (was 26), inter-line spacing 13-14 (was 14-16). Title strings
trimmed ("Practice log" instead of "Practice log (this track)").
2. No sound from the piezo. Two likely causes:
- SPEAKER_AUTO_MUTE was True. Live sync sends a FULL heartbeat over
USB-MIDI every 5s; the firmware sees those bytes and treats it as
"host listening" -> mutes the piezo. Default now False on Explorer
(toggle to Auto in Settings if you ARE using "Device audio" in the
editor).
- AMP_EN polarity. Added AMP_EN_ACTIVE_HIGH config flag (default True)
and a _amp(on) helper. If your specific board's amp is active-low,
flip to False at the top of CONFIG.
3. Firmware push stalled at chunk 1. Editor's _isDevicePort() only matched
"pico" / "circuitpython" / "usb_midi"; the Pimoroni Explorer reports
under a different name, so the editor broadcast to all MIDI outputs
and the ACK got lost in routing. Filter now also matches "pimoroni",
"explorer", "rp2350", and "varasys" (future-proofing).
The .mpy build dropped from 29.8 KB to 29.3 KB (smaller font footprint plus
fewer modal hint strings).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The 320x240 landscape layout was too cramped vertically; multiple elements
sat on the same Y rows, especially the BPM big-number area and the bar/time
meters, plus the run dot collided with the MIDI/USB icons.
Switching to portrait at 240x320 (display.rotation = 270; user holds the
device with A/B/C buttons along the top) gives the same vertical real
estate the PM_K-1 Kit's portrait UI uses, just narrower. Layout now mirrors
the Kit:
- y 0..28: header (logo + version + MIDI/USB icons + run dot)
- y 44: BPM big (right)
- y 50: elapsed time (left, FONT_M)
- y 78: bar counter (left, FONT_M)
- y 100: ramp / gap-trainer indicators
- y 118: setlist tab + CONT (single row)
- y 134: track title (FONT_M)
- y 138+: pad grid (up to 6 lanes, taller rowh ceiling now 30px)
Plus:
- DISPLAY_ROTATION constant near the top of CONFIG so the user can flip it
to 90 / 180 if their orientation differs.
- Pad grid uses px0=48 (was 60) since the lane label column has less
horizontal room at 240 width; max 6-char labels.
- Removed the inline modal hints (e.g. "X/Z move, A select, C close") that
would have collided with the modal titles at 240 width. The Help screen
documents the modal nav pattern, which is consistent across modals.
- HELP_PAGES page 1 leads with "Hold portrait with A/B/C on top."
- README documents the rotation flag.
Bumps Explorer to 0.0.2. .mpy can be pushed via the editor's Update firmware
flow (device id reply = X;0.0.1 -> editor fetches the right .mpy).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds pico-explorer/ as a parallel CircuitPython firmware target alongside the 52Pi
Kit in pico-cp/. Same engine, same program-string grammar, same programs.json, same
live-sync protocol. Read-only on the device (no on-device beat editing); the web
editor's Live sync mirrors all edits in real time and the Explorer emits its own
play/stop/bpm/sel deltas back.
Hardware (Pimoroni Explorer PIM744):
- RP2350B + 2.8" ST7789V 320x240 LCD (8-bit parallel; CircuitPython's official
board definition pre-builds the BusDisplay so we just use board.DISPLAY).
- 6 user buttons - A/B/C on the left of the screen, X/Y/Z on the right.
- Piezo speaker on GP12 (PWM) with amp enable on GP13.
- I2C QwSTEMMA on GP20/21 - reserved, unused by the firmware.
- No touchscreen, no joystick, no RGB LED. Run state shows on a tiny on-screen dot.
Buttons:
- A = play/stop. B = tap tempo. C = menu.
- X = prev track (hold-repeat). Z = next track (hold-repeat).
- Y = tempo -1 (hold-repeat; -5 after 1.5s).
- X+Z chord = tempo +1 (mirrors Y).
- In a menu: X/Z move the row cursor, Y decrements, A cycles/increments/selects,
B = back, C = close.
Files added:
- pico-explorer/{boot.py, code.py, app.py, programs.json, README.md}.
app.py = 1444 lines (~73KB source -> 29.8KB compiled .mpy).
- info-explorer.html.
Files touched:
- pico-cp/app.py: bump to 0.0.23. Version-query (SysEx 0x02 -> 0x03) reply now
includes the device id as "K;<version>" (backward-compat: editor parses
"contains ';'?" - old firmware sent bare version, treated as K).
- editor.html + editor-beta.html: _parseDeviceReply() splits id;version, FW_PATHS
maps id to .py/.mpy URL pair, so Update firmware now pushes the right binary.
- build.sh + deploy.sh: precompile pico-explorer/app.py -> dist/explorer-app.mpy,
zip pm_x1_circuitpy.zip alongside pm_k1_circuitpy.zip, ship
pico-explorer-app.{py,mpy} next to pico-cp-app.{py,mpy}.
- docs/livesync-protocol.md: new section 7 - per-device emit/apply matrix.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>