44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
"""Sequence beat phase alignment (sync to musical downbeat)."""
|
|
|
|
import os
|
|
import sys
|
|
|
|
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
SRC_PATH = os.path.join(PROJECT_ROOT, "src")
|
|
if SRC_PATH not in sys.path:
|
|
sys.path.insert(0, SRC_PATH)
|
|
|
|
from util.sequence_playback import apply_beat_phase_sync # noqa: E402
|
|
|
|
|
|
def _ctx(lane_states):
|
|
return {"lane_states": lane_states, "sequence_loop_beat": 5}
|
|
|
|
|
|
def test_apply_beat_phase_sync_step_resets_beat_count_only():
|
|
ctx = _ctx(
|
|
[
|
|
{"stepIdx": 2, "beatCount": 3, "done": False},
|
|
{"stepIdx": 1, "beatCount": 1, "done": True},
|
|
]
|
|
)
|
|
ok, resend = apply_beat_phase_sync(ctx, "step")
|
|
assert ok is True
|
|
assert resend is False
|
|
assert ctx["lane_states"][0]["stepIdx"] == 2
|
|
assert ctx["lane_states"][0]["beatCount"] == 0
|
|
assert ctx["lane_states"][1]["beatCount"] == 1
|
|
assert ctx["sequence_loop_beat"] == 5
|
|
|
|
|
|
def test_apply_beat_phase_sync_pass_restarts_pass():
|
|
ctx = _ctx([{"stepIdx": 2, "beatCount": 3, "done": False}])
|
|
ok, resend = apply_beat_phase_sync(ctx, "pass")
|
|
assert ok is True
|
|
assert resend is True
|
|
st = ctx["lane_states"][0]
|
|
assert st["stepIdx"] == 0
|
|
assert st["beatCount"] == 0
|
|
assert st["done"] is False
|
|
assert ctx["sequence_loop_beat"] == 0
|