Skip to content

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

@nulltask

Description

@nulltask

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions