@barnone I implemented my basic Max patcher a little differently and avoided that problem with empty string. I'm still using a single regexp to detect that empty string but may replace it with a simple max external if efficiency becomes an issue.
Here are some top-down pictures of what I did.
EigenStrings The Eigen.Alpha.In object produces MIDI NoteOn/NoteOff messages (same as midiin) and pitchbend which can be fed into either a VST or an external MIDI instrument. The GenericVST is part of my Live Keyboard Rig Manager (see my blog here for more info on that library)
Eigen.Alpha.In This accepts nicely cleaned up KeyDown/KeyUp events, converts them to Row/Col number format (not sure I'm going to keep that, but it has some uses) and then the row/col info is converted into MIDI note numbers for a guitar-tuning layout.
Eigen.OSCInput Here I extract the raw OSC packets and I'm using a regex to feed me either a valid key number or 0 if the empty string is found.
The data is sent into the Eigen.OSCProcessor
Eigen.OSCProcessor Here, I'm basically keeping track of what keys are currently down by using the coll object using the event stream number as the index and the key number as the value. This patcher ensures that only a single keydown event is generated no matter how long a key is held.
So far, it has been totally glitchless so I'm optimistic about the approach.
My next step will be to properly integrate the continuous data for individual notes. It will be pretty trivial to generate polyphonic aftertouch events by finding the associated note number for the current stream and packing that with the pressure value. I'm not sure yet how I'm going to package the left-right data.