Define an LR2-aligned policy for negative BPM (#BPMxx via channel 08)
Nobody has claimed this yet.
- 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
- Decide the policy (LR2 reverse-scroll reproduction vs. documented non-support).
- 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. - 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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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