Skip to main content

Launchpad Mini MK3

An 8×8 grid of RGB pads, eight buttons across the top, eight down the right side, and a logo button. The pads are notes and the colours go back as SysEx. Think of it as a 64-pixel display that can feel you touching it. There are two on the table, so share.

MakerNovation
USB name"LPMiniMK3 MIDI". There is also "LPMiniMK3 DAW". Use MIDI.
PortsTwo pairs, MIDI and DAW. The helper picks the MIDI one.
SendsNotes for the pads, CC 19 to 99 for the buttons, in Programmer mode.
ReceivesA note with a palette index as velocity lights a pad. SysEx for exact RGB, all pads at once and scrolling text.
Buynovationmusic.com/products/launchpad-mini-mk3

What it sends​

In Programmer mode, which the helper switches on when it connects and off when your sketch closes:

ControlMessageNumbers
Pad press and releaseNote on, note offNote is row × 10 + column counted from the bottom-left as 11, so top-right is 88. The helper turns that into x 0..7 left to right, y 0..7 top to bottom.
Top row buttonsCC91 to 98, left to right. The first four are printed as arrows.
Right column buttonsCC89 down to 19, in steps of 10
LogoCC99
USB name"LPMiniMK3 MIDI". There is also a DAW port. The helper picks the MIDI one.

Lighting the pads​

A note on sent to a pad with a palette index 0 to 127 as velocity sets a colour. 0 is off. Exact RGB, all 64 pads at once, and scrolling text are SysEx commands. The helper gives you set, setRGB and text. The bytes are taken apart in the Launchpad Marquee notes.

Handy palette indexes: 3 white, 5 red, 9 orange, 13 yellow, 21 green, 37 cyan, 45 blue, 53 magenta. pad.set(x, y, c) also accepts an ordinary Processing colour.

Start here​

Click inside the sketch to connect MIDI. No device? The keys named in the code stand in.

The browser asks for MIDI, then SysEx. Say yes to both. Code: starters/p5/launchpad/sketch.js. Paste it into the p5.js web editor with the helper script tag, or download the folder and double-click index.html.

sketch.js
// Launchpad starter: paint on the 8x8 grid. Press a pad to colour it; the top-left button clears.
// Click once to connect MIDI (the Launchpad needs SysEx; Chrome asks). No Launchpad: click the cells, 'c' clears.
let pad;
let cells = new Array(64).fill(null);
const CELL = 70; // pixels per cell on screen

function setup() {
createCanvas(560, 560);
pad = new Launchpad(); // change this: new Launchpad({ name: "..." }) if it isn't found
pad.connectOnClick(); // connects on the first click and shows a hint until then
}

function draw() {
background(20);
for (let y = 0; y < 8; y++) for (let x = 0; x < 8; x++) {
fill(cells[x + y * 8] || color(45));
rect(x * CELL + 4, y * CELL + 4, CELL - 8, CELL - 8, 10); // change this: how a cell is drawn
}
if (pad.connected()) pad.button("top0", pad.RED); // keep the "clear" button lit
}

function paint(x, y) {
const c = color(x * 36, y * 36, 255 - x * 20); // change this: pick the colour another way
cells[x + y * 8] = c;
pad.set(x, y, c); // light the real pad with the same colour
}

function clearAll() { cells = new Array(64).fill(null); pad.clear(); }

function padPressed(x, y) { paint(x, y); } // the helper calls these two
function buttonPressed(id) { if (id === "top0") clearAll(); }
function mousePressed() { const x = floor(mouseX / CELL), y = floor(mouseY / CELL); if (x < 8 && y >= 0 && y < 8) paint(x, y); } // stand-in
function keyPressed() { if (key === "c") clearAll(); }

The helper​

new Launchpad(this)Connects to the "LPMiniMK3 MIDI" ports, switches to Programmer mode, and puts the device back in Live mode when the sketch closes.
pad.pressed(x, y), pad.justPressed(x, y)x 0..7 left to right, y 0..7 top to bottom.
pad.set(x, y, c), pad.setRGB(x, y, r, g, b)A palette index 0..127 or a Processing colour. Or RGB with each channel 0..255.
pad.button("top3", c), pad.clear(), pad.text("hi", c)Side buttons by id, everything off, and the firmware's own text scroll.
void padPressed(int x, int y), void padReleased(int x, int y), void buttonPressed(String id)Define any in your sketch and the helper calls it.

From the helpers' README​

8x8 RGB pads, eight buttons across the top, eight down the right side, the logo. Programmer mode on connect(), Live mode back in dispose() / close().

Launchpad pad = new Launchpad(this); // or (this, "name")
pad.pressed(x, y); pad.justPressed(x, y); pad.justReleased(x, y); // x 0..7 left to right, y 0..7 top to bottom
pad.velocity[y][x]; pad.anyPressed();
pad.buttonPressed("top3"); pad.buttonJustPressed("right0"); pad.buttonJustReleased("logo");
pad.set(x, y, color(255, 0, 0)); // any Processing colour, sent as RGB
pad.set(x, y, pad.GREEN); // or a palette index 0..127 (0 = off): pad.OFF, WHITE, RED, ORANGE, YELLOW, LIME, GREEN, MINT, CYAN, SKY, BLUE, VIOLET, MAGENTA, PINK
pad.setRGB(x, y, r, g, b); // 0..255 each
pad.flash(x, y, a, b); pad.pulse(x, y, c); // palette indices
pad.button("top3", c); pad.clear();
pad.text("hi", c); pad.text("hi", c, speed, loop); pad.stopText();

Callbacks: padPressed(int x, int y), padReleased(int x, int y), buttonPressed(String id), buttonReleased(String id). Button ids: top0..top7, right0 (top) .. right7 (bottom), logo. No keyboard stand-in.

A Processing colour has its alpha bits set, so it is a negative int. A palette index is 0..127. That is how set() tells them apart: pad.set(x, y, 5) is palette red, pad.set(x, y, color(255, 0, 0)) is RGB red. Unchanged values are not re-sent, so repainting all 64 pads in draw() is fine.

Message map (programmer mode): pad = note (8 - y) * 10 + (x + 1) (11 bottom-left, 88 top-right), Note On velocity > 0 is press, 0 is release. Top row = CC 91..98, right column = CC 89 (top) .. 19 (bottom), logo = CC 99, value > 0 is press. Output: palette colour = Note On on channel 1 (static), 2 (flash), 3 (pulse), or CC on channel 1 for buttons. SysEx header F0 00 20 29 02 0D; 0E 01/00 programmer / Live mode; 03 followed by <type> <led> <colour...> entries lights LEDs (type 0 palette, 1 flash a/b, 2 pulse, 3 RGB with 7-bit values); 07 <loop> <speed> <colourspec> <ascii...> scrolls text. Ported from grid-controllers/launchpad.js.

Python: Launchpad(this, name="LPMiniMK3 MIDI"), pad.pressed(x, y), pad.just_pressed(x, y), pad.button_pressed("top3"), pad.set(x, y, c), pad.set_rgb, pad.flash, pad.pulse, pad.button, pad.clear(), pad.text(s, c, speed, loop), pad.stop_text(), pad.close(); module-level xy_to_note, note_to_xy, button_to_cc, cc_to_button, COLORS.

Try first​

  • Paint. Each press cycles a pad through colours. Then mirror it big on screen.
  • Game of Life. Press to seed, logo to step. There is a port of the automata demo.
  • Two players: one at the keyboard, one at the board. Quest is built on this.
  • Snake, steered with the arrow buttons.

More on the ideas page and the demos page.

Without the helper​

One SysEx for programmer mode, pads as notes, palette colours out. Under sixty lines, same stand-ins. Read the three bytes, no helpers first.