Finish native FastAPI controllers, drop vendored microdot, and add Wi-Fi driver runtime, beat SSE, simulated BPM, sequence playback improvements, bridge ESP-NOW sources, UI updates, and tests. Co-authored-by: Cursor <cursoragent@cursor.com>
40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
"""Beat interval plausibility helpers (audio detector)."""
|
|
|
|
import os
|
|
import sys
|
|
from collections import deque
|
|
|
|
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
if PROJECT_ROOT not in sys.path:
|
|
sys.path.insert(0, PROJECT_ROOT)
|
|
|
|
from tests.beat_detect import _is_plausible_ioi, _resolve_bpm # noqa: E402
|
|
|
|
|
|
def test_is_plausible_ioi_rejects_double_time():
|
|
times = deque([0.0, 0.5, 1.0])
|
|
assert _is_plausible_ioi(1.0, times, 1.15) is False
|
|
|
|
|
|
def test_is_plausible_ioi_accepts_steady_grid():
|
|
times = deque([0.0, 0.5, 1.0])
|
|
assert _is_plausible_ioi(1.0, times, 1.5) is True
|
|
|
|
|
|
def test_resolve_bpm_prefers_intervals_over_wrong_aubio():
|
|
times = deque([0.0, 0.5, 1.0, 1.5, 2.0])
|
|
bpm = _resolve_bpm(times, 70.0)
|
|
assert bpm is not None
|
|
assert abs(bpm - 120.0) < 5.0
|
|
|
|
|
|
def test_resolve_bpm_clamps_runaway_aubio():
|
|
times = deque([0.0])
|
|
assert _resolve_bpm(times, 400.0) == 200.0
|
|
assert _resolve_bpm(times, 999.0) == 200.0
|
|
|
|
|
|
def test_resolve_bpm_clamps_slow_aubio():
|
|
times = deque([0.0])
|
|
assert _resolve_bpm(times, 30.0) == 60.0
|