BMS · Be-Music Source

초경량 Rust BMS 플레이어

바이너리 크기를 최우선 지표로 삼아, 외부 런타임 설치 없이 단일 실행 파일로 구동되는 BMS 플레이어입니다.
오디오 하드웨어 클럭을 기준으로 한 결정론적 판정과 논블로킹 UI를 제공합니다.

Windows 전용 • Direct3D 11 • 무료 오픈소스 • 바이너리 릴리즈는 준비 중입니다

주요 기능

🪶

초경량 단일 실행 파일

외부 코덱 팩, C++ 런타임 DLL, 셰이더 컴파일러, 임베디드 DB 없이 .exe 하나로 구동됩니다. 플레이어 본체는 릴리즈 기준 약 2.85 MB입니다.

🎯

결정론적 판정

판정과 노트 위치를 오디오 하드웨어가 실제로 재생한 샘플 수에서 계산합니다. 프레임레이트 변동이나 렉에도 판정 오차가 누적되지 않습니다.

⚡

논블로킹 UI

파일 I/O와 오디오 디코딩은 백그라운드 스레드가 맡고, 키음은 로딩 시점에 PCM으로 미리 디코드해 플레이 중 런타임 디코딩이 없습니다.

🎹

폭넓은 채보 지원

BMS / BME / BML / PMS를 지원하고 5키·7키·9키·14키(DP)를 자동 판별합니다. BPM 변화, #STOP, 롱노트(LNOBJ/LNType1)를 처리합니다.

🎛️

플레이 옵션

Hi-Speed(0.5x~10.0x), 판정 오프셋, 레인 커버, 서든, Mirror / Random / R-Random / S-Random, Groove · Survival · EX-Hard · Easy 게이지를 지원합니다.

🎬

리플레이 & 연습

리플레이 녹화/재생(.rep), 마디 패스트포워드 연습 모드, 오토플레이, 키 설정 UI를 내장하고 있습니다.

설계 원칙

01

오디오 클럭 마스터

판정과 렌더링 노트 위치 모두 AudioClock(실제 재생 샘플 수)을 단일 기준으로 삼습니다.

02

락프리 & 무할당 오디오 스레드

오디오 콜백은 뮤텍스나 힙 할당 없이 SPSC 링버퍼(rtrb)로 명령을 받습니다.

03

Direct3D 11 단일 렌더러

OS 내장 Direct3D 11을 외부 크레이트 없이 직접 호출하고, 공유 아틀라스로 화면 대부분을 드로우콜 1회에 그립니다. GPU가 없으면 WARP(CPU 래스터라이저)로 같은 파이프라인을 실행합니다.

바이너리 크기

beetle-app.exe

~2.85 MB

BMS 플레이어

bpm.exe

~2.67 MB

패키지 매니저 CLI

bpm-gui.exe

~4.60 MB

패키지 매니저 GUI

opt-level="z", LTO, panic="abort", strip 적용 단일 정적 바이너리 기준 (2026-10-04 측정). 내장 서브셋 폰트(Noto Sans KR/JP 약 1.5 MB)가 목표치(1 MB 미만)를 넘는 주된 이유입니다.

패키지 매니저 (bpm)

BMS 폴더를 표준 .bmsp 아카이브로 묶어 설치·버전 관리하고, 차분(.bmdp) 패치로 원자적 업데이트를 할 수 있습니다. CLI(bpm)와 독립형 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

시작하기

현재는 GitHub 저장소에서 직접 빌드해 사용합니다. (Windows, Rust 툴체인 필요)

STEP 01

저장소 받기

git clone https://github.com/orphera/beetle 로 소스를 받습니다.

STEP 02

릴리즈 빌드

cargo build --release 를 실행하면 target/release/ 에 실행 파일이 만들어집니다.

STEP 03

곡 등록 & 실행

bpm import <BMS 폴더> 로 곡을 등록하고 beetle-app.exe 를 실행합니다.

💡 기본 조작: 선곡 ↑↓ 이동 · Enter 시작 · Tab 플레이 옵션 · F12 키 설정. 7키 기본 배치는 LShift(스크래치) + Z S X D C F V 입니다.
GitHub 저장소 ↗ 이슈 / 제안 ↗