A native GUI MIDI player with SF2 soundfont synthesis.
Built with Rust, using hardware-accelerated rendering (Direct2D or wgpu) and a custom sequencer for low-latency audio playback.
- SF2 Soundfont Synthesis -- Real-time MIDI rendering via a rustysynth fork with cubic interpolation, FDN reverb, multi-voice chorus, SVF filter, and SF2 modulator support
- Multi-SF2 Bundles -- Load multiple SF2 files with per-channel routing; configure mode-specific bundles (GM/GS/XG/GM2) that auto-switch on detection
- Piano Roll -- Scrolling note visualization with per-channel coloring; horizontal (default) and vertical (step-sequencer style) modes
- Track List -- Left panel with two view modes: Default (compact 2-line per channel with Prg/Vol/Pan/Exp) and Detail (per-track tree)
- MIDI Mode Detection -- Auto-detects GM/GS/XG/GM2 from SysEx reset messages and bank select patterns; manual override with
1-4keys - Per-Track Mute -- Mute/unmute individual channels during playback
- Seek -- Forward/backward seeking with full state reconstruction (program changes, control changes, pitch bends)
- Custom Fonts -- Load
.ttf/.otf/.ttcfont files via settings - File Browser -- Built-in file browser for selecting MIDI and SF2 files; drive root navigation with
/or\ - Settings Persistence -- Window geometry, volume, display mode, font, and soundfont paths saved to
settings.toml - Volume Control -- Application volume (
+/-) multiplied with MIDI master volume (SysEx)
| Key | Action |
|---|---|
Space |
Play / Pause |
S |
Stop |
Left / Right |
Seek -5s / +5s |
Up / Down |
Cursor Up / Down |
M |
Mute / Unmute track |
P |
Toggle right panel (Monitor / Piano Roll) |
V |
Toggle piano roll orientation |
E |
Toggle track view (Default / Detail) |
+ / - |
Volume Up / Down |
[ / ] |
Zoom Out / In |
Tab |
Cycle focus panel |
O |
Open MIDI file |
F |
Open SF2 file |
D |
Reset SF2 to default |
1-4 |
Set mode (GM / GS / XG / GM2) |
? |
Toggle help overlay |
Q / Esc |
Quit |
Two rendering backends are available, selected at compile time via Cargo feature flags:
| Feature | Backend | Platform | Default |
|---|---|---|---|
wgpu-backend |
wgpu + glyphon | Cross-platform (Metal / DX12 / Vulkan) | Yes |
d2d |
Direct2D / DirectWrite | Windows only | -- |
# Default (wgpu) -- works on macOS, Windows, and Linux
cargo build --release
# Windows only (D2D)
cargo build --release --no-default-features --features d2d- Rust 1.70+ (edition 2021)
- D2D backend: Windows 10 or later
- wgpu backend: Vulkan, Metal, or DX12 capable GPU
# Launch with file browser
ump
# Open a MIDI file directly
ump path/to/file.mid
# Specify a soundfont
ump path/to/file.mid --sf2 path/to/soundfont.sf2Settings are stored at the platform config directory. See settings.example.toml for all available options.
| Platform | Path |
|---|---|
| Windows | %APPDATA%/ump/settings.toml |
| Linux | ~/.config/ump/settings.toml |
| macOS | ~/Library/Application Support/ump/settings.toml |
Relative paths in settings.toml are resolved against the config directory.
You can configure per-mode soundfont bundles with channel routing in settings.toml:
[soundfont.bundles.GS]
files = ["gs.sf2", "gs_drums.sf2"]
routing = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]files: list of SF2 file paths (relative to config directory or absolute)routing: channel 0-15 mapped to file index (default: all channels use file 0)
When a MIDI mode is detected or manually selected, the matching bundle is loaded automatically. If no bundle is configured for a mode, the current single SF2 is used.
- D2D backend is Windows-only -- The D2D (Direct2D) backend requires
--no-default-features --features d2dand only builds on Windows. - SysEx support is partial -- GM/GS/XG/GM2 reset, Master Volume, master tune, scale tuning, and GS drum map changes are processed. Other SysEx commands (e.g. GS part parameters, XG effect settings) are parsed but not fully reproduced.
- SF2 modulators are partial -- SF2 Default Modulators (Phase 1) are implemented. Custom per-preset modulators from
pmod/imodchunks are not yet parsed. - No MIDI output -- Playback is software-synthesized only. External MIDI device output is not supported.
- No audio device selection -- Uses the system default audio output device.
| Crate | Purpose |
|---|---|
| midly | MIDI file parsing |
| rustysynth | SF2 soundfont synthesizer (fork with SysEx, mute, effect control, cubic interpolation, FDN reverb, SVF filter, and more) |
| cpal | Cross-platform audio output |
| winit | Window creation and event loop |
| windows | Direct2D / DirectWrite rendering (d2d feature) |
| wgpu | Cross-platform GPU rendering (wgpu-backend feature) |
| glyphon | Text rendering for wgpu (wgpu-backend feature) |
| clap | Command-line argument parsing |
| anyhow | Error handling |
| serde / toml | Settings serialization |
| unicode-width | Unicode display width calculation |
| dirs | Platform config directory resolution |