this would be grid handling not midi handling (assuming its been done the same as my push 2 code)
but yeah, that would be an issue… unlike the midi.lua code, the grid lua code does not create a unique name, it uses the serial number which it assumes is unique.
I didn’t have access to the serial number of the push, so I just used ‘push2’ 
so if that name is being used as some kind of unique index that would cause an issue.
(not sure why the name would be used when there is a unique device id, but hey ho)
its an easy ‘fix’ (again assuming your launchpad code is based on the push2 stuff)
in weaver.c
void w_handle_push2_add(void *p) {
struct dev_push2 *dev = (struct dev_push2 *)p;
struct dev_common *base = (struct dev_common *)p;
int id = base->id;
// its a push2
_push_norns_func("push2", "add");
lua_pushinteger(lvm, id + 1); // convert to 1-base
lua_pushstring(lvm, base->name);
lua_pushlightuserdata(lvm, dev);
l_report(lvm, l_docall(lvm, 3, 0));
// its also a midi controller
_push_norns_func("midi", "add");
lua_pushinteger(lvm, id + 1 + PUSH2_DEV_OFFSET); // convert to 1-base
lua_pushstring(lvm, base->name);
lua_pushlightuserdata(lvm, dev);
l_report(lvm, l_docall(lvm, 3, 0));
// and it might be a grid
const char *serial = "Push2";
const char *name = "Push2";
_push_norns_func("monome", "add");
lua_pushinteger(lvm, id + 1 + PUSH2_DEV_OFFSET); // convert to 1-base
lua_pushstring(lvm, serial);
lua_pushstring(lvm, name);
lua_pushlightuserdata(lvm, dev);
l_report(lvm, l_docall(lvm, 4, 0));
}
just change the serial number to be based off something unique, like the id or the device path.
const char *serial = base->path;
a better hacky fix (and one i’ll do for push2) is to set the serial to the path in the push class,
so that later it could be replaced by a proper USB call to go get the serial number.
const char *serial = base->serial;
and then device_push2.c:
int dev_push2_init(void *self) {
// blah, blah blah
base->serial = strdup(base->path);
}