cool... yeah implementing as MPE compliant is a good idea as its an 'emerging' standard.
the main features are:
send global (none per note expression) on channel 1
all note messages and per note expression on channel 2-16
(its the starting at channel 2 that catches most out!)
per note expression - pitch bend and channel pressure, and CC 74 as 'timbre'
pitch bend range is by default assumed to be 48 semitones. (it can be altered, but for your controller, just assume it for now, so you dont need to start sending NRPN messages )
the rest to the MPE spec is not being closely followed yet, so if you do the above... you'll be pretty MPE compliant. and certainly axoloti will work fine.
Ive just had a quick look at the code, and its not really a bug in poly multichannel... more a 'feature' and something I take care of in the MPE object - probably whats causing you issues too.
poly multichannel is simple... it basically sends CC/PB/touch only when a note is active.
but this can cause issue, since if you change any of these whilst a note is not active, it will not change the voice.
this is further complicated, by the midi channel does NOT have a direct correlation to the voice (good reasons I wont go it into)
so imagine the following... all on channel 1, assume filter closed
note on (60)
channel pressure 127 - opens filter as expected, on voice 1
note off (60)
channel pressure 0 (under the hood this is 'ignored')
note on (61) ... filter is heard fully open !!!
now this gets even more complicated if we have round robin note routing to voice,
this is all on midi channel 1, assume 4 voices
note on (60) (assigned voice 1)
channel pressure 127 - opens filter as expected, on voice 1
note off (60)
channel pressure 0 (under the hood this is 'ignored')
note on (61) (assigned voice 2) ... filter is heard close (its start state!)
note off (61)
note on (62) (assigned voice 3) ... filter is heard close (its start state!)
note off (62)
note on (63) (assigned voice 4) ... filter is heard close (its start state!)
note off (63)
note on (64) (assigned voice 1) ... filter is heard OPEN !!!
the reason for all this is poly multichannel, really isn't a protocol, it doesn't say anything about what midi messages mean, it just says to blindly route the messages.
this is where MPE kicks it, as it defines what the midi messages mean, and so can have some logic to deal with the above edge cases, in particular you can do things like reset pressure and timbre on note off!
of course with poly multi channel you can (partially) work around this in your patch, i.e. do as Im doing in MPE
basically, what you do is use the gate...
so rather than feed touch directly into (say) your filter or vca, first multiply it by the gate...
this means that when the gate is inactive the filter will close....
in you PD patch this still wont work as you expect though... as if you (say) open the filter, whilst a note is not active, it wont do anything .... but this is because you are not conforming to per note expression.
what you would need to do, change your PD patch, such that you send the touch value every time you start a note.
(this is still not quite perfect, for complicated reasons, but its close enough )
whats worth noting is , that when using your controller, this should all just work.... as you should make sure you only send per note expression when a note is active.
this probably all sounds a bit complicated... but you get used to it, per note expression like everything is a simple concept but there are certain 'details' required to make it work musically
anyway hope this helps
Mark