Skip to content

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

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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