Welcome to foo_midi. This guide will help you understand how to use the component effectively and get the most out of its features.
- Introduction
- Features
- Playing files
- Configuring
- Troubleshooting
- FAQs
- Reference Material
- History
- Acknowledgements and Credits
- Support
foo_midi is a foobar2000 component that adds playback of MIDI files to foobar2000. It's based on foo_midi by kode54.
- foobar2000 v2.0 or later (32 or 64-bit).
- Tested on Microsoft Windows 10 and later.
- To use FluidSynth you need to download and install the latest libraries from its GitHub page.
You can download the component from the foobar2000 Components repository or from the GitHub Releases page.
Important
Updating the component from within foobar2000 does not work.
- Double-click
foo_midi.fbk2-componentor importfoo_midi.fbk2-componentusing the foobar2000 Preferences dialog. Select the File / Preferences / Components menu item, select the Components page and click the Install... button. - Follow the foobar2000 instructions.
Tip
To verify if the installation was successful open the foobar2000 Preferences using the File / Preferences / Components menu item and look for MIDI Player in the Installed components list.
foo_midi can decode the following file formats:
| Name | Extensions | Description |
|---|---|---|
| Standard MIDI File | .MID, .MIDI | MIDI file conforming to the MIDI Association standard |
| Standard MIDI File | .KAR | MIDI file with embedded song lyrics for karaoke |
| Extensible Music Format | .XMF, .MXMF | Format created by the MIDI Association. See also Video Game Music Preservation Foundation (VGMPF). |
| RIFF-based MIDI File | .RMI | Format created by Microsoft and later extended by MIDI.org (an arm of the MIDI Manufacturers Association) to permit the bundling of both MIDI files and Downloadable Sounds (DLS) files. See Library of Congress. foo_midi also implements the more recent SF2 RMIDI Format Extension Specification. |
| Game Music Format |
.GMF | Created by Adventure Soft for their Adventure Game Operating System (AGOS) engine. See Video Game Music Preservation Foundation (VGMPF). |
| MIDI Stream | .MIDS, .MDS | Format created by Microsoft with the release of Windows 95. See Video Game Music Preservation Foundation (VGMPF). |
| Human Machine Interface MIDI P/R | .HMP | Format used by Human Machine Interface's Sound Operating System. See Video Game Music Preservation Foundation (VGMPF). |
| Human Machine Interface | .HMI, .HMQ | Format used by Human Machine Interface's Sound Operating System. It is a revision of the HMP format. See Video Game Music Preservation Foundation (VGMPF). |
| MUS | .MUS | Format created by Paul Radek for his DMX audio library. Used by id Software for Doom and several other games. See Modding Wiki and MUS (DMX). |
| Extended MIDI | .XMI, .XFM | Format used by the Miles Sound System (MSS) for storing game music. Supports multiple songs in one file. See Modding Wiki and Video Game Music Preservation Foundation (VGMPF). |
| Loudness Sound System | .LDS | File created with the Loudness Sound System by Andras Molnar. See Video Game Music Preservation Foundation (VGMPF). |
| Recomposer | .RCP, .R36, .G18, .G36 | Formats used by Recomposer, a popular music editing application on the Japanese PC-98 platform developed by Come-On Music during the 1990s. It became a cult favorite among Japanese composers—most famously ZUN, the creator of the Touhou Project series. |
| Mobile Music File | .MMF | Synthetic-music Mobile Application Format (SMAF). See FileFormat.com. |
| System Exclusive data file | .SYX, .DMP | File containing System Exclusive (SysEx) messages. |
foo_midi implements and supports several players. A player emulates an FM or sample-based synthesizer. The built-in players do not require you to download and install any additional files to play back music. Additional players become available when you install and configure the required support files.
This player uses the libADLMIDI library by Vitaly Novichkov to emulate the Yamaha YM3812 (OPL2) and the Yamaha YMF262 and CT1747 (OPL3) FM synthesis sound chip used in Sound Blaster cards.
Key features are:
- OPL3 Emulation: Supports both 2-operator and 4-operator FM synthesis for rich, expressive tones.
- Custom Instrument Banks: Uses the .wopl format to define FM patches, allowing full control over timbre and instrument behavior.
- Embedded & External Banks: Comes with built-in banks from classic games and tools, plus support for loading custom banks.
- Stereo Sound & Panning: Offers full stereo output with binary panning (left/right).
- Advanced MIDI Support:
- Pitch bend, vibrato, sustain, and sostenuto
- Portamento and brightness control (CC74)
- GS/XG partial compatibility for extended instrument sets
- SysEx support for select GS/XG features
- Automatic Arpeggios: Simulates chords when channel limits are reached.
It can be configured on the MIDI Player / FM Synthesis preferences page.
This player uses the libOPNMIDI library by Vitaly Novichkov to emulate the Yamaha YM2612 (OPN2) and Yamaha YM2608 (OPNA) FM synthesis sound chip—famously used in the Sega Genesis and NEC PC-98 systems.
In addition the Yamaha YM3848 (OPN2C) and the Yamaha YMF276 (OPN2L) used in later models of Fujitsu's FM Towns series are supported.
Key features are:
- Customizable FM Patch Bank: Users can create their own timbre banks using the OPN2 Bank Editor, allowing for unique instrument sounds.
- WOPN Format Support: Instrument banks are stored in .wopn files, which define the FM parameters for each instrument.
- Partial GS/XG Compatibility: Banks can include more than 128 melodic and 80 percussion instruments, supporting extended MIDI standards.
- Automatic Arpeggios: Helps relieve channel pressure by simulating chords with rapid note sequences.
- Brightness Control (CC74): Modulates the FM tone to simulate filter cutoff, mimicking subtractive synthesis behavior.
- Stereo Panning: Full-panning stereo is supported, especially in emulator-based playback.
It can be configured on the MIDI Player / FM Synthesis preferences page.
This player uses the libEDMIDI library by Vitaly Novichkov to emulate the Yamaha YM2413 and VRC7 (OPLL) FM synthesis sound chip, the Sega Programmable Sound Generator (PSG, SN76496) and the Konami SCC.
This player uses the Nuked OPL3 library by Alexey Khokholov (Nuke.YKT) to emulate the Yamaha YMF262 and CT1747 (OPL3) FM synthesis sound chip.
It can be configured on the MIDI Player / FM Synthesis preferences page.
This player uses the LibMT32Emu library to emulate the Roland MT-32, CM-32L and LAPC-I synthesiser modules.
Important
You have to specify the location of the MT-32 or CM-32L PCM and control ROMS on the MIDI Player / Paths preferences page before you can use this player.
It can be configured on the MIDI Player / Wavetable preferences page.
FMMIDI emulates the Yamaha YM2608 (OPNA) FM synthesis sound chip and was created by Yuno in 2004.
Important
FMMIDI requires a text file that specifies the programs or instrument definitions. A default Programs.txt file is installed with the component in component directory. This file can be overriden by selecting a different one on the MIDI Player / Paths preferences page.
This player is a wrapper for the BASSMIDI library by Un4seen. The libraries required to use it are included with the component.
It requires an SF2, SF2Pack or SFZ soundfont to provide the instrument samples. DLS collections can be used when you enable on-the-fly conversion. See Soundfonts.
It can be configured on the MIDI Player / Wavetable preferences page.
This player is a wrapper for the FluidSynth library.
It requires an SF2, SF2Pack, SFZ or SF3 soundfont or a DLS collection to provide the instrument samples. See Soundfonts.
Important
You need to download the libraries from GitHub and configure their path on the MIDI Player / Paths preferences page before FluidSynth becomes available as a player.
It can be configured on the MIDI Player / Wavetable preferences page.
Secret Sauce is a wrapper for the SCCore.dll that comes bundled with Roland’s Sound Canvas VA.
Important
You need to specify the path of the SCCore.dll on the MIDI Player / Paths preferences page before Secret Sauce becomes available as a player.
Virtual Studio Technology (VST®) instruments are plug-ins that provide extra functionality to a digital audio workstation (DAW). foo_midi can use both 32 and 64-bit VST instruments that are virtual synthesizers.
Important
You need to specify location of the VSTi plug-ins on the MIDI Player / Paths preferences page. Any compatible plug-in will be added to the player list with a VSTi prefix.
The CLAP player allows you to use CLAP (CLever Audio Plug-in API) synthesizer plug-ins to render the audio stream. The plug-in must meet a few requirements:
- Implement the Note Ports and Audio Ports extension.
- Have only 1 MIDI input port and no MIDI output ports.
- Support MIDI dialect.
- Have no audio input ports and only 1 audio output port.
- Have only 2 output channels in stereo configuration.
Important
You need to specify location of the CLAP plug-ins on the MIDI Player / Paths preferences page. Any compatible plug-in with extension .dll or .clap will be added to the player list with a CLAP prefix. A CLAP plug-in file can contain multiple plug-in entries.
Here are some examples of CLAP synthesizer plug-ins:
| Name | Description | Status |
|---|---|---|
| Aeolus | Pipe organ emulator using additive synthesis | |
| Dexed | Plug-in modeled on the Yamaha DX7 | |
| Foam | 8 Operator FM synthesizer plug-in | |
| Nuked SC-55 CLAP | Roland SC-55 emulator | |
| OctaSine | Frequency modulation synthesizer plugin | |
| Odin 2 | 24-voice polyphonic powerhouse | |
| Surge XT | Hybrid synthesizer |
To play a supported MIDI file simply add it to foobar2000 playlist and press play.
If the file format is not supported or there's an error in the file an error message will appear in the Playback Error popup and in the foobar2000 console.
By default the LibADLMIDI (Built-in) player is used. You can change the player on the Playback / Decoding / MIDI Player page of the foobar2000 Preferences. The Player droplist contains all available players.
If you have configured VSTi the compatible instruments will added to the list as a player prefixed with VSTi. CLAP plug-ins are prefixed with CLAP.
Note
Don't forget to press the Apply button. The newly selected player will be used when you start a new track.
The Configure button will be enabled if the player has an additional dialog to configure settings specific to that player.
The Sample rate combobox allows you to specify the sample rate the player will be asked to create samples. Select any of the predefined values or enter a custom value between 8000Hz and 192000Hz.
Important
Some players may ignore this setting because player-specific parameters cause it to render at a higher or lower sample rate. F.e. FluidSynth may get a different sample rate from a configuration file or LibMT32EMU will use a different sample rate resulting from a combination of its settings. The actual sample rate being used can be read from the samplerate information field.
Some MIDI files contain track markers to specify which part of the message stream should be played in a loop. These markers are not part of the Standard MIDI Format standard. If the file does not contain markers foo_midi can also play the entire file in a loop.
The following loop markers are supported:
| Name | Description |
|---|---|
| EMIDI / XMI | Used by EMIDI / XMI files with Control Change 116 and 117 as loop markers. This format also can specify the number of times the sequence should be looped. |
| Final Fantasy | Used by Final Fantasy files (starting with Final Fantasy VII) with "loopStart" en "loopEnd" meta events as a marker. |
| LeapFrog | Used by LeapFrog files with Control Change 110 and 111. |
| RPG Maker | Used by RPG Maker files. Control Change 111 marks the loop start. The loop end is always the end of the stream. |
| Touhou | Used by Touhou Project files with Control Change 2 and 4. |
The component supports 6 loop modes that can be selected in the foobar2000 Preferences dialog:
| Type | Description |
|---|---|
| Never loop | The song will be played once ignoring any loop information. |
| Never loop. Use decay time | The song will be played once ignoring any loop information with a customizable decay period at the end for the sound to die down. |
| Loop when detected and fade | The song will be played and any defined loop will be repeated a customizable number of times. At the end of the last loop the song will fade out. |
| Repeat and fade | The complete song will be played and repeated a customizable number of times. At the end of the last repetition the song will fade out. |
| Loop indefinitely when detected | The song will be played and the loop, when detected, will play until stopped. |
| Repeat indefinitely | The complete song will be played and repeated until stopped. |
The Playback droplist specifies how loops are processed during normal playback. The Other droplist determines how loops are processed during other foobar2000 operations such as converting a MIDI file to another format.
The Decay time setting specifies the time in milliseconds that the player will wait before starting to play another track. This allows the last MIDI notes of a stream to decay instead of being abruptly cut when the new track starts playing.
The Loop count setting determines how many times a loop will be played before the song ends.
The Fade-Out time setting specifies the time in milliseconds that the player will start to fade-out the song before starting to play another track.
A soundfont is a file that contains samples of instruments. Players like BASSMIDI and FluidSynth require it to play MIDI files. When more than one soundfont is specified or available the soundfonts will be layered on top of each other with the first soundfont being used as a baseline.
Any of the supported formats can be used (Soundfont lists .sflist, .sf2pack, .sfogg, .sf2, .sf3 and .dls). Each added soundfont replaces the patches with the same bank and program number in the previously added soundfonts.
If the file has an embedded soundfont that file will be extracted and added to the soundfont list. The .RMI file format was designed for that purpose.
Next if a soundfont with the same basename exists in the directory of the MIDI file, the soundfont will be added to the list. F.e. if Example.sf2 will be used to play Example.mid if they exist in the same directory.
Then if a soundfont with the same name as the directory exists, it will be added to the list. F.e. C:\Chip Tunes\Chip Tunes.sf2 will be loaded when MIDI file in C:\Chip Tunes are played if it exists.
Lastly, the global soundfont specified on the Paths preferences page will be added.
Tip
foo_midi will report the soundfonts it uses and in which order in the foobar2000 console if you set the component log level to at least Info level.
The BASSMIDI and FluidSynth player also accept a Soundfont List file. It's an UTF-8 text file that lists the location of the soundfonts that should be used. Any of the soundfont formats (including nested soundfont lists) can be specified.
Important
The soundfonts should be listed with the least specialized soundfont first (the base soundfont) followed by more specialized soundfonts that override the presets of any of the previous ones.
The simple format is just a flat UTF-8 text file where each line contains the location of a soundfont file. Empty lines are ignored. If you specify a only a file name or a relative path foo_midi will look for the file relative to the directory of the list file.
Here's an example:
X:\Simple\SoundFont File.sf2
..\Advanced\SoundFont With Mappings.sf2
The most flexible format is an UTF-8 JSON file with a .sflist or .json extension that allows you to layer the soundfonts that the player will use.
The root object is a soundFonts array that contains 1 or more soundfont objects. A soundfont object can have the following properties:
fileNamespecifies the location of the soundfont. If you specify only a file name or a relative path foo_midi will look for the file relative to the directory of the list file.BASSMIDIFluidSynthgainspecifies the volume gain that will be applied to the samples in the soundfont. The gain value is added to the volume of the soundfont. Positive values increase the volume. Negative values decrease the volume. The default is 0.optionalBASSMIDIchannelsis an array that contains the MIDI channels that will use the soundfont.optionalBASSMIDIpatchMappingsis an array of mapping objects that allows you to remap samples within a soundfont without modifying the soundfont file.optionalBASSMIDI
Here's an example:
{
"soundFonts": [
{"fileName": "/Simple/SoundFont File.sf2"},
{
"fileName": "x:\\Advanced\\SoundFont With Mappings.sf2",
"gain": 6.0,
"channels": [1,3,5],
"patchMappings": [
{"source": {"bank": 0, "program": 1}, "destination": {"bank": 0, "program": 20}},
{"source": {"bank": 20, "program": 5}, "destination": {"bank": 0, "program": 5}}
]
},
{
"fileName": "../Another Simple/SoundFont File.sf2",
"patchMappings": [
{"destination": {"bank": 1}}
]
},
{"fileName": "/SoundFont List.sflist.json"},
{
"fileName": "/Patch.sfz",
"patchMappings": [
{"destination": {"bank": 0, "program": 2}},
{"destination": {"bank": 0, "program": 3}}
]
}
]
}For a more detailed explanation of the properties please consult the documentation about BASS_MIDI_FONTEX.
foo_midi supports the following tags:
| Name | Contents |
|---|---|
| midi_preset | The settings that will be used to play the file, overriding any settings selected in Preferences. |
| midi_sysex_dumps | MIDI SysEx messages that will be sent to the player everytime playback starts. |
foo_midi provides you with two types of information fields.
Available in rest and during playback:
| Name | Contents |
|---|---|
| midi_format | The MIDI format of the file: 0 = single track, 1 = multiple tracks, 2 = multiple songs |
| midi_tracks | The number of tracks in the file |
| midi_channels | The number of channels used in the file |
| midi_ticks | The duration of the file in MIDI ticks |
| midi_type | The MIDI flavor: MT-32, GM, GM2, GS, XG. Defaults to GM when the flavor can't be detected |
| midi_loop_start | The start of a loop in MIDI ticks |
| midi_loop_end | The end of a loop in MIDI ticks |
| midi_loop_start_ms | The start of a loop in milliseconds |
| midi_loop_end_ms | The end of a loop in milliseconds |
| midi_lyrics_type | The type of lyrics found in the file. Currently only Soft Karaoke is recognized. |
| midi_hash | Unique fingerprint of the file used by the foobar2000 media library. |
| midi_embedded_soundfont | The type of the soundfont embedded in the file (if any). Can be SF a SoundFont 1.0-2.x-3.x bank or DLS for a Downloadable Sounds collection. |
Tip
You can format midi_loop_start_ms and midi_loop_endt_ms to hh:mm notation and use it as a custom column in playlist View like this:
[$num($div($info(MIDI_LOOP_START_MS),60000),2):$num($div($mod($info(MIDI_LOOP_START_MS),60000),1000),2)]
[$num($div($info(MIDI_LOOP_END_MS),60000),2):$num($div($mod($info(MIDI_LOOP_END_MS),60000),1000),2)]
Only available during playback:
| Name | Contents |
|---|---|
| samplerate | The sample rate currently being used to generate the samples. This can be different from sample rate specified in the preferences. |
| midi_player | The name of the MIDI player |
| midi_player_ext | The name of the extension, if any, the MIDI player is using. LibADLMIDI and LibOPNMIDI use it to report the emulator core they are using. The VSTi player and the CLAP player report the plug-in they have loaded. |
| midi_active_voices | The number of active voices used by a wave table player |
| midi_peak_voices | The highest number of voices used by a wave table player |
| midi_extra_percussion_channel | The number of the MIDI channel being used as an extra percussion channel (1-based). See MIDI preferences. |
Tip
You can configure the foobar2000 status bar on the Display / Default User Interface preferences page. Here's an example of how to use the information fields:
%samplerate%Hz, [, "$info(midi_player)"][, "$info(midi_player_ext)"][, $info(midi_active_voices) voices '(peak ' $info(midi_peak_voices)')'][, Extra percussion channel $info(midi_extra_percussion_channel)]
The settings of foo_midi are spread over different pages.
The main preferences page is called MIDI Player and can be found in the Playback / Decoding section of the Preferences dialog. These settings in general control the playback of MIDI files. Some of the settings have already been explaing in the Playing files section.
For an explanation of the loop settings refer to Looping.
You can force a player to start playback using a particular flavor of MIDI. The term groups the common MIDI specifications and particular model specific configurations.
Note
MIDI files may contain SysEx messages that overrule the flavor you specify.
| Name | Purpose |
|---|---|
| Default | Same as SC88. |
| GM | General MIDI 1 specification. A GM System On SysEx is sent before playback starts. |
| GM2 | General MIDI 2 specification. A GM2 System On SysEx is sent before playback starts. |
| GS SC‑55 | General Sound specification with Roland SC-55 initialization. |
| GS SC‑88 | General Sound specification with Roland SC-88 initialization. |
| GS SC‑88Pro | General Sound specification with Roland SC-88Pro initialization. |
| GS SC‑8820 | General Sound specification with Roland SC-8820 initialization. |
| XG | Extended General MIDI specification created by Yamaha |
| None | The player starts playing with its default configuration. Please the consult the player specific documentation for more information. |
This setting turns off the reverb and chorus effect and prevents reverb and chorus messages from being sent to the player.
When you enable this setting the selected player will be ignored and LibMT32Emu will always be used whenever an MT-32 MIDI file is played.
When you enable this setting the selected player will be ignored and Secret Sauce will always be used whenever a GS MIDI file is played.
This setting will ignore the selected player and use the VSTi specified on the MIDI Player / Paths page whenever an XG MIDI file is played. Typically the Yamaha S-YXG50 VSTi is configured there.
This setting will assign channel 16 as an extra percussion channel whenever a track is found in the MIDI file that contains metadata of type Text, Trackname or Instrumentname that contains the word drum (case-insensitive).
This setting will ignore tracks in an Apogee Expanded MIDI (EMIDI) file with Track Designation control change messages (CC 110) with unsupported instrument definitions.
Enabling this setting will remove all Program Change messages from the MIDI stream.
Enabling this setting will remove all Control Change bank selection messages from the MIDI stream. (CC 0 and CC 32)
This sub-page of MIDI Player contains the settings specific to configuring the FM synthesizer-based players.
The library provides many built-in FM patches from various known PC games using AIL (Miles Sound System), DMX, HMI (Human Machine Interfaces) or Creative IBK (Instrument Bank). With this setting you select the bank that will be used during playback.
To render the MIDI file a synthesizer chip is emulated. These are the eumlators that the current version of the library supports:
| Name | Description |
|---|---|
| Nuked OPL3 v1.8 | Slowest but most accurate |
| Nuked OPL3 v1.7.4 | Slow, slightly less accurate |
| DOSBox | Fast, mostly accurate |
| Opal OPL3 | Only suitable for Reality Adlib Tracker tunes |
| Java OPL3 | Written by Robson Cozendey |
| ESFMu | ESS ESFM, an enhanced 72-operator OPL3-compatible clone, written by Nuke.YKT and Kagamiin~ |
| MAME OPL2 | Written by Jarek Burczynski and Tatsuyuki Satoh |
| YMFM OPL2 | Written by Aaron Giles |
| YMFM OPL3 | Written by Aaron Giles |
| Nuked OPL2 LLE | Low-Level Emulator, CPU heavy |
| Nuked OPL3 LLE | Low-Level Emulator, CPU heavy |
You can specify the number of chips (1 to 100) that are available to the player. Emulation of multiple chips extends polyphony limits when rendering a MIDI file.
Enables or disables soft panning.
By default the library uses binary panning where a sound is either fully left, fully right, or center. It's a simple on/off stereo placement.
Soft panning (also called full-panning stereo) allows for gradual placement of sound across the stereo field, enabling smoother and more realistic spatial positioning of instruments.
A bank can be loaded from a file in the WOPL format. You can create a bank using Wohlstand's OPL3 Bank Editor. The loaded bank will take precendence over the select bank.
The library provides a couple of built-in instrument or patch banks. With this setting you select the bank that will be used during playback.
To render the MIDI file a synthesizer chip is emulated. These are the eumlators that the current version of the library supports:
| Name | Description |
|---|---|
| MAME OPNA (YM2608) | Accurate and fast on slow devices |
| MAME OPN2 (YM2612) | Accurate and fast on slow devices |
| Nuked OPN2 (YM2612) | Very accurate, requires a powerful CPU |
| Nuked OPN2C (YM3438) | Very accurate, requires a powerful CPU |
| GENS/GS II OPN2 (YM2612) | GENS 2.10 emulator. Very outdated and inaccurate, but fastest. |
| Neko Project II Kai OPNA (YM2608) | Neko Project 2 YM2608 emulator. Semi-accurate, but fast on slow devices. |
| YMFM OPNA (YM2608) | YMFM emulators written by Aaron Giles |
| YMFM OPN2 (YM2612) | YMFM emulators written by Aaron Giles |
| Nuked OPNA (YM2608), Low-level | Extra heavy but very accurate variant of Nuked OPN2 (YM2608) |
| Nuked OPN2 (YM2612), Low-level | Extra heavy but very accurate variant of Nuked OPN2 (YM2612) |
| Nuked OPN2C (YM3438), Low-level | Extra heavy but very accurate variant of Nuked OPN2 (YM3438) |
| Nuked OPN2L (YMF276), Low-level | Extra heavy but very accurate variant of Nuked OPN2 (YMF276) |
The following emulator cores have been deprecated in the current version of the library and are no longer available:
- Genesis Plus GX
- PMDWin OPNA
You can specify the number of chips (1 to 100) that are available to the player. Emulation of multiple chips extends polyphony limits when rendering a MIDI file.
Enables or disables soft panning.
By default the library uses binary panning where a sound is either fully left, fully right, or center. It's a simple on/off stereo placement.
Soft panning (also called full-panning stereo) allows for gradual placement of sound across the stereo field, enabling smoother and more realistic spatial positioning of instruments.
A bank can be loaded from a file in the WOPN format. You can create a bank using Wohlstand's OPN2 Bank Editor. The loaded bank will take precendence over the select bank.
Allows you to select one of the built-in presets. A preset is a combination of an emulator code (Doom, Windows or Apogee) and a patch bank.
Enables or disables soft panning.
By default the library uses binary panning where a sound is either fully left, fully right, or center. It's a simple on/off stereo placement.
Soft panning (also called full-panning stereo) allows for gradual placement of sound across the stereo field, enabling smoother and more realistic spatial positioning of instruments.
This sub-page of MIDI Player contains the various directory and file paths that some of the players require to work.
| Name | Description |
|---|---|
| VSTi Plug‑Ins | The location of the VSTi plug-ins. The root and all subdirectories will be searched for compatible plug-ins. |
| VSTi XG Plug‑In | The location of the VSTi plug-in that will be used when the Use VSTi with XG setting is enabled. |
| CLAP Plug‑Ins | The location of the CLAP plug-ins. The root and all subdirectories will be searched for compatible plug-ins. |
| Soundfont | The location of the soundfont to be used by BASSMIDI and FluidSynth. |
| MT‑32 ROMs | The location of the MT-32 ROM files to be used by LibMT32Emu. |
| Secret Sauce | The location of the Secret Sauce library. |
| FluidSynth | The location where the FluidSynth libraries can be found. |
| FluidSynth Config | The location of the FluidSynth configuration file. |
| FMMIDI Programs | The location of the file containing the FMMIDI programs. Leave this empty to use the file included in the component directory. |
Warning
The VSTi Plug‑Ins path setting can contain multiple paths separated by a pipe (|) character (e.g. "c:\VSTi\x86|d:\VSTi\x64"). Make sure there are no unwanted spaces at the beginning or end of the path names.
This sub-page of MIDI Player contains the settings to configure the MIDI processing.
Wolfteam loops refer to musical sequences used in games developed by Wolfteam, a Japanese game studio known for titles on platforms like the Sharp X68000.
HMI and HMP file have no way to indicate the tempo at which they should be played. This settings allows you to modify the tempo by entering the number of beats per minute (bpm). The default value is 160 bpm.
This setting allows you disable and re-enable any of the 16 MIDI channels per port. Use the Port number slider to select the port. Click the button corresponding the channel to disable or re-enable it. These settings become immediately active during playback.
A few shortcut buttons are available to assist in the selection:
| Name | Description |
|---|---|
| All | Enables all channels on all ports |
| None | Disables all channels on all ports |
| 1‑10 ^*^ | Toggles channels 1 through 10 on all ports |
| 11‑16 ^*^ | Toggles channels 11 through 16 on all ports |
^*^ See MSKB article 84817 Using the MIDI Mapper for an explanation of the 1‑10 and 11‑16 buttons.
Allows you to control the messages the component will write to the foobar2000 console.
Warning
The Debug and Trace levels may generate a lot of technical output.
This sub-page of MIDI Player contains the settings specific to configuring the wavetable-based players.
The gain value can be used to tweak the volume of the soundfont. Positive values increase the volume. Negative values decrease the volume. The valid range is -1.0 (Silence) to 2.0. The default is 0 (No gain).
Note
This value is used by the base soundfont and soundfonts in a JSON soundfont list that not specify their own gain value. Soundfonts in a text soundfont list ignore this value since they have no way to override it.
Allows you to select the interpolation algorithm that BASSMIDI will use when resampling. The samples in a soundfont will usually need to be played at rates that are different to their original rates. The linear interpolation option uses less CPU, but the sinc interpolation gives better sound quality (less aliasing), with the quality and CPU usage increasing with the number of points.
Allows you to specify the maximum number of simultanious voices or samples that BASSMIDI will use. The number of active voices currently active can be reading the value of the midi_active_voices information field. The more voices, the more CPU will be used.
Allows you to disable the reverb and chorus effect to reduce CPU usage.
Enabling this option allows the BASSMIDI player to play MIDI files with a DLS collection anywhere an SF2 soundfont is allowed. The DLS collection is converted to an SF2 bank on demand.
During playback this will display the amount of memory that the soundfont cache uses.
Allows you to specify the synthesis interpolation method that FluidSynth uses.
Note
Please read the remarks in the FluidSynth documentation when selecting 7th Order Sinc interpolation.
Allows you to specify the maximum number of simultanious voices or samples that FluidSynth will use. The number of active voices currently active can be reading the value of the midi_active_voices information field. The more voices, the more CPU will be used.
Allows you to disable the reverb and chorus effect to reduce CPU usage.
Enabling this option overrides the built-in DLS support of FluidSynth and uses the same conversion code as the BASSMIDI player.
Enabling this option will make FluidSynth load and unload samples from memory whenever presets are being selected or unselected for a MIDI channel. Don't enable this option for normal playback as it may cause timing issues.
FluidSynth has many more settings to configure. You can use a text file to change those settings. The file must have the following format:
- Empty lines and comment lines starting with a '#' character are ignored.
- Each line contains one setting in the following format:
namespacesvalue. - Settings with invalid values are ignored.
- Any valid setting will override the foo_midi defaults and the values set in the Preferences.
Refer to FluidSettings for the available settings.
Specify the path to the file on the MIDI Player / Paths preferences page. An example file is included in the component directory.
Determines the quality of the sample rate conversion: Fastest, Fast, Good or Best.
Allows you to override the maximum number of partials playing simultaneously within the emulation session.
In the MT-32's Linear Arithmetic (LA) synthesis, each tone is made up of up to four partials. These partials can be PCM samples or synthesized waveforms, and they are mixed together to form a complete sound.
The original MT-32 had analog components (like filters and amplifiers) that subtly colored the sound. This setting affects the final coloration and warmth of the sound, especially when aiming for an authentic retro audio experience.
It is especially important if you're trying to replicate the exact sound of classic DOS games or MIDI compositions as they were heard in the late '80s and early '90s.
| Name | Description |
|---|---|
| Digital Only | Only the digital path is emulated. The output samples correspond to the digital signal at the DAC entrance. |
| Coarse | Coarse emulation of the LPF circuit. High frequencies are boosted, sample rate remains unchanged. |
| Accurate | Finer emulation of the LPF circuit. Output signal is upsampled to 48 kHz to allow emulation of audible mirror spectra above 16 kHz, * which is passed through the LPF circuit without significant attenuation. |
| Oversampled | Same as Accurate but the output signal is 2x oversampled, i.e. the output sample rate is 96 kHz. This makes subsequent resampling easier. Besides, due to nonlinear passband of the LPF emulated, it takes fewer number of MACs compared to a regular LPF FIR implementations. |
Determines which General MIDI configuration is used by the player: Roland or King's Quest 6.
The DAC (Digital-to-Analog Converter) in the original MT-32 had specific limitations and nonlinearities.
The library emulates this behavior, and the DAC Input Mode determines how audio is prepared before it's "sent" to the virtual DAC.
| Name | Description |
|---|---|
| Nice | Produces samples at double the volume, without tricks. Higher quality than the real devices. |
| Pure | Produces samples that exactly match the bits output from the emulated LA32. Much less likely to overdrive than any other mode. Half the volume of any of the other modes. |
| Generation 1 | Re-orders the LA32 output bits as in early generation MT-32s. |
| Generation 2 | Re-orders the LA32 output bits as in later generations MT-32s. |
Enables or disable reverb generation.
On real Roland MT-32 hardware, sudden changes in volume or expression can cause abrupt "jumps" in amplitude. This setting makes these changes gradual, resulting in a more natural and musical sound. This is particularly useful when MIDI tracks include quick volume fades or expression shifts.
Note
This is a quality improvement that sacrifices emulation accuracy.
The original MT-32 had some idiosyncrasies in how it handled panning. This feature mimics those subtleties for a more authentic sound. Instead of abrupt left/right shifts when a MIDI track changes pan values, "Nice Panning" makes these transitions more gradual and natural. Instruments sound more like they're moving across a stereo field, rather than jumping from one side to the other.
The original MT-32 had subtle nonlinearities and quirks in how it mixed partials. This setting mimics those characteristics. It ensures that the partials are mixed in a way that avoids harsh digital artifacts or unnatural volume spikes. Especially noticeable in complex tones like orchestral instruments or layered synths, where multiple partials interact.
Early MT-32 units (especially those with ROM version 1.07 or earlier) are known to have reversed stereo channels compared to modern expectations.
Enable this setting to reverse the channels.
The gain value can be used to tweak the amplitude of the generated samples. Positive values increase the volume. Negative values decrease the volume. The valid range is -1.0 (Silence) to 2.0. The default is 0.0 (No gain).
Warning
The gain is added in post processing. Clipping will occur if you set this value too high.
🔧 Work in Progress
🔧 Work in Progress
Q: Common question 1
A: Clear, concise answer.
Q: Common question 2
A: Clear, concise answer.
This chapter contains a lot of reference material I consulted during the development of foo_midi.
- Desktop App User Interface
- Windows User Experience Interaction Guidelines
- Windows Controls
- Control Library
- Resource-Definition Statements
- Visuals, Layout
- Introduction to Computer Music: MIDI, Jeffrey Hass
- MIDI is the language of the gods, Teragon Audio
- Comparison of MIDI standards, Wikipedia
- Yamaha XG Programming, Studio 4 All
- The Unofficial Yamaha Keyboard Resource Site Articles
- Recording Blogs
- Notes about MIDI Specifications, Goffredo Haus, IEEE Computer Society Press, Fall 1995
- Somascape
- RIFF RMI
- Embedded Soundfonts
- Media Type
- MIDI Manufacturers Association Tech Specs & Info
- Library of Congress
- FileFormats
- MultimediaWiki
- Introducing the Interactive XMF Audio File Format
- XmfExtractor
- FluidSynth User Manual
- FluidSynth SoundFont
- FluidSynth Documentation
- Development
- FluidSynth GitHub
- FluidSynth Developer Documentation
- EmuSC, GitHub
- Nuked SC-55, Nuke-YKT GitHub
- Nuked SC-55, J.C. Moyer GitHub
- Nuked SC-55, Falcosoft GitHub
- Nuked SC-55 GUI Float, GitHub
- Hosts
- How To Make Your Own VST Host
VST 2 - MrsWatson, A command-line VST plugin host
VST 2 - Steinberg AudioHost
VST 3 - A Minimal VST 3 Host in C
VST 3 - How To Instantiate a VST 3 Plug-in in Code?
VST 3 - EasyVst
VST 3
- How To Make Your Own VST Host
- Plug-Ins
- Synthesizers
- Yamaha S-YXG50 Portable VSTi v1.0.0
VST 2 - OPL3GM_VSTi
VST 2 - Firefly-Synth, Sjoer van Kreel, Semi-modular synthesizer and FX plugin for Windows, Linux and Mac, VST3 and CLAP
VST 3 - Firefly-Synth 2, Sjoer van Kreel, Yet another VST3 and CLAP plugin, Windows, Linux, and MacOS
VST 3 - FluidSynth VST
VST 3 - OS-251, utokusa
VST 3 - RdPiano
VST 3 - Virtual JV, JV-880 emulator as VST/AU plugin
VST 3 - VSTSID, VST plugin version of the WebSID Commodore 64 synthesizer
VST 3
- Yamaha S-YXG50 Portable VSTi v1.0.0
- Synthesizers
- Development
- CLAP Audio Software Database
- Development
- Hosts
- Plug-ins
- Dexed, GitHub
- Nuked SC-55 CLAP, Roland SC-55 emulator, John Novak
- Nuked SC-55, Vogons announcement, 2024-03-14
- Odin 2, 24-voice polyphonic powerhouse, The WaveWarden, GitHub
- SW10-Plug, Casio SW-10
- JV880-Juce
- Mini-JV880
- OctaSince, Joakim Frostegård
- Development
- CLAP Plug-ins, Free-Audio
The history of foo_midi development is available in a separate document.
- Peter Pawlowski for the foobar2000 audio player.
- kode54 for the original foo_midi component.
- Un4seen Developments for the BASS audio library.
- Munt for a multi-platform software synthesiser emulating pre-GM MIDI devices such as the Roland MT-32, CM-32L, CM-64 and LAPC-I.
- Alexey Khokholov (Nuke.YKT) for Nuked OPL3.
- Vitaly Novichkov for libADLMIDI, libOPNMIDI and libEDMIDI.
- Mitsutaka Okazaki for Emu de MIDI.
- arch21 for testing and pointing me in the right direction with Secret Sauce and SF3 SoundFonts.
- Tom Moebert for FluidSynth.
- Valley Bell for MidiConverters.
- Jean-loup Gailly and Mark Adler for zlib.
- Spessasus for testing, advice and SpessaSynth.
- Zoltán Bacskó for testing, advice and MIDI Player.
- Murachue for MMFTool.
- Yoshio Uno (yuno) for fmmidi.
- John Novak for Nuked-SC55-CLAP.
For further assistance:
🌐 Home page: https://github.com/stuerp/foo_midi
🌐 Issue tracker: https://github.com/stuerp/foo_midi/issues
🌐 Forum: Hydrogenaudio foo_midi (foobar v2.0)
