[linux-audio-dev] MIDI bank select MSB + LSB

Alexandre Ratchov alex at caoua.org
Sat Dec 9 19:21:20 UTC 2006


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



More information about the Linux-audio-dev mailing list