Skip to content

Commit 162bb65

Browse files
committed
libmidi_io: backends: Add RtMidi backend
Change-Id: If13f2dd94797296f1559ca8e1d2bf20785a5cf7d
1 parent 0df0038 commit 162bb65

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#
2+
# Copyright (C) 2022 Sebastiano Barezzi
3+
#
4+
# SPDX-License-Identifier: LGPL-3.0-or-later
5+
#
6+
"""MIDI I/O RtMidi backend."""
7+
8+
from libmidi.types.messages.common import BaseMessage
9+
from mido.backends import rtmidi
10+
import rtmidi
11+
12+
from libmidi_io.types.device import Device
13+
from libmidi_io.types.port import BasePort
14+
15+
def get_devices():
16+
devices = []
17+
18+
mi = rtmidi.MidiIn()
19+
mo = rtmidi.MidiOut()
20+
21+
input_names = mi.get_ports()
22+
output_names = mo.get_ports()
23+
24+
for name in input_names + output_names:
25+
devices.append(Device(name, Port, name in input_names, name in output_names))
26+
27+
mi.delete()
28+
mo.delete()
29+
30+
return devices
31+
32+
class Port(BasePort):
33+
def __init__(self, **kwargs):
34+
super().__init__(**kwargs)
35+
36+
self._rt = rtmidi.MidiOut()
37+
38+
port_names = self._rt.get_ports()
39+
if not port_names:
40+
raise IOError("No ports available")
41+
42+
if self.name is None:
43+
self.name = port_names[0]
44+
if self.name not in port_names:
45+
raise IOError(f"Unknown port {self.name!r}")
46+
47+
port_id = port_names.index(self.name)
48+
49+
try:
50+
self._rt.open_port(port_id)
51+
except RuntimeError as err:
52+
raise IOError(*err.args)
53+
54+
def _close(self):
55+
self._rt.close_port()
56+
self._rt.delete()
57+
58+
def is_input(self) -> bool:
59+
return False
60+
61+
def is_output(self) -> bool:
62+
return True
63+
64+
def _send(self, message: BaseMessage):
65+
self._rt.send_message(message.to_bytes())

0 commit comments

Comments
 (0)