Max Synthesizers using MPE / ROLI

Igneous Rock's icon

Hey forum,

I've done some searching and it seems no one has posted a synth made for ROLI or MPE data in general. Can this be? I'm trying to work out how to build one, and between [mpeparse] and [polymidiin], I'm a little uncertain with how to proceed and would love to see an example.

thanks!

Igneous Rock's icon

Here's what I've found: the best example of an MPE Max instrument for study is the "PGS1 MPE" Max for Live device.

I've also found that the documentation for MPE protocol in Max is almost non-existent. It seems you need to use a [polymidiin] object to give each note its own pitch-bend/pressure/y-axis information, and it seems you need to send this object "mpeevent" information. What is "mpeevent" information? Not clear. It consists of 6 parameters, but I can't find an explanation of how they work together.
What is Zone Index?
What is Zone 1st channel?
It would seem that each note would get its own "Channel Number", but when I press and release a single note on my Seaboard, my [print] object receives channel numbers 212, 280, 228, 132.... so are Channel Numbers housing parameters (e.g. pressure/pitch bend?)

Really wandering in the wilderness here!

Screen-Shot-2017-03-24-at-11.30.35-AM.png
png
Igneous Rock's icon

What I've figured out about mpeevent protocol:

Zone index: Don't know. Seems to stay at 1.
Zone 1st Channel: Don't know. Seems to stay at 1.
Voice number: This is directly related to the channel range you select in the ROLI Dashboard. There are different layers of channels in MIDI (confusing I know) this is channel is the big sense, like the MIDI channels usually assigned to entire VSTs, or MIDI tracks in Ableton Live. When playing the ROLI Rise, each new note you play is randomly assigned a channel that isn't being used, or steals from the oldest held channel. In this way, middle C on your keyboard might be assigned to MIDI channel ("Voice number") 2, but after playing a bunch of notes, later it might be channel 10.
Channel number: This is basic MIDI protocol, and you can see it in use in midievent protocol, compare [midiparse] reference to [mpeparse] reference. There are I believe 255 channel numbers, but they come in blocks of 16 for important parameters. Each channel number can hold multiple variables of data, e.g. channel numbers 144-159 are followed by MIDI note, velocity, and release data. For the ROLI, the important channel numbers are:
->126-143=noteoff
->144-159=noteon / strike velocity / release velocity
->160-175=?
->176-191=y-axis location
->208-223=pressure
->224-239=x-axis relative motion (pitch bend)
MIDI Message number & MIDI Data:
these hold the info that's nested inside the channels. So a note might be mpeevent [1 1 10 218 x], which means -> (voice) 10 (remember, doesn't mean it's 10th note held down, just randomly chosen from a range) -> (218) pressure -> and the x variable is the pressure amount from 1-127. If you slide your finger up the same note, it might read mpeevent [1 1 10 186 74 y], with 186 relating to y-axis motion, 74 being an agreed upon cc number, and y being the y-axis location from 1-127.

Screen-Shot-2017-03-24-at-4.42.13-PM.png
png
Screen-Shot-2017-03-24-at-4.43.40-PM.png
png
Igneous Rock's icon

another discovery: the polymidiin.maxhelp patcher is basically broken for ROLI users, because the "poly pressure" parameter isn't used on the ROLI Rise, instead pressure comes out of the "aftertouch" parameter. So when you try the patch, nothing happens.

Max Patch
Copy patch and select New From Clipboard in Max.

Here's a polymidiin.maxhelp patcher that works for ROLI users:

Igneous Rock's icon

If you want to get the x-coordinate data for where your finger is on the ROLI Rise, the object [mpescale] is supposed to help.
But it seems that it doesn't register octave shifts on the ROLI. If you use the built-in octave-shift buttons on the ROLI, it keeps dumbly reading the note position as if it was in the old octave layout, giving you the wrong x-coordinate position. Lame!

Max Patch
Copy patch and select New From Clipboard in Max.

I hacked together a DIY version that uses [regexp] to analyze the data coming out of the mpeevent stream, looking for octave shift data. It would be great if the [mpescale] object could be updated, if possible. Or if someone has a better solution! :)

Igneous Rock's icon

Uhoh... it seems the MPE voice number for all my notes (3rd digit in the mpeevent data) is -1... is this a limitation of Live?

Joseph Guisti's icon

I'm interested in this because I want to use my linnstrument with Max and do custom scales and stuff. I'll go through your process above as a way to get started.
Any new progress?

one thing I can tell you is that Live doesn't handle poly aftertouch data. That might be one reason you're not seeing any of that; possibly other messages as well

kyzen's icon

Hey here,
Did you finally achieve to use your roli rise in live with maxforlive?