Skip to content
Tom M. edited this page Aug 2, 2025 · 34 revisions

This is a list of MIDI events that fluidsynth handles by default. That "handling" is either given by

  • the SoundFont spec, or
  • the General MIDI standard.

While the explanations in the SoundFont spec are very precise in terms of the intended audio-synthetic articulation, the descriptions in the MIDI standard are very vague when it comes to sound articulation. Thus you cannot expect that fluidsynth behaves in a certain way (which you may know from other synths) just because you send some MIDI CCs.

In order to control those "underspecifed" aspects of the sound synthesis (like ADSR, low pass filter cutoff & resonance, tremolo & vibrato depth, etc.) custom SoundFont modulators must be used! The SoundFont spec wants the SoundFont designer to define those modulators in the SoundFont file itself. Doing so will give you great portability between any SF2 compliant synth, i.e. you would get the same sound articulation when sending your custom CCs to any SF2 compliant synth to trigger your custom effects. Unfortunately, defining those modulators must be done for every single instrument or preset in the SoundFont, which can be tiresome and error-prone. Alternatively, you can use fluidsynth's API for manipulating default modulators (see fluid_synth_add_default_mod() and fluid_synth_remove_default_mod() resp.). This will allow you to insert or remove your own custom modulators, which will then affect all loaded SoundFonts equally. However, this technique is not portable and limited to fluidsynth.

Legend

โœ”๏ธ Implemented according to MIDI or SoundFont spec and usable by default

โœ… Partially or customly implemented and usable by default

โš ๏ธ Attention, this may require special setup of fluidsynth to be usable by default

โŒ Not handled by default, but usable via custom SoundFont modulators

MIDI Message Implementation Chart

MIDI Message Implementation Status
NOTE_OFF โœ”๏ธ
NOTE_ON โœ”๏ธ
CONTROL_CHANGE โœ… See related table below.
MIDI_SET_TEMPO โœ”๏ธ
PROGRAM_CHANGE โœ”๏ธ
CHANNEL_PRESSURE โœ”๏ธ SF2 default modulator
KEY_PRESSURE โŒ
PITCH_BEND โœ”๏ธ SF2 default modulator
MIDI_SYSTEM_RESET โœ”๏ธ

MIDI Control Change Implementation Chart

Note that unless otherwise documented, CCs are interpreted individually, i.e. as 7-bit values.

MIDI CC Implementation Status
(000) Bank Select โœ”๏ธ Interpretation of MSB and LSB depends on synth.midi-bank-select
(001) Modulation Wheel โœ”๏ธ SF2 default modulator
(002) Breath Controller โš ๏ธ Usable in breathmode, see PolyMono documentation
(004) Foot Controller โŒ
(005) Portamento Time โœ”๏ธ MSB and LSB (i.e. 14-bit value!), see PolyMono documentation
(006) Data Entry โœ”๏ธ MSB and LSB (i.e. 14-bit value!).
(007) Channel Volume โœ”๏ธ SF2 default modulator
(008) Balance โœ… non-standard default SF2 modulator
(010) Pan โœ”๏ธ SF2 default modulator
(011) Expression โœ”๏ธ SF2 default modulator
(064) Sustain Pedal โœ”๏ธ See Sostenuto documentation
(065) Portamento Switch โœ”๏ธ See PolyMono documentation
(066) Sostenuto Pedal โœ”๏ธ See Sostenuto documentation
(068) Legato Switch โœ”๏ธ See PolyMono documentation
(072) Sound Controller 3 (default: Release Time) โŒ
(073) Sound Controller 4 (default: Attack Time) โŒ
(074) Sound Controller 5 (default: Brightness) โŒ
(084) Portamento Control (PTC) โœ”๏ธ See PolyMono documentation
(091) Effects 1 Depth (Reverb Send Level) โœ”๏ธ SF2 default modulator
(092) Effects 2 Depth (Tremolo Depth) โŒ
(093) Effects 3 Depth (Chorus Send Level) โœ”๏ธ SF2 default modulator
(094) Effects 4 Depth (Celeste (Detune) Depth) โŒ
(095) Effects 5 Depth (Phaser Depth) โŒ
(098) NRPN LSB โœ”๏ธ See related table below
(099) NRPN MSB โœ”๏ธ See related table below
(100) RPN LSB โœ… See related table below
(101) RPN MSB โœ… See related table below
(120) All Sound Off โœ”๏ธ
(121) Reset All Controllers โœ”๏ธ
(121) Local Control โœ”๏ธ Ignored, because not applicable
(123) All Notes Off โœ”๏ธ
(124) Omni Mode Off โœ”๏ธ See PolyMono documentation
(125) Omni Mode On โœ”๏ธ See PolyMono documentation
(126) Mono Mode โœ”๏ธ See PolyMono documentation
(127) Poly Mode โœ”๏ธ See PolyMono documentation

RPN Control Change Implementation Chart

RPN CC Implementation Status
(000) RPN_PITCH_BEND_RANGE โœ”๏ธ SF2 default modulator
(001) RPN_CHANNEL_FINE_TUNE โœ”๏ธ
(002) RPN_CHANNEL_COARSE_TUNE โœ”๏ธ
(003) Tuning Program Select โœ”๏ธ
(004) Tuning Bank Select โœ”๏ธ
(005) Modulation Depth Range โŒ Not yet implemented
(006) MPE Configuration Message โŒ Not yet implemented

NRPN Control Change Implementation Chart

SF2 NRPNs

โœ”๏ธ All SF2 generators can be altered with NRPN Control Change messages. See section 8.1.2 in the spec.

AWE32 NRPNs

As of version 2.4.5, fluidsynth also supports NPRN control found in the AWE32. Most of it is implemented according to the "AWE32 Developer's Information Pack", which however was found to be quite buggy, so fluidsynth's behavior may differ from that of real SoundBlaster card. Unless otherwise noted, the data value received by any of these NRPNs overrides the initial generator value of the corresponding SF2 generator.

NRPN MSB NRPN LSB Implementation Status
127 0 โœ… overrides Modulation LFO delay generator
127 1 โœ… overrides Modulation LFO frequency generator
127 2 โœ… overrides Vibrato LFO delay generator
127 3 โœ… overrides Vibrato LFO frequency generator
127 4 โœ… overrides Modulation envelope delay generator
127 5 โœ… overrides Modulation envelope attack generator
127 6 โœ… overrides Modulation envelope hold generator
127 7 โœ… overrides Modulation envelope decay generator
127 8 โœ… overrides Modulation envelope sustain generator
127 9 โœ… overrides Modulation envelope release generator
127 10 โœ… overrides Volume envelope delay generator
127 11 โœ… overrides Volume envelope attack generator
127 12 โœ… overrides Volume envelope hold generator
127 13 โœ… overrides Volume envelope decay generator
127 14 โœ… overrides Volume envelope sustain generator
127 15 โœ… overrides Volume envelope release generator
127 16 โš ๏ธ treated as if a regular MIDI Pitch Wheel event is received
127 17 โœ… overrides Modulation LFO to pitch generator
127 18 โœ… overrides Vibrato LFO to pitch generator
127 19 โœ… overrides Modulation envelope to pitch generator
127 20 โœ… overrides Modulation LFO to volume generator
127 21 โœ”๏ธ overrides Filter cutoff generator, ranges verified through listening tests (AWE32 documentation is incorrect)
127 22 โœ”๏ธ overrides Filter Q generator, ranges verified through listening tests (AWE32 documentation is incorrect)
127 23 โœ… overrides Modulation LFO to filter cutoff generator
127 24 โœ… overrides Modulation envelope to filter cutoff generator
127 25 โš ๏ธ received data value is transformed by default SF2 chorus modulator before applied to chorus generator
127 26 โš ๏ธ received data value is transformed by default SF2 reverb modulator before applied to reverb generator

Roland NRPNs

Additionally, as of version 2.5.0, fluidsynth maps the following Roland NRPNs to regular CCs, allowing them to be overridden in a Soundfont by using modulators. The mapping was implemented according to the SC8850 owner's manual pages 227 and 228.

NRPN MSB NRPN LSB Implementation Status
0x01 0x08 โœ… mapped to CC 76 (vibrato rate)
0x01 0x09 โœ… mapped to CC 77 (vibrato depth)
0x01 0x0A โœ… mapped to CC 78 (vibrato delay)

SysEx Messages

Note: fluidsynth only processes those SysEx messages, if the "device-id" in the SysEx message matches the synth.device-id setting the synth has been initialized with! Broadcast SysEx messages are always processed.

SysEx Implementation Status
MIDI Tuning Standard โœ”๏ธ See enum midi_sysex_tuning_msg_id for supported messages
GS DT1 โœ… Only rhythm / melodic part selection messages are supported (since fluidsynth 2.2.0, see the "Patch Part parameters section in SC-88Pro/8850 owner's manual")
GM/GM2 mode on โœ”๏ธ
GS reset โœ”๏ธ
XG reset โœ”๏ธ

๐ŸŽน FluidSynth

๐Ÿ“ฅ Get FluidSynth

๐Ÿ“š Documentation

Clone this wiki locally