Midigrid: use launchpads & midi grid controllers with Norns

For loom, add the usual midigrid code at lines 862 and 912 then change line 898 to read - if grid_dirty then



Got mlr working with midigrid but no visual feedback. I’m using my push2. I haven’t figured out all the controls yet. There is limited info on this so I’ve just been pressing buttons until something happens.


Thanks folks I’ll try these this evening

hey man, did you get it to work? Still struggling with the changes in Loom. I would really appreciate if you could share the solution if there is one!

1 Like

Hi :slight_smile: Thanks for this huge effort! I’m looking to get a compatible device for midigrid and was wondering which one works the “best” or closest to a regular grid? I.e. white colors with different brightness levels, no random lights, etc.

the new launchpad generation can work with rgb values, thus you can recreate the 16 brightness-levels of the monome grids. I didn’t use the midigrid library yet in my scripts, but currently try to integrate it in this script (SuperBrain (Multi Engine Midi Sequencer)).

I only own the launchpad X, but beside the bigger footprint compared to the mini line, I really appreciate the new possibilities due to the velocity input.

1 Like

Thanks! As I understood it, this is not completely working though with midigrid at the moment. Or is it just the current generation LPmini mkIII that has random pads lighting up for example?

On a different topic:
OMG! :scream:

I just realized that my Linnstrument 128 has exactly the same pad amount/layout as the grid and there’s a user firmware mode that lets one turn each pad’s LED on/off with MIDI commands! I know this is more expensive than an actual grid and quite a bit bigger, but If I could get this to work, I wouldn’t need to buy anything new for now. I’ll investigate!

EDIT: Okay, so the Linnstrument works a little bit differently than the Launchpads, etc.

To activate user mode, first send NPRN 245 value 1 on any channel. Sending 0 disables user mode. This can also be toggled manually on the Linnstrument, by holding the “OS Update” button in its Global Settings menu for half a second.

To set key LEDs you need to send three CC messages:
CC20: Column 0-16 (left to right) *
CC21: Row 0-7 (top to bottom!)
CC22: Color 0-11**

Pressed keys send:
Note On
Number: Column 0-16 *
Channel: Row 1-8 (bottom to top!)
Velocity: fixed, as set in Linnstrument menu

Released keys send:
Note Off
Number: Column 0-16*
Channel: Row 1-8 (bottom to top!)
Velocity: 0

*Columns 1-16 are the actual grid keys, column 0 has AUX buttons like on the Launchpads

**0=as set in Note Lights settings, 1=red, 2=yellow, 3=green, 4=cyan, 5=blue, 6=magenta, 7=OFF, 8=white, 9= orange, 10=lime and 11=pink

I’ll see if I can maybe implement this into midigrid myself.

EDIT: 2 hours later
… uhm … I feel like implementing the Linnstrument into midigrid is not as trivial for me as I had hoped. I could code support for the Linnstrument into my scripts without going through midigrid, but that’s not really useful for anyone but myself. I’ve never coded any scripts with grid functionality yet, so maybe I need to start with studying this before trying to understand the inner workings of midigrid :sweat_smile:

EDIT 3: 9 hours later (with some breaks in between :wink: )
Success!!! → Midigrid: use launchpads & midi grid controllers with Norns (Update 04-04-2021) - #78 by NightMachines


There is a rather persistent issue with the launchpads that causes the occasional mis-light of the LED’s. There are indications that is could be down at the linux driver level … but the reality is it’s a minor annoyance at the worst for most people. (see if you can spot it the the video below … )

mini mk1&2’s are the best economic choice, but if you are after white buttons then the mini mk3 is a good choice.

I don’t know which of you crazy cats made this, but this is AMAZING!
[Monome Norns Arcologies + Launchpad + iPad - YouTube]

@NightMachines you will have to override a bunch of the default behaviour but it should be doable based on what you have said above, but yes, not trivial. You might have to check if a column (or row) is “dirty” and update is. You would not want to send 3 CC messages for every LED. If you do decide to pursue it further let me know and I’ll see what I can do to help…


Thank you! Just regarding the right starting point for this endeavor: Could I do all of the hacking in a duplicate of the generic_device.lua file, renamed to linnstrument.lua (after configuring the midi device name in the supported devices lua file)?

But I suppose if sending three CC messages per LED is clogging the pipes, then it might not be worth going down that route at all.

I have two mini mk3s and imho the random lights are a non-issue - it does happen, but it’s so brief and generally not persistent or linked to clock activity (ie it does not actually impede using the midigrid). Generally the random lights are also outside the color palette as well - so I’ve never had a random light interfere with my understanding of what the app is doing.


20 chars of chiming in to say that this is my experience with 2 x Launchpad Minis Mk3 too.

1 Like

I don’t know if they’re on here but I’ve followed them on Insta for quite a while and they always have some great videos, often made with mobile instruments and generally with some stunningly good visuals.

I didn’t know they have a presence on YT (but should have guessed!) - will be checking out some of their other vids later, for sure!

Thanks for the info! Good to know that the random flashing isn’t really an issue.

I’m hacking away happily with my Linnstrument and it’s looking pretty good actually!

EDIT: figured out my issue. I had only 15 values in the brightness_map table and not 16!


Hi all. Recently picked up a Norns Shield so just learning the ropes and new around here. Having an issue with getting Midigrid to work successfully with Cheat Codes 2 and a Launchpad X. Not sure if this topic is the best place to ask for help or not…
Got the latest version of CC2 and @jaggednz’s Midigrid fork installed. When I put LPX in Programmer mode I can’t get any pads to light up. The bottom 16 pads are selecting slices in CC2, though, so there’s definitely some connection going on. Am I doing/not doing something daft?

1 Like

Have you enabled midigrid in the EDIT > GRID menu?

In other news: Hello LinnstruGrid :smiley:


Aha! I was not doing something daft. Thanks @NightMachines! :slightly_smiling_face:

Grid looks great on the Linnstrument.

Holy shit!!! I have a linnstrument 128. And if you could get linnstrument working with norns as a grid, you would be my hero!

It seems like I’m almost done with Linnstrument support, but of course it would need heavy testing still :smiley:

Since midigrid devices have only used 8x8 layouts in 1 or 2 quads so far and this whole grid stuff is still new to me, I’m currently hard coding my 16x8 Linnstrument grid sloppily into the midigrid script. I’m not sure how to make the script automatically switch between the 8x8 quad system and a single 16x8 grid, but I just messaged JaggedNZ about this, so I’m sure there’ll be a simple solution soon :wink:

Very excited about this too!

EDIT: Linnstrument interfaced with Awake via midigrid (no audio)!

EDIT: Apart from cheat codes 2, the tutorial 9_grid script and awake, I also got loom working without any issues so far, even with all 128 Linnstrument LEDs flashing. So despite the three MIDI CC messages per LED, everything seems to behave :slight_smile: The only thing that’s a bit confusing sometimes are the colors. Since there are just 10 very different colors on the Linnstrument, it’s a bit difficult to see what’s going on in loom for example.


So what steps did you take to make it work?

1 Like

Here’s a little tutorial on how to make scripts work with midigrid.

1st Step:
Generally, scripts with grid support will have a grid variable at the top. For example

local g
or local grid
or local grid_device (I’ll use this in the examples below)

Replace it with:
local grid_device = util.file_exists(_path.code.."midigrid") and include "midigrid/lib/mg_128" or grid

This will check wether midigrid is installed and if so, assign it to the grid_device variable. If midigrid is not installed, it will assign the original grid resources instead.

2nd Step:
Now find the lines in the code that read:
grid_device = grid.connect()

Replace all occurrances with:
grid_device = grid_device.connect()

EDIT: Removed my attempt to explain why this needs to be done :sweat_smile:

3rd Step

EDIT: This is probably not necessary anymore, thanks to @JaggedNZ’s recent midigrid update :slight_smile:

See if there are any lines that check wether a grid is connected. For example
if grid_device then
or if grid_device == true then (I’ll use this as an example below)
or if grid_device ~= nil then

Right now, this does not work with a midigrid device, but there might be a fix for that in a future midigrid library update. So a midigrid device will actually return nil here, stopping all grid functionality of the script. To circumvent this, but to keep the code structure intact, I usually just comment out those lines, to keep them in the script in case I need to revert back, and add a (silly) always true statement instead, like so:

-- if grid_device == true then
if 1 == 1 then

This will always enable grid functionality in the script, even if no grid/midigrid is connected. It hasn’t broken anything for me yet in the latter case, but usually we change these lines because we always have our midigrid attached anyway, so it should be safe.

That’s it :slight_smile: