Am Samstag, 9. Dezember 2006 03:01 schrieb Alexandre
Ratchov:
Keyboards that only support "MSB only"
mode (or "LSB only" mode)
are just too limited and there is no workaround that will "just
work" with both modes. AFAIK, there is no standard way to detect if
a device will use MSB, LSB or both. According to midi standard the
bank number is (LSB + 128 * MSB), so the "Both" mode is the correct
one to use. That's also what most users would expect.
Of course there is no real way to detect if a keyboard sends MSB-only or
LSB-only bank selects, but there would be a workaround at least. I guess I
will implement it similar as suggested by Grigor and Rui:
"Normally, the instrument is only changed effectively when, and only when, a
program change is received? Check. So, let's try having two int placeholders
per MIDI channel for bank selection in linuxsampler, one as MSB and another
as LSB, initialized to -1. If a bank MSB arrives, it will override the
corresponding variable. Same as LSB, but independently. Then, if the LSB
variable has the -1 value then, most probably, the sending device does not
support the conjugated bank selection method, and in that case the MSB value
will function as LSB alone, but iif the stored LSB value is -1, meaning that
it was untuoched by the sending device. Once the program change is done, just
reset both values to -1 and we're back in business ;)"
At least I can't see a drawback of this workaround.
hmm... MIDI spec says that if only MSB (or LSB) is received, then
the last value of LSB (or MSB) will be used. If the default bank is
0 then if bank MSB (or LSB) has never been received 0 will be used
as "last value".
AFAIK a device that uses both LSB and MSB is allowed to transmit
the following messages:
bank_msb 1 # set bank to 128
prog_change 2 # load patch 2 from bank 128
or the following:
bank_msb 10 # set bank to 1280
bank_lsb 1 # set bank to 1281
prog_change 2 # load prog 2 from bank 1281
bank_msb 0 # set bank to 1
prog_change 3 # load prog 3 from bank 1
This is unlikely to happen with a MIDI keyboard in real-life,
however a MIDI sequencer that keeps state of already transmitted
messages may transmit messages like the above.
cheers,
-- Alexandre