midifluidsynth

fluidsynth soundfont selection not persisting


Fluidsynth sound font is reverting back to last loaded full font when midifile is played. In my case timidity-freepats.sf2 (sfont 2).

fluidsynth version 1.1.10

Here are my steps.

Contents of config file ./nylon-guitar.fs:

load /usr/share/soundfonts/SGM-V2.01.sf2 0
load /usr/share/soundfonts/timidity-freepats.sf2 0
load /usr/share/soundfonts/palm-muted-guitar.sf2 0
select 9 1 128 0
select 0 2 0 24
select 28 3 0 28

Start Fluid Synth:

fluidsynth --audio-driver=alsa -o audio.alsa.device=hw:0 -o synth.verbose=1 -f nylon-guitar.fs

> channels -verbose
chan 0, sfont 2, bank 0, preset 24, Nylon-String Guitar
chan 1, sfont 0, bank 0, preset 0, no preset
chan 2, sfont 0, bank 0, preset 0, no preset
chan 3, sfont 0, bank 0, preset 0, no preset
chan 4, sfont 0, bank 0, preset 0, no preset
chan 5, sfont 0, bank 0, preset 0, no preset
chan 6, sfont 0, bank 0, preset 0, no preset
chan 7, sfont 0, bank 0, preset 0, no preset
chan 8, sfont 0, bank 0, preset 0, no preset
chan 9, sfont 1, bank 128, preset 0, STANDARD 1
chan 10, sfont 0, bank 0, preset 0, no preset
chan 11, sfont 0, bank 0, preset 0, no preset
chan 12, sfont 0, bank 0, preset 0, no preset
chan 13, sfont 0, bank 0, preset 0, no preset
chan 14, sfont 0, bank 0, preset 0, no preset
chan 15, sfont 0, bank 0, preset 0, no preset

All is looking good so far.. Then I play a midi file

 aplaymidi -p 129:0 midifile.midi

Sounds are not as expected because soundfont selection has changed.(channel 9 sfont changed from 1 to 2)

>channels -verbose
chan 0, sfont 2, bank 0, preset 24, Nylon-String Guitar
chan 1, sfont 2, bank 0, preset 24, Nylon-String Guitar
chan 2, sfont 0, bank 0, preset 0, no preset
chan 3, sfont 0, bank 0, preset 0, no preset
chan 4, sfont 0, bank 0, preset 0, no preset
chan 5, sfont 0, bank 0, preset 0, no preset
chan 6, sfont 0, bank 0, preset 0, no preset
chan 7, sfont 0, bank 0, preset 0, no preset
chan 8, sfont 0, bank 0, preset 0, no preset
chan 9, sfont 2, bank 128, preset 0, Percussion **sfont changed 1 -> 2
chan 10, sfont 0, bank 0, preset 0, no preset
chan 11, sfont 0, bank 0, preset 0, no preset
chan 12, sfont 0, bank 0, preset 0, no preset
chan 13, sfont 0, bank 0, preset 0, no preset
chan 14, sfont 0, bank 0, preset 0, no preset
chan 15, sfont 0, bank 0, preset 0, no preset

How would I allow soundfont selection to persist while playing a midifile? I have tried settings such as "-o player.reset-synth=0" and "-o player.reset-synth=1" with no effect.


Solution

  • Internally, fluidsynth places all soundfonts on a stack. Because palm-muted-guitar.sf2 is the last one loaded, it is top most on the stack. When e.g. a program change event occurs on a channel, fluidsynth looks through the soundfont stack from top to bottom, searching for a soundfont that provides the requested bank/preset combination. palm-muted-guitar.sf2 is the first one to provide a percussion instrument on bank 128, preset 0, thus it is selected.

    That said, your MIDI file probably sends a program or bank change event on channel 9. You may edit the MIDI file and get rid of those events. You may edit palm-muted-guitar.sf2 and remove the drum preset. Or you may setup a midi router that discards all program and bank change events on that midi channel.

    player.reset-synth is irrelevant, as you are not using fluidsynth's midi player to play MIDIs.