On Sat, Dec 09, 2006 at 05:04:16PM +0100, Christian Schoenebeck wrote: > 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