New pico-cp/ — a CircuitPython port of the PM_K-1 firmware so the Pico mounts as a
CIRCUITPY drive carrying its code + tracks (the MicroPython pico/main.py stays the
simple fallback):
- pico-cp/code.py: displayio BusDisplay driving ST7796 via a custom init_sequence;
smooth anti-aliased text via displayio Bitmap+Palette (reuses the baked font blobs);
vectorio rects for dots/buttons; DIY GT911 touch (16-bit regs, edge-detected);
pwmio buzzer, analogio joystick, digitalio buttons, optional neopixel RGB; the
polymeter engine on a time.monotonic_ns scheduler. Reads /programs.json (falls back
to baked defaults); CircuitPython auto-reloads on file change.
- pico-cp/programs.json: the 23 default grooves. pico-cp/README.md: flash + calibrate.
- build.sh/deploy.sh: bundle + serve /pm_k1_circuitpy.zip. info-kit.html: experimental
'CircuitPython edition — USB drive' section.
Verified in CPython (stubbed displayio): init sequence well-formed, parser handles the
grooves incl. (3,8) euclid + @-4 gain, and code.py's actual make_text renders identical
smooth AA text. Hardware bits (panel/touch/MIDI) await on-board testing.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
97 lines
2.4 KiB
JSON
97 lines
2.4 KiB
JSON
{
|
|
"title": "PolyMeter",
|
|
"programs": [
|
|
{
|
|
"name": "Four on the floor",
|
|
"prog": "t120;kick:4;snare:4=.x.x;hatClosed:4/2"
|
|
},
|
|
{
|
|
"name": "Swing ride",
|
|
"prog": "t150;ride:4/2s;kick:4=X..x;snare:4=.x.x"
|
|
},
|
|
{
|
|
"name": "Purdie half shuffle",
|
|
"prog": "t92;kick:4/3=X....x...x..;snare:4/3=..gg.gX.gg.g;hatClosed:4/3=X.xX.xX.xX.x"
|
|
},
|
|
{
|
|
"name": "Samba (2/4)",
|
|
"prog": "t104;tomLow:2/4=x...X...;hatClosed:2/4;woodblock:2/4=X.xx.xX."
|
|
},
|
|
{
|
|
"name": "Nanigo (6/8 bembe)",
|
|
"prog": "t130;cowbell:4/3=X.xx.x.xx.x.;kick:4/3=X.....X.....;hatClosed:4/3=..x..x..x..x"
|
|
},
|
|
{
|
|
"name": "6/8 groove",
|
|
"prog": "t100;kick:3+3=x..x..;snare:3+3=...x..;hatClosed:3+3/2"
|
|
},
|
|
{
|
|
"name": "7/8 (2+2+3)",
|
|
"prog": "t130;kick:2+2+3=x..x..x;hatClosed:2+2+3/2"
|
|
},
|
|
{
|
|
"name": "5/4 (3+2)",
|
|
"prog": "t112;kick:3+2=x..x.;snare:3+2=..x..;hatClosed:3+2/2"
|
|
},
|
|
{
|
|
"name": "5 over 4 polyrhythm",
|
|
"prog": "t100;kick:4;claves:5~"
|
|
},
|
|
{
|
|
"name": "3 over 2 hemiola",
|
|
"prog": "t96;woodblock:2;cowbell:3~"
|
|
},
|
|
{
|
|
"name": "2 & 4 & 3 per bar",
|
|
"prog": "t100;kick:3;cowbell:2~;claves:4~"
|
|
},
|
|
{
|
|
"name": "Triplet hats",
|
|
"prog": "t100;kick:4;snare:4=.x.x;hatClosed:4/3"
|
|
},
|
|
{
|
|
"name": "Accents",
|
|
"prog": "t92;kick:4=X..X;snare:4=.X.X;hatClosed:4/2"
|
|
},
|
|
{
|
|
"name": "Tempo builder 80+",
|
|
"prog": "t80;woodblock:4;rmp80/4/4"
|
|
},
|
|
{
|
|
"name": "Gap trainer 2/2",
|
|
"prog": "t100;kick:4;hatClosed:4/2;tr2/2"
|
|
},
|
|
{
|
|
"name": "Intro - hats+kick",
|
|
"prog": "t88;kick:4=X.x.;hatClosed:4/2=gggggggg"
|
|
},
|
|
{
|
|
"name": "Groove in",
|
|
"prog": "t88;kick:4=X.x.;snare:4=.X.X;hatClosed:4/2"
|
|
},
|
|
{
|
|
"name": "Half-time shuffle",
|
|
"prog": "t92;kick:4/3=X....x...x..;snare:4/3=..gg.gX.gg.g;hatClosed:4/3=X.xX.xX.xX.x"
|
|
},
|
|
{
|
|
"name": "Build 92 to 120",
|
|
"prog": "t92;kick:4;snare:4=.X.X;hatClosed:4/2"
|
|
},
|
|
{
|
|
"name": "Four-floor (909)",
|
|
"prog": "t124;kick909:4;clap909:4=.X.X;hat909:4/2=.X.X.X.X"
|
|
},
|
|
{
|
|
"name": "Samba break",
|
|
"prog": "t116;tomLow:2/4=x...X...;hatClosed:2/4;woodblock:2/4=X.xx.xX."
|
|
},
|
|
{
|
|
"name": "Peak - 16ths",
|
|
"prog": "t132;kick:4=X..x;snare:4=.X.X;hatClosed:4/4"
|
|
},
|
|
{
|
|
"name": "Outro",
|
|
"prog": "t132;kick:4=X..x;hatClosed:4/2=gggggggg"
|
|
}
|
|
]
|
|
}
|