fluid-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

MIDI Bank Select proposal (was Re: [fluid-dev] Re: Son of ticket #65)


From: Pedro Lopez-Cabanillas
Subject: MIDI Bank Select proposal (was Re: [fluid-dev] Re: Son of ticket #65)
Date: Tue, 3 Aug 2010 22:48:45 +0200
User-agent: KMail/1.9.6 (enterprise 20070904.708012)

[Sorry, this is a bit long...]

After FS-1.0.9 was released, several changes have been accumulated in the code 
producing incompatible behavior with regarding to the management of the MIDI 
Bank Select messages.

MIDI Bank Select messages are Control Change #0 (MSB) and CC#32 (LSB) [4]. Up 
to FS-1.0.9, the behavior was that when a CC#0 message was received, the 
value was used as the channel bank number. If a CC#32 was received later, the 
bank number was recalculated as MSB*128+LSB and the result used as the new 
channel bank number. The bank number is not immediately used, but reserved 
until a Program Change message is received, and then applied to select a 
sound preset from the loaded soundfonts.

Current behavior in the SVN codebase is that the soundfont bank number is 
always calculated from MIDI Bank Select messages with the formula = 
MSB*128+LSB, no matter if only the MSB or LSB values are received, 
initializing the bank number to 0 for melodic channels and 128 for the 
percussion channel. This new behavior has a problem when a MIDI song for GS 
synths is played with a GS soundfont in FluidSynth: the selection of preset 
sounds may be wrong.

SF2 (SoundFont) files (like GeneralUser, FluidR3,...) have bank numbers < 127 
for melodic sounds and 128 for Drum kits, as recommended by the SoundFont 
specification [5]. It is necessary to map the MIDI Bank Select numbers to the 
SF2 bank numbers, because they won't always match. The sf2 spec says 
that "The special case of a General MIDI percussion bank is handled 
conventionally by a wBank value of 128. If the value in either field is not a 
valid MIDI value of zero through 127, or 128 for wBank, the preset cannot be 
played but should be maintained."

Note that DLS soundfonts are different: they have 14bit bank numbers. But 
FluidSynth doesn't use DLS files yet!

There is not an universal behavior for MIDI Bank Select messages, because it 
depends on several standards: GM, GS, and XG:

GM (General MIDI) does not define Bank Select messages. The 
document "gmguide2.pdf" [1] says that Bank Select (CC#0/32) should be 
completely ignored in GM mode.

GS (Roland) uses CC#0 as variation number, and CC#32 as a device emulation 
number. Usually, LSB=0 for the main device mapping, and other numbers for 
selection of families, or emulated devices [2]. 

XG (Yamaha) uses CC#32 as the bank number, and CC#0 as a melodic/sfx/drums 
switch. The XG specification [3] says:
Bank Select MSB/LSB: 00H/20H
Cntrl#  Parameter        Data Range
0       Bank Select MSB  0:Normal, 64:SFX voice, 126:SFX kit, 127:Drum
32      Bank Select LSB  0 to 127. Default: 00 00H
If multipart parameter “Rcv BANK SELECT” is OFF, the part ignores this 
message. The new bank selection does not become effective until receipt of 
the next Program Change message. The Bank Select MSB selects melody voice, 
SFX voice, or rhythm kit. The MSB allows any channel to be designated for 
rhythm play. Bank Select MSB values are as follows.
       00H:             Melody voice
       01H to 3FH:      not used
       40H:             SFX voice
       41H to 7DH:      not used
       7EH:             SFX kit (SFX voices arranged over keyboard)
       7FH:             Rhythm kit (Rhythm voices arranged over keyboard)

So there is no way to strictly follow all the standards at once. But at the 
same time, the MIDI goal is compatibility, and the same should be the goal 
for FluidSynth. The current behavior of bank# = MSB*128+LSB may be called 
a "Strict mode" that works obnly when songs and soundfonts are specially 
created with the correct numbers, and we can define a "Compatibility mode" 
with the following rules, if we don't know which standard to follow:
1. If MSB is received alone, or with LSB=0, then use MSB as the soundfont bank 
number. This is probably going to work with most GS songs.
2. If LSB is received alone, or with MSB=0, then use LSB as the soundfont bank 
number. This is probably going to work with most XG songs.
In any other case, we need to know if the song/player follows the GM, GS or XG 
standards, either when a SYX message is received, or with a setting.

The proposal is that this "Compatibility mode" should be the default.

Regards,
Pedro

References:

[1] GM
http://www.midi.org/techspecs/gmguide2.pdf

[2] GS
http://en.wikipedia.org/wiki/Roland_GS

[3] XG
http://en.wikipedia.org/wiki/XG_(midi)
http://web.archive.org/web/20060926124939/http://www.yamaha.co.uk/xg/reading/pdf/xg_spec.pdf
http://www.yamahasynth.com/jp/library/lectures/pdf/xgmap.pdf

[4] MIDI specification
http://home.roadrunner.com/~jgglatt/tech/midispec/bank.htm

[5] SF2 specification
http://connect.creativelabs.com/developer/SoundFont/Forms/AllItems.aspx



reply via email to

[Prev in Thread] Current Thread [Next in Thread]