I wrote:
> Turns out it does have all the features we need - actually, it has too many, most of which are useless."
Looks like I spoke way too soon on that. I just found found two things
which are absolutely and utterly ridiculous about the MTS standard:
First, the non-realtime tuning change is actually sent, literally, as
a non-realtime SysEx message. Non-realtime SysEx messages aren't
supposed to be processed immediately, respecting their order in
relation to surrounding events in the queue. Rather, they're just
supposed to be processed whenever the synth "gets around to it."
So you might end up sending a non-realtime tuning message before a
note-on, but then it might get processed AFTER the note-on. This is
especially true if the message is being passed around between several
MIDI relays or daisy-chained devices. You never know when it's going
to end up getting processed by the synth.
This totally destroys the utility of this message for things like
retuners, which is the only situation in which that message would have
ever be useful to begin with. Thus, non-realtime tuning changes are
utterly useless.
That leaves us with one useful MTS message: the realtime standard
tuning change message - specifically, the non-deprecated version with
bank. But look very, very, very carefully at the structuring of this
message (
http://www.midi.org/techspecs/midituning.php#bank_ext), and
you'll notice something ridiculous is missing. There's no channel
number!! God damn it, how did they forget that?
Turns out this really changes things a bit. Though they never actually
say this anywhere, as far as I can tell, the desired workflow is
supposed to be:
1) You use one of these realtime/non-realtime tuning changes to update
a particular tuning "bank/program".
2) Then, on the channel you want, you send the tuning select RPN to
select the bank/program that you want for that specific channel.
3) Thus, by convention, you might immediately set channels 1-16 to
tuning programs 1-16 on bank 1. Then, when you send realtime tuning
changes to bank 1, programs 1-16, channels 1-16 instantl update.
This is an extremely silly and cumbersome setup for 2013, but it ends
up working. So this changes my analysis a bit:
1) The non-realtime messages are now worse than useless, since there's
no guarantee that they're going to actually be processed at the right
time, a problem made worse if things are being relayed and
daisy-chained.
2) The realtime messages are still OK, but since you can't specify a
channel, you're forced to specify a "bank and program" instead, and
then load the bank and program on the channel you want via the tuning
bank/program select RPN. Once you've done this one time per channel,
you can then just send realtime tuning changes to the proper
bank/program to update things without having to send another RPN.
Thus, the only things useful in any way to us are realtime tuning
changes, and the bank/program RPN. Non-realtime messages get demoted
to "useless" status, and the bank/program select RPN gets promoted to
"critical" status.
Damn.
Mike