CI / backend (pull_request) Canceled after 0s
CI / shell (pull_request) Canceled after 0s
CI / frontend (pull_request) Canceled after 0s
CI / arm64-smoke (pull_request) Canceled after 0s
CI / backend (push) Canceled after 0s
CI / shell (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / arm64-smoke (push) Canceled after 0s
39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from tuxdmx_midi_bridge.midi import MidiEventFilter, normalize_message
|
|
|
|
|
|
@dataclass
|
|
class FakeMessage:
|
|
type: str
|
|
channel: int
|
|
note: int | None = None
|
|
control: int | None = None
|
|
program: int | None = None
|
|
velocity: int | None = None
|
|
value: int | None = None
|
|
|
|
|
|
def test_normalize_note_on() -> None:
|
|
payload = normalize_message(
|
|
FakeMessage(type="note_on", channel=0, note=36, velocity=127),
|
|
"bridge-a",
|
|
"USB MIDI",
|
|
)
|
|
assert payload is not None
|
|
assert payload["message"]["type"] == "note_on"
|
|
assert payload["message"]["number"] == 36
|
|
assert payload["message"]["value"] == 127
|
|
|
|
|
|
def test_filter_suppresses_duplicates_and_rate_limits_control_change() -> None:
|
|
event_filter = MidiEventFilter(channel_filter=None, control_change_interval_ms=25, suppress_duplicate_values=True)
|
|
payload = {
|
|
"message": {"type": "control_change", "channel": 0, "number": 14, "value": 64}
|
|
}
|
|
assert event_filter.should_forward(payload) is True
|
|
assert event_filter.should_forward(payload) is False
|
|
|