Skip to content

Latest commit

 

History

History
1017 lines (675 loc) · 58.4 KB

File metadata and controls

1017 lines (675 loc) · 58.4 KB

foo_midi User Guide

Welcome to foo_midi. This guide will help you understand how to use the component effectively and get the most out of its features.


Table of Contents

  1. Introduction
  2. Features
  3. Playing files
  4. Configuring
  5. Troubleshooting
  6. FAQs
  7. Reference Material
  8. History
  9. Acknowledgements and Credits
  10. Support

Introduction

foo_midi is a foobar2000 component that adds playback of MIDI files to foobar2000. It's based on foo_midi by kode54.


System Requirements

  • foobar2000 v2.0 or later (32 or 64-bit). foobar2000
  • Tested on Microsoft Windows 10 and later.
  • To use FluidSynth you need to download and install the latest libraries from its GitHub page.

Download foo_midi

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.

Installation

  • Double-click foo_midi.fbk2-component or import foo_midi.fbk2-component using 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.


Features

File Formats

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 Proposed .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.

Players

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.

LibADLMIDI (Built-in, FM Synthesis)

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.

LibOPNMIDI (Built-in, FM Synthesis)

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.

LibEDMIDI aka Emu de MIDI (Built-in, FM Synthesis)

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.

Nuked OPL3 (Built-in, FM Synthesis)

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.

LibMT32EMU (MT-32) (Built-in, FM Synthesis / Wavetable)

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 (Built-in, FM Synthesis)

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.

BASSMIDI (Built-in, Wavetable)

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.

FluidSynth (Optional, Wavetable)

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 (Optional)

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.

VSTi (VST Instruments) (Optional)

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.

CLAP (Optional)

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 Incomplete
Dexed Plug-in modeled on the Yamaha DX7 Supported
Foam 8 Operator FM synthesizer plug-in Supported
Nuked SC-55 CLAP Roland SC-55 emulator Supported
OctaSine Frequency modulation synthesizer plugin Supported
Odin 2 24-voice polyphonic powerhouse Supported
Surge XT Hybrid synthesizer Supported

Playing files

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.

Configuring the output

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.

Looping

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.


Soundfonts

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.

Soundfont Lists (SFList)

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.

Simple format

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
Advanced format

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:

  • fileName specifies 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. BASSMIDI FluidSynth
  • gain specifies 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. optional BASSMIDI
  • channels is an array that contains the MIDI channels that will use the soundfont. optional BASSMIDI
  • patchMappings is an array of mapping objects that allows you to remap samples within a soundfont without modifying the soundfont file. optional BASSMIDI

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.


Metadata

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.

Information fields

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)]


Configuring

The settings of foo_midi are spread over different pages.

MIDI Player

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.

MIDI settings

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.

Filter effects

This setting turns off the reverb and chorus effect and prevents reverb and chorus messages from being sent to the player.

Use LibMT32Emu with MT-32

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.

Use Secret Sauce with GS

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.

Use VSTi with XG

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.

Extra percussion channel

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).

Exclude unsupported EMIDI track designation

This setting will ignore tracks in an Apogee Expanded MIDI (EMIDI) file with Track Designation control change messages (CC 110) with unsupported instrument definitions.

Disable instrument changes

Enabling this setting will remove all Program Change messages from the MIDI stream.

Disable bank changes

Enabling this setting will remove all Control Change bank selection messages from the MIDI stream. (CC 0 and CC 32)


FM Synthesis

This sub-page of MIDI Player contains the settings specific to configuring the FM synthesizer-based players.

LibADLMIDI

ADL Bank

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.

ADL Emulator Core

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
ADL Chips

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.

ADL Soft panning

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.

ADL Bank File

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.

LibOPNMIDI

OPN 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.

OPN Emulator Core

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:

OPN Chips

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.

OPN Soft panning

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.

OPN Bank File

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.

Nuked OPL3

Preset

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.

Soft panning

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.


Paths

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.


Processing

This sub-page of MIDI Player contains the settings to configure the MIDI processing.

Recomposer

Expand loops
Write bar marker
Write SysEx names
Extend loops
Wolfteam loops

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.

Keep muted channels
Include control data

HMI / HMP

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.

Channels

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.

Component settings

Log Level

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.


Wavetable

This sub-page of MIDI Player contains the settings specific to configuring the wavetable-based players.

BASSMIDI settings

Gain

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.

Resampling

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.

Max. Voices

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.

Process reverb and chorus

Allows you to disable the reverb and chorus effect to reduce CPU usage.

Use DLS

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.

Cache status

During playback this will display the amount of memory that the soundfont cache uses.


FluidSynth settings

Interpolation

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.

Max. Voices (FluidSynth)

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.

Process reverb and chorus (FluidSynth)

Allows you to disable the reverb and chorus effect to reduce CPU usage.

Use DLS (Custom)

Enabling this option overrides the built-in DLS support of FluidSynth and uses the same conversion code as the BASSMIDI player.

Dynamic sample loading

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.

Configuration file

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: name spaces value.
  • 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.


LibMT32Emu (Munt) settings

Resampling (LibMT32Emu)

Determines the quality of the sample rate conversion: Fastest, Fast, Good or Best.

Max. Partials

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.

Analog Output Mode

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.
GM Set

Determines which General MIDI configuration is used by the player: Roland or King's Quest 6.

DAC Input Mode

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.
Reverb

Enables or disable reverb generation.

Nice Amp Ramp

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.

Nice Panning

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.

Nice Partial Mixing

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.

Reverse Stereo

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.

Secret Sauce settings

Gain

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.


Troubleshooting

🔧 Work in Progress


FAQs

🔧 Work in Progress

Q: Common question 1
A: Clear, concise answer.

Q: Common question 2
A: Clear, concise answer.


Reference Material

This chapter contains a lot of reference material I consulted during the development of foo_midi.

foobar2000

Windows User Interface

Electronic Music

SoundFonts

MIDI

SFList JSON

IFF

Apogee Expanded MIDI (EMIDI)

HMP / HMI

RMI

XMF (Extensible Music Format)

BASS MIDI

FluidSynth

SC-55

FMMIDI (yuno)

VST

CLAP


History

The history of foo_midi development is available in a separate document.


Acknowledgements and Credits


Support

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)