mmidi is a very optimized midi player written in C using WINAPI.

Table of Contents



This is the original release. It comes with a visualizer and mouse + keyboard controls. It works from NT 3.51 up to the latest. Might also work in wine.


This is just a stripped down version of mmidi. No visualizer, no controls, just text and midi playing. Hardcoded midi device.


This is a special release. It tries to "minimize" the midi by stripping "unnecessary" events. It just works™

MorshuMidi / mmm*

This doesn't belong in the mmidi line because it doesn't use mmidi code. This is written from scratch, everything stripped, very high performance. Also, quite small. Very few CPU cycles per note. The world's fastest available midi player.


This is MorshuMidi with mmidi's visualizer slapped on it. Includes a more advanced scrolling control than mmidi. Includes PFA mode (BPM-based scrolling). World's fastest midi player with built-in visualizer.


This is a derivation of Morshu-mmidi. It includes some extra features at the cost of slightly degraded performance. Still outperforms every other midi player out there.

MMVis / DFB*

This is an attempt to create a Piano From Above clone for the Black MIDI community which aims to look similar to the original while outperforming it.

ExtremeMIDI / extremm*

This is currently the fastest and smallest MIDI player available. The original MorshuMidi was equipped with an extra processing thread, creating ExtremeMIDI. The new thread is capable of offloading the slow note event processing to itself, allowing the main thread to focus more on timing and real-time decoding instead of waiting for the synth to process the incoming event. This edition also comes equipped with smart noteskip, so if note processing takes too long then, and only then will it start skipping notes. The smart noteskip engine tries to keep noteskip disabled as much as possible to try to capture most of the melody as possible. *: these only work with OmniMIDI. Other editions support WinMM and TiMidity++ too.


mmidi controls

- SPACE - play/pause - SHIFT+SPACE - pause without midi reset - UP/DOWN - slow down/speed up playback +- 0.01 - SHIFT+ UP/DOWN - slow down/speed up playback +- 1 - LEFT - set speed to 1x - RIGHT - hold to fast-worward at 10x - SHIFT+RIGHT - hold to fast-forward at ??? too fast speed - SHIFT+LEFT - reset midi (equal to pausing and unpausing) - SHIFT+Q - quit - CTRL-C or BREAK - emergency pause (not compatible with TiMidity++) below is Morshu-mmidi only - ALT+ UP/DOWN - adjust scroll value - SHIFT+ALT+ UP/DOWN - adjust scroll value 100x - ALT+RIGHT - toggle between 0 and -1 scroll speed - ALT+LEFT - set scroll based on current BPM Positive scroll speed means wait value/10000000 seconds per scroll. Negative scroll speed means wait -value * BPM * magic seconds per scroll. Zero scroll is fallback to mmidi behavior and is the most CPU-conservative. Too small bigger-than-zero values are too CPU-intensive. Use -1 or -2 instead.

DFB controls

- CTRL-O - open file - CTRL-W - close player and stop - SPACE - play/pause - UP/DOWN - slow down/speed up playback +- 0.01 - SHIFT+ UP/DOWN - slow down/speed up playback +- 1 - LEFT - set speed to 1x - SHIFT+Q - quit - hold ALT for 1s - open settings - tap ALT - close settings Settings dialog options - UP/DOWN - adjust first option - LEFT/RIGHT - adjust second option - CTRL+ ARROW - adjust value in real time - SHIFT+ ARROW - adjust value in big steps - CTRL+SHIFT+ ARROW - quickly adjust value in real time - M - change piano key design (piano vs. all-same) and change first and second option - O - toggle between 128 key and 256 key - B - toggle "rendering" mode with no audio for use with Bandicam's variable framerate capture option - WS-AD-QE - "rotate" camera left/right, up/down, in/out - IK-JL-UO - "move" camera left/right, up/down, in/out - Y or Z - reset camera to 128key projection

MMVis.ini documentation

[General] VSync - 0 = off | 1 = on | 2 = no VSync on lag (default) WindowMode - 0 = 1024x768 window | 1 = minimized | 2 = maximized (default) | 3 = fullscreen TargetFPS - 0 = no cap or VSync (default) | 1 to 1000 = limit FPS [Visualizer] ScrollMilis - 1 to 10000 = the time it takes in miliseconds for the bottom of the note to reach the piano roll PlayerFPS - 1 to 1000 = a hint to the note catcher to try to run around this FPS for less jittery scrolling LimitRow - 0 = unlimited | unsigned nonzero = limit the amount of notes rendered in a column LimitMax - 0 = unlimited | positive = limit the total rendered notes to this value | negative = -value * 1000 limit KeyboardType - 0 = piano | 1 = white keys for all VisualizerClass - class name or fully qualified name for the visualizer to use (default = NoteVisDFB) [Colors] ColorMode - 0 = mmidi colors with PFA gradient | 1 = PFA colors | 2 = mmidi | 3 = flat PFA Seed - random number to use for color generation using mmidi's RNG code (default = 1) Colors can be set using any of the below syntaxes: - index can be 0 to 255, 00h to FFh, or 0x00 to 0xFF - colors can contain 3 or 4 components (RGB or RGBA) - color components can be separated by spaces, commas, or tabulators - color values are parsed the same way as indexes - gradients can be specified by separating the colors with a | (pipe) Examples: 100=69h, 0x56, 255 64h=#6956FF 33=255,0xFF,FFh,0x40|88h,88h,88h,FFh 31h=#FFFFFF40,#888F