nulltask / nulltask/be-music

Define an LR2-aligned policy for negative BPM (#BPMxx via channel 08)

Open
#134 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
TypeScript
Stars
15
Forks
1
Avg merge
1d 4h
Merged PRs (30d)
29

Description

Context

Found in the BMS spec-compliance audit (finding C-5; also listed as an open TODO in docs/bms-spec.md).

Current behavior

Negative or zero #BPMxx values referenced through channel 08 are dropped by the timing resolver (packages/audio-renderer/src/core/triggers.ts accepts only bpm > 0), so playback continues forward at the previous tempo as if the event did not exist.

Expected behavior

This project's baseline is LR2 behavior: LR2 scrolls backwards on a negative BPM (the chart effectively becomes unplayable past that point), which is the basis of several well-known gimmick charts. beatoraja treats it differently (stop-like), so the policy needs an explicit decision and documentation either way.

Suggested scope

  1. Decide the policy (LR2 reverse-scroll reproduction vs. documented non-support).
  2. Implement it consistently in the timing resolver and the renderers (TUI / web), or document the deviation in docs/bms-spec.md / docs/player-spec.md.
  3. Add regression coverage with a negative-BPM fixture.

Notes

Time-resolution for reverse scroll is non-trivial (event times become non-monotonic), which is why the audit deferred it. Low priority — affects gimmick charts only.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with packages/audio-renderer/src/core/triggers.ts and the TODO in docs/bms-spec.md, then inspect how the TUI and web renderers consume timing events. First resolve whether the project will reproduce LR2 reverse-scroll behavior or document non-support. Done means the chosen policy is applied consistently or documented, with regression coverage using a negative-BPM fixture.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
tooling
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.