Hello, The fabulous community of VVVV users and devs!
While I’m trying to follow the promising direction the new gamma version is taking(Stride PBR, Fuse, ML, OpenCV, Kairos), I’m also experimenting with my silly midi stuff…
I’m Roli Seaboard’s owner, and I enjoy playing MPE. I think they’re more expressive than regular midi, and I’m building some skills on it.
Yes, but what’s midi MPE? You may ask.
“MIDI Polyphonic Expression (MPE) is a method of using MIDI that enables pitch bend and other dimensions of expressive control to be adjusted continuously for individual notes. MPE works by assigning each note to its own MIDI channel so that particular messages can be applied to each note individually.”
Actually, Every note could carry three more real-time streams of data with it. The marketing of Roli “invented” “the five dimensions” of touch…
Every NOTE ON has
- Strike = which is the Velocity (they changed the name)
- Glide = is the Pitch Wheel, but for every note and is set to +24 -24 range
- Slide = the associated behaviour is something like the Modulation Wheel but for every note but is sent to CC 74
- Press is the pressure, so you can also add more control over the initial Velocity or other cutoff or any other control. I can receive this data in a foreach[reactive] from ChannelMessageFilter through the Data1 node
- Lift is the release velocity or speed of liftoff from a keystroke Lift is transmitted as MIDI release velocity (not interesting at the moment)
All this is possible thanks to a really tricky data stream management of the MIDI standard. All channels 16 are used to stream those five dimensions of multiple notes. Channel 1 is used as a master channel which… `I don’t know what I’m talking about… you can read detailed info on the actual bits used here
I managed to receive
- Channel of the Note (I’m ignoring it, for now, working a solo instrument…)
- Number of the Note
- Velocity of the Note
through a Split MidiNote in a ForEach[primitive] from NoteState node
I can receive the Press from Data1 from cahnnelMassageFIlter set to ChannelPressure as I said…
and the Slide from Data2 of another ChannelMessageFilter setted to Controller
Unfortunately, I didn’t find a way to access all the other dimensions in a non-reactive way and get a lot of trouble merging the data (Should I use the Channel info to associate the data to the note?)
HoldLatest, Sampler and S+H are not helping out of the reactive region in this case. The output of Sampler is not consistent. I expected to have all active note out of it, but they shuffle even on a stable chord.
My ambition was to recreate the visualizer of the Roli Dashboard to begin, but I’m a bit stuck.
So I created a LinearSpread of cubes and scaling them in the attached patch based on the note number velocity. Any attempt to merge the data from the reactive regions has been a failure.
What would be the best approach?
Would it be possible to do this in a non-reactive way?
If the reactive is necessary, how to manage the rendering stuff?
If anyone is interested in this MPE topic, you can also DM me in element.
Cheers and Bye!
Thanks to everybody in the VVVV group and the community for creating and contributing to this amazing and unmatched software.
MidiMpeTest.vl (68.8 KB)