What everyone wants could much more easily be obtained with the simple addition of three Control Change messages, allowing note pitches to be independent of their numbers, and allowing all controls to be addressed to individual notes. I propose the following language:
Control Changes 102 and 103 are defined as the Pitch LSB and MSB controls. Either or both may precede a Note On on the same channel to alter its pitch. If both are specified, they may be in either order. The MSB specifies the semitone pitch, making the note number a mere label by which the note is identified when turning it off, or when addressing a control to it. The LSB provides a bipolar offset, where 0 is 50 cents flat, 64 is neutral, and 127 is almost 50 cents sharp. The Note On consumes the Pitch controls so that they have no further effect.
On output, Pitch MSB is only necessary if the pitch rounded to a semitone doesn't match the note number, and Pitch LSB is only necessary if the pitch has a fractional part.
Pitch controls may also be combined with a High Resolution Velocity Control Change 88 in any order.
Control Change 104 is defined as the Note control. It's value is interpreted as a note number, and causes the next message on the same channel to be addressed only to that note, if possible. If that message isn't a Control Change 0 to 31, it also consumes the Note control, so that it has no further effect. If it is a Control Change 0 to 31, it tags the record of the note number so that it will only still be effective on the corresponding Control Change LSB, so that LSBs that follow their corresponding MSBs will not need a second Note control.
A regular message with no preceding Note control overrides any earlier messages addressed to individual notes, just as a Channel Pressure overrides any earlier Poly Pressures. Typically, a Note control will work with a limited set of other Control Changes (or MSB and LSB in that order), or a Pitch Bend. It should not work with Channel Pressure, since Poly Pressure is available for that purpose. If an NRPN is to be addressed to a note, the Note control must precede the Data, not the NRPN. If a Note control precedes a control that doesn't support it, the Note control should still be consumed, but the following control should be ignored, rather than interpreting it as a mono control.
I believe these changes would provide a framework for everything that people want from MPE, yet allow it all to be done on a single channel, without limiting the number of notes, and without any mode switching. The software changes needed in an instrument would generally be minor:
- Internal Note On operations would have to carry a separate pitch value instead of using the note number.
Controls that need to be made polyphonic would have to record 128 values. But that's already how Pressure works, so the mechanism is already understood.
These "prefix" controls would have to be consumed by the messages that they modify. But that's already how High Resolution Velocity works, so the mechanism is already understood.
Any comments are welcome.