Releases: nulltask/be-music
Release list
@be-music/utils@0.3.0
Minor Changes
- ca1012c: Add the
@be-music/utils/optional-node-modulesubpath withloadOptionalNodeModule, a loader for optional dependencies (native addons, large wasm packages) that falls back tocreateRequireresolution anchored next to the executable, the directory named by theBE_MUSIC_OPTIONAL_NODE_MODULE_DIRenvironment variable, and the working directory. Inside a Node single executable application (SEA),import()of a bare specifier always fails, so this lets SEA binaries load such modules from anode_modulesdirectory shipped alongside them or extracted from embedded assets.
@be-music/stringifier@0.3.1
Patch Changes
- b9922cf: Support the beatoraja bmson long-note type extensions:
info.ln_typeand per-notet(1: LN, 2: CN, 3: HCN) are preserved in the IR, round-trip through JSON and bmson output, and drive the player's long-note mode (per-notetwins overinfo.ln_type). Charts that specify neither now default to LN (no tail release judgment, matching the LR2-aligned BMS default) instead of always being treated as CN. - Updated dependencies [b2c4f9b]
- Updated dependencies [b9922cf]
- Updated dependencies [4d5a89e]
- Updated dependencies [cdc42a1]
- Updated dependencies [ca1012c]
- @be-music/parser@0.2.3
- @be-music/json@0.2.2
- @be-music/utils@0.3.0
- @be-music/chart@0.3.2
@be-music/player@0.5.0
Minor Changes
- 7bbf052: HARD / EASY / DEATH gauges now follow the LR2 tables (beatoraja GaugeProperty HARD_LR2 / EASY_LR2 / HAZARD_LR2): HARD recovers +0.1/+0.1/+0.05 with damage scaled by the #TOTAL multiplier table and softened ×0.6 under 30%; EASY damages -3.2/-4.8/-1.6 and clears at 80%; DEATH drains -10 on an empty POOR instead of dying and recovers +0.15/+0.06. Survival gauges collapse to 0% (FAILED, no recovery) below 2%, and raw deltas such as mine damage bypass the guts/TOTAL modifiers.
- 811cdfc: Judge windows are now the measured LR2 tables instead of IIDX-baseline linear scaling: #RANK 0/1/2/3 map to ±8/±15/±18/±21ms PGREAT (±24/±30/±40/±60 GREAT, ±40/±60/±100/±120 GOOD), #RANK 4 is treated as NORMAL, the BAD gate is fixed at ±200ms for every rank, and #DEFEXRANK / #EXRANKxx / bmson judge_rank interpolate piecewise-linearly between the rank anchors (lr2oraja JudgeWindowRule.LR2 model) without ever exceeding the BAD gate.
- d0bb321: Mines now follow the LR2 detonation model: a mine explodes while its lane's key is ON and the mine is within the GOOD window of the judge line — covering both presses with a mine in range and holding through a passing mine; a mine passing with the key up is harmless. Explosions only drain the gauge (raw base36 value as the damage percent, matching LR2 / beatoraja, instead of the nanasi value/2 rule) and play #WAV00 — no BAD verdict, no combo break, and mines no longer swallow presses aimed at nearby notes. Mine damage bypasses the HARD guts softening and #TOTAL multiplier; ZZ instantly fails survival gauges.
Patch Changes
-
b9922cf: Support the beatoraja bmson long-note type extensions:
info.ln_typeand per-notet(1: LN, 2: CN, 3: HCN) are preserved in the IR, round-trip through JSON and bmson output, and drive the player's long-note mode (per-notetwins overinfo.ln_type). Charts that specify neither now default to LN (no tail release judgment, matching the LR2-aligned BMS default) instead of always being treated as CN. -
254e213: Empty POORs (空 POOR) now follow the LR2 trigger condition: a phantom press charges only when a note on the same lane lies within the next 1 second (early side only, fixed window). Presses after a note or on lanes with no upcoming note are harmless keysound presses — previously every phantom press drained the gauge regardless of note proximity.
-
ebfdba7: Bump the
node-web-audio-apiruntime dependency from 1.0.9 to 2.0.0 (semver-major). The Node audio sink now runs on the 2.x WebAudio backend with no change to the player's public API. -
ca1012c: Load
node-web-audio-apithrough the SEA-aware optional-module loader. In a single executable application the bare-specifier import always fails, which permanently disabled audio playback; the player can now pick the module up from anode_modulesdirectory next to the executable (or the working directory) before falling back to silent playback. -
6ce9173: Missing, undefined, or undecodable
#WAVxxreferences are now silent by default, matching LR2 / beatoraja. The synthesized sine fallback tone is opt-in: passfallbackToneSecondsto the audio-renderer APIs ormissingSampleToneSecondsto the player engine when a debugging tone is wanted. -
7802f98: Fix four spec-compliance deviations found by the BMS spec audit:
- HARD / DEATH gauges now report FAILED when they bottom out at 0 % (previously
isGrooveGaugeClearedtreated 0 % as cleared). - Dynamic
#EXRANKxx(channelA0) values now go through the sameRANK 2 = 100unit conversion as#DEFEXRANK, so#EXRANK 100restores exactly the NORMAL judgment width instead of widening it by 4/3. - bmson
key_channels[].notes[].damageis now applied as the mine's gauge damage, taking precedence over the BMSvalue / 2rule. #SPEEDxxnow holds the first keyframe's value before its beat (Bemuse reference semantics) instead of ramping linearly from 1.0.
- HARD / DEATH gauges now report FAILED when they bottom out at 0 % (previously
-
Updated dependencies [b2c4f9b]
-
Updated dependencies [b9922cf]
-
Updated dependencies [4d5a89e]
-
Updated dependencies [6ce9173]
-
Updated dependencies [cdc42a1]
-
Updated dependencies [ca1012c]
- @be-music/parser@0.2.3
- @be-music/json@0.2.2
- @be-music/audio-renderer@0.2.3
- @be-music/utils@0.3.0
- @be-music/chart@0.3.2
@be-music/player-web@0.6.2
Patch Changes
- f07ff77: Match the LR2 groove gauge bar rendering: remove the peak-hold / afterimage bead (LR2 has none — the bar tracks only the live value) and suppress the green clear-zone split for survival gauges (HARD / DEATH render the whole bar red in LR2, since they have no 80% clear border). GROOVE / EASY keep the green ≥80% zone. The per-bead cell selection is now the pure, tested
resolveGrooveGaugeBeadshelper. - 99324e8:
#xxx97/#xxx98dynamic volume changes in the WebAudio session now apply only to voices triggered after the event, matching the documented semantics and the Node engine. Previously the web runtime wrote the new gain onto the shared bus mixers, retroactively changing the volume of already-playing voices. - Updated dependencies [b2c4f9b]
- Updated dependencies [b9922cf]
- Updated dependencies [4d5a89e]
- Updated dependencies [254e213]
- Updated dependencies [7bbf052]
- Updated dependencies [811cdfc]
- Updated dependencies [d0bb321]
- Updated dependencies [ebfdba7]
- Updated dependencies [ca1012c]
- Updated dependencies [6ce9173]
- Updated dependencies [7802f98]
- Updated dependencies [cdc42a1]
- Updated dependencies [ca1012c]
- @be-music/parser@0.2.3
- @be-music/json@0.2.2
- @be-music/player@0.5.0
- @be-music/audio-renderer@0.2.3
- @be-music/utils@0.3.0
- @be-music/chart@0.3.2
- @be-music/lr2-skin@0.1.4
- @be-music/beatoraja-skin@0.1.2
@be-music/player-web-demo@0.3.1
@be-music/player-tui@0.3.0
Minor Changes
-
ca1012c: Make the TUI player work as a Node single executable application (SEA).
- Gameplay, UI, and BGA-video workers are now spawned from an embedded copy of the SEA bundle (eval workers dispatched by the new
sea-mainentry on a workerData role marker); previously the worker URL resolution threw under SEA and playback silently never started. - The CLI entry refuses to start from a worker thread, since inside SEA workers
process.argv[1]still equalsprocess.execPath. @uwx/libav.js-fat(video BGA) loads through the SEA-aware optional-module loader, so anode_modulesdirectory next to the executable now works.- SEA binaries embed
node-web-audio-api(with its dependency closure, filtered to the target platform's native addon) and@uwx/libav.js-fat(filtered to the wasm build actually used at runtime), extracting them once into~/.be-music/sea-embedded-modulesat startup, so audio playback and video BGA work out of the box; anode_modulesdirectory next to the executable still takes precedence.
- Gameplay, UI, and BGA-video workers are now spawned from an embedded copy of the SEA bundle (eval workers dispatched by the new
Patch Changes
- Updated dependencies [b2c4f9b]
- Updated dependencies [b9922cf]
- Updated dependencies [4d5a89e]
- Updated dependencies [254e213]
- Updated dependencies [7bbf052]
- Updated dependencies [811cdfc]
- Updated dependencies [d0bb321]
- Updated dependencies [ebfdba7]
- Updated dependencies [ca1012c]
- Updated dependencies [6ce9173]
- Updated dependencies [7802f98]
- Updated dependencies [cdc42a1]
- Updated dependencies [ca1012c]
- @be-music/parser@0.2.3
- @be-music/json@0.2.2
- @be-music/player@0.5.0
- @be-music/audio-renderer@0.2.3
- @be-music/utils@0.3.0
- @be-music/chart@0.3.2
@be-music/parser@0.2.3
Patch Changes
- b2c4f9b:
decodeBmsTextnow implements the full documented encoding-detection pipeline: UTF-16LE / UTF-16BE BOMs are recognized (such charts previously decoded as garbled shift_jis and lost every event), BOM-less files that strictly validate as UTF-8 decode as UTF-8, and remaining files are scored across shift_jis / utf-8 / euc-jp / iso-8859-1 instead of unconditionally falling back to shift_jis. - b9922cf: Support the beatoraja bmson long-note type extensions:
info.ln_typeand per-notet(1: LN, 2: CN, 3: HCN) are preserved in the IR, round-trip through JSON and bmson output, and drive the player's long-note mode (per-notetwins overinfo.ln_type). Charts that specify neither now default to LN (no tail release judgment, matching the LR2-aligned BMS default) instead of always being treated as CN. - 4d5a89e: Accept the real-world control-flow spelling variants
#END IF, bare#END, and#ELSE IF nas#ENDIF/#ELSEIF n. Previously such charts left the#IFblock unterminated, so a non-matching#RANDOMroll silently dropped every line after the misspelled directive. - cdc42a1: BMS object data lines (
#mmmcc:data) are now truncated at the first whitespace character. Trailing text no longer fabricates note events (e.g.junkbecomingJU/NKobjects) or inflates the position denominator of the legitimate tokens before it. - Updated dependencies [b9922cf]
- Updated dependencies [ca1012c]
- @be-music/json@0.2.2
- @be-music/utils@0.3.0
- @be-music/chart@0.3.2
@be-music/lr2-skin@0.1.4
@be-music/json@0.2.2
Patch Changes
- b9922cf: Support the beatoraja bmson long-note type extensions:
info.ln_typeand per-notet(1: LN, 2: CN, 3: HCN) are preserved in the IR, round-trip through JSON and bmson output, and drive the player's long-note mode (per-notetwins overinfo.ln_type). Charts that specify neither now default to LN (no tail release judgment, matching the LR2-aligned BMS default) instead of always being treated as CN. - Updated dependencies [ca1012c]
- @be-music/utils@0.3.0