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