BMS Β· Be-Music Source

Ultra-lightweight Rust BMS Player

A BMS player that treats binary size as the top metric and runs as a single executable with no external runtime to install.
It offers deterministic judgement driven by the audio hardware clock and a non-blocking UI.

Windows only β€’ Direct3D 11 β€’ Free & open source β€’ Binary releases are coming soon

Key Features

πŸͺΆ

Tiny single executable

No codec packs, C++ runtime DLLs, shader compilers, or embedded databases. One .exe runs it; the player itself is about 2.85 MB in release builds.

🎯

Deterministic judgement

Judgement and note positions are computed from the number of samples the audio hardware has actually played, so frame-rate drops and lag never accumulate timing error.

⚑

Non-blocking UI

File I/O and audio decoding run on background threads, and keysounds are pre-decoded to PCM at load time, so nothing is decoded at runtime during play.

🎹

Broad chart support

Supports BMS / BME / BML / PMS and auto-detects 5, 7, 9, and 14-key (DP) charts. Handles BPM changes, #STOP, and long notes (LNOBJ/LNType1).

πŸŽ›οΈ

Play options

Hi-Speed (0.5x–10.0x), judgement offset, lane cover, sudden, Mirror / Random / R-Random / S-Random, and Groove Β· Survival Β· EX-Hard Β· Easy gauges.

🎬

Replay & practice

Built-in replay recording/playback (.rep), a measure fast-forward practice mode, autoplay, and a key config UI.

Design Principles

01

Audio clock as master

Judgement and rendered note positions both use AudioClock (actual samples played) as the single source of truth.

02

Lock-free, zero-allocation audio thread

The audio callback takes commands over an SPSC ring buffer (rtrb) with no mutexes and no heap allocation.

03

Single Direct3D 11 renderer

Calls the OS-provided Direct3D 11 directly with no external crate, drawing most of the screen in one draw call from a shared atlas. Without a GPU it runs the same pipeline on WARP (the CPU rasterizer).

Binary Size

beetle-app.exe

~2.85 MB

BMS player

bpm.exe

~2.67 MB

Package manager CLI

bpm-gui.exe

~4.60 MB

Package manager GUI

Single static binaries built with opt-level="z", LTO, panic="abort", and strip (measured 2026-10-04). The embedded subset fonts (Noto Sans KR/JP, ~1.5 MB) are the main reason the build exceeds the under-1 MB goal.

Package Manager (bpm)

Bundle a BMS folder into a standard .bmsp archive, install and version it, and apply atomic updates with delta (.bmdp) patches. Available as a CLI (bpm) and a standalone GUI (bpm-gui).

bpm import ./songs/my_song/
bpm pack ./songs/my_song/ -o my_song-1.0.0.bmsp
bpm install ./my_song-1.0.0.bmsp
bpm update patch-1.1.0.bmdp
bpm list

Get Started

For now, build it yourself from the GitHub repository. (Requires the Rust toolchain on Windows.)

STEP 01

Get the source

Run git clone https://github.com/orphera/beetle.

STEP 02

Release build

Run cargo build --release; executables appear in target/release/.

STEP 03

Add songs & play

Register songs with bpm import <BMS folder>, then launch beetle-app.exe.

πŸ’‘ Basic controls: in song select, ↑↓ to move, Enter to start, Tab for play options, F12 for key config. The default 7-key layout is LShift (scratch) + Z S X D C F V.
GitHub Repository β†— Issues / Feedback β†—