BmsTWO
A fork of BmsONE
| Written in | C++ |
|---|---|
| License | GPL-3.0 |
| Latest release | v0.6.1, 14 Jun 2026 |
| Last updated | 12 Sept 2026 |
| Fork of | djkero/BmsONE |
BmsTWO is an editor for bmson files, the music-game format derived from BMS.
BmsTWO is a continuation fork of BmsONE. Its lineage is:
excln/BmsONE— original upstream (last binary release: beta 0.2.1, Sept 2017).djkero/BmsONE— 2020 fork that added EZ2 (EZ2ON / EZ2AC) mode support and skins for both player sides, the 5K ONLY / 14K ANDROMEDA modes, and an updatedmode_hintspec. This is the base of the present fork.- This fork continues from djkero with compiler/deprecation cleanup, ASan-detected leak fixes, and ongoing stability work.
EZ2 support
The EZ2 mode support inherited from djkero is kept as-is in this fork:
- The default
mode_hinton a new file is 5K STD. - EZ2 skins are bundled, with player-side selection under Toolbar → View → Scratch → Player X.
- EZ2 modes ignore
judge_rankandtotal(EZ2 handles timing/life its own way — seeEZ2_INFO.txtfor the judgement/life delta reference). EZ2_TEMPLATE.bmsonis provided as a starting template.
What's new in BmsTWO
Everything below was added on top of the djkero/BmsONE base. End-user
documentation for these lives in the project wiki (source under
docs/).
Editing & navigation
- Copy / cut / paste of sound notes, pasting at the cursor and snapping to the grid when snap is on.
- Fill notes evenly between two selected notes.
- Custom bar division — toggle a bar line at the cursor to split/merge measures.
- BGA editing — a dockable editor for BGA headers and the base / layer / poor event lanes.
- STOP events — editable, and now honored by the time/playback engine (playback and WAV export pause at stops).
- Long notes — a one-key Toggle Long Note command, plus an optional
keysound re-trigger at an LN's release (the
upextension — see Format below). - Keysound / lane lock — stop note drags from accidentally reassigning a note's lane (keysound).
- MIDI import — drop a MIDI file onto a channel to lay out slice notes.
- Go To — jump to a measure, pulse, or time.
- Richer selection — select every note in a channel, and inspect/sort the current selection in a dedicated panel.
Panels & workflow
- Classic BMS Mode — a usable layout and charting flow for pre-cut-sample songs (hundreds of keysound channels): channels are merged into name-grouped, overlap-packed background lanes; clicking a note auditions its sample, writing a key note keys the sample the music actually has at that time (or slices an ongoing one), deleting a keyed note un-keys it, and right-clicking splits a sample (the remainder returns to the background) — so charting never alters the music. Reset All Notes to BGM un-charts back to a blank canvas of samples.
- Statistics dock — note counts, average / peak NPS, per-lane distribution.
- Charts dock — list and switch between the charts in a song folder (sabun workflow).
- Keysounds panel — add / remove / reorder / replace the shared keysound list in one place.
- Selection dock — sortable list of the current selection; double-click to jump.
- Autosave & crash recovery — periodic snapshots of unsaved work, offered back after an abnormal exit.
- Configurable keyboard shortcuts — rebind any menu command, with conflict detection, in Preferences.
- Multi-track sample preview — preview several selected channels mixed together.
Appearance
- Modern dark theme (toggle in Preferences; Classic restores the original look): Fusion palette, tiered gridlines, alternating measure shading, rounded notes / long-note capsules, per-channel color-coding with custom overrides, monospace numeric fields, and crisp high-DPI rendering.
Format
- bmson extensions — a few optional non-standard fields (
upLN-release re-trigger,x_stopkeysound cutoff,x_colorchannel color) that degrade gracefully in other players. Seedocs/Bmson-Extensions.md.
Under the hood
- Qt 6 port, a dependency-free crash handler, numerous crash/UB/leak fixes, smart-pointer ownership refactors, faster bulk channel operations, a headless ASan/UBSan fuzz harness, and CI that produces Windows and Linux builds.
Building
This software is built with Qt 6 and C++17, using qmake
(the qt5compat module is required for core5compat).
qmake6 src/bmstwo.pro
make
Or open src/bmstwo.pro in Qt Creator.
libogg and libvorbis are bundled in the source code (under src/libogg and
src/libvorbis), so no external audio libraries are required.
AI development & transparency
In the interest of transparency, the BmsTWO fork was developed as a human-directed, AI-assisted project:
- The maintainer (Roganis) owns and directs the project: setting goals and priorities, making the design and scope decisions, reviewing the work, running and validating the application (interactive/GUI testing), and owning releases and overall responsibility for the project.
- An AI coding assistant (Anthropic's Claude, via Claude Code) did the hands-on implementation under that direction: writing the feature code, bug fixes, refactors, and this documentation, and verifying each change with compiler builds and the headless AddressSanitizer/UBSan test harness.
In short: the human decides what gets built and confirms it works in practice; the AI does most of the writing and automated checking. Automated verification (builds, sanitizer/fuzz harness) does not replace real-world use — please report anything that misbehaves.
License
BmsTWO is distributed under the GNU General Public License v3.0. See the
LICENSE file for the full text.
Third-party components:
- Qt is used under the GNU LGPL.
- libogg and libvorbis are bundled and used under the Xiph.org
BSD-style license. See the
COPYINGdirectory for their license texts.
Acknowledgments
- Original BmsONE by excln; EZ2 mode support by djkero.
- Qt — Copyright (C) The Qt Company Ltd and other contributors.
- libogg / libvorbis — Copyright (c) 2002–2015 Xiph.org Foundation, available at Xiph.org.
This page is synced from README.md in the BmsTWO repo.