A tracker music organizer and player for Linux.
Collects MOD/XM/IT/S3M and related tracker module files into a local SQLite database, plays them via libxmp and OpenAL Soft with EBU R128 loudness normalization, and provides a Dear ImGui GUI with docking support.
See Known issues for limitations on particular OpenAL implementations.
GNU General Public License v2.0 or later
- Library management — import files or whole directory trees; SHA-1 content-addressed database avoids duplicates
- Modland integration — browse and download from the Modland FTP archive; cross-reference via MD5
- Playback — libxmp engine, stereo 48 kHz, OpenAL Soft output, EBU R128 loudness normalization, shuffle and loop modes
- Super Stereo — adjustable stereo separation via mid/side processing; continuously variable from mono to widened stereo
- 4-band equalizer — low, low-mid, high-mid, and high shelf/peak filters with per-band gain control
- Playlists — static playlists with drag-and-drop ordering; dynamic playlists (Top Rated, Most Played)
- Full-text search — FTS5-powered async search across title, artist, album and filename fields
- Visualizer — real-time FFT spectrum display rendered with OpenGL 3.2:
- Bars — 256-band frequency spectrum with fast-rise/slow-fall smoothing
- 3D Spectrogram — rolling perspective heightmap; newest frame at front, older frames recede to the horizon with thermal colour mapping
- MPRIS2 — D-Bus media player interface (play/pause/seek/metadata)
- System tray — tray icon with basic playback controls
- USB numpad control — dedicate a numpad as a physical playback remote
- Metadata analysis — per-track loudness, duration, channel count
Requires CMake 3.28+ and a C++20 compiler (GCC 12+ or Clang 16+). libebur128 is included in the source tree and built automatically.
| Option | Default | Description |
|---|---|---|
MODPILE_ENABLE_MPRIS |
ON |
Enable MPRIS2 D-Bus support (requires libsystemd); set OFF to build without it |
MODPILE_SANITIZE |
none |
Enable a sanitizer: address, thread, or undefined |
MODPILE_IPO |
OFF |
Enable link-time optimization (IPO/LTO) |
MODPILE_USE_SYSTEM_LIBARCHIVE |
ON |
Use system libarchive; set OFF to fetch and build from source |
MODPILE_USE_SYSTEM_LIBXMP |
ON |
Use system libxmp; set OFF to fetch and build from source |
MODPILE_USE_SYSTEM_ZSTD |
ON |
Use system zstd; set OFF to fetch and build from source |
MODPILE_USE_SYSTEM_SDL |
ON |
Use system SDL3/SDL3_image; set OFF to fetch and build from source |
MODPILE_USE_SYSTEM_KISSFFT |
ON |
Use system kissfft; set OFF to fetch and build from source |
MODPILE_USE_SYSTEM_GLM |
ON |
Use system GLM; set OFF to fetch and build from source |
MODPILE_USE_SYSTEM_OPENAL |
ON |
Use system OpenAL Soft; set OFF to fetch and build from source (1.25.1) |
MODPILE_USE_SYSTEM_CATCH2 |
ON |
Use system Catch2 (requires v3); set OFF to fetch and build from source |
sudo apt install \
build-essential \
cmake \
catch2 \
libsqlite3-dev \
libopenal-dev \
libcurl4-openssl-dev \
libarchive-dev \
libxmp-dev \
libsystemd-dev \
libzstd-dev \
libkissfft-dev \
libglm-dev \
libsdl3-dev \
libsdl3-image-devcmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfocmake --build build
ctest --test-dir buildNote: kissfft is not in the official repos. Use the flag below to fetch it automatically, or install it from the AUR.
sudo pacman -S --needed \
base-devel \
cmake \
catch2 \
sqlite \
openal \
curl \
libarchive \
libxmp \
libsystemd \
zstd \
glm \
sdl3 \
sdl3_imagecmake -B build \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DMODPILE_USE_SYSTEM_KISSFFT=OFFcmake --build build
ctest --test-dir buildNote: kissfft, zstd, and catch2 (v3) are not available in the official repos. Use the flags below to fetch them automatically.
sudo dnf install \
gcc-c++ \
cmake \
sqlite-devel \
openal-soft-devel \
libcurl-devel \
libarchive-devel \
libxmp-devel \
systemd-devel \
glm-devel \
SDL3-devel \
SDL3_image-develcmake -B build \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DMODPILE_USE_SYSTEM_KISSFFT=OFF \
-DMODPILE_USE_SYSTEM_ZSTD=OFF \
-DMODPILE_USE_SYSTEM_CATCH2=OFFcmake --build build
ctest --test-dir build- Find out the vendor and product id of your numblock via
lsusb - If they differ from the defaults (
1a2c:2124), updatesystem/10-modpile.rulesand set the matching VID/PID in~/.config/ModPile/ModPile.cfgunder[numblock] - Install and reload the udev rule:
sudo cp ./system/10-modpile.rules /etc/udev/rules.d/10-modpile.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --subsystem-match=hidraw- Replug the numblock if it was already connected when the rule was applied
