[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 _______________________________________________ fluid-dev mailing list fluid-dev@nongnu.org http://lists.nongnu.org/mailman/listinfo/fluid-dev