def test_transmission(self): import multiprocessing as mp if hasattr(mp, 'set_start_method'): mp.set_start_method('spawn') iq = mp.Queue() oq = mp.Queue() portName = 'TestVirtualPorts.%i' % time.time() senderProc = mp.Process(target=SenderProc, args=(oq, iq, portName)) senderProc.start() # handshake self.assertEqual(iq.get(), 'init') # virtual midi port is now open # Supposedly you can't just open a virtual port by name from # within the same proc or proc group? Anyway opening by index # works. device = RtMidiIn() for i in range(device.getPortCount()): if device.getPortName(i) == portName: device.openPort(i) break self.assertTrue(device.isPortOpen()) # collect messages and print progress self.messages = [] self.last_s = '' def put(m): self.messages.append(m) if len(self.messages) % 10 == 0: sys.stdout.write('\b' * len(self.last_s)) # backspace self.last_s = '%s: Received message %i / 32640' % (__name__, len(self.messages)) sys.stdout.write(self.last_s) # sys.stdout.write('.') sys.stdout.flush() oq.put('start') for i in range(128): for j in range(1, 128): msg = device.getMessage(1000) self.assertTrue(msg is not None) self.assertTrue(msg.isNoteOn()) self.assertEqual(msg.getNoteNumber(), i) self.assertEqual(msg.getVelocity(), j) put(msg) oq.put('next') for i in range(128): for j in range(128): msg = device.getMessage(1000) self.assertTrue(msg is not None) self.assertTrue(msg.isController()) self.assertEqual(msg.getControllerNumber(), i) self.assertEqual(msg.getControllerValue(), j) put(msg) oq.put('next') self.assertEqual(len(self.messages), 32640) oq.put('done')
class M2K: def __init__(self): self.config_path = Path().cwd() / "m2k.json" self.table: dict = {} self.midi = RtMidiIn() self.keyboard = Controller() def set_config(self) -> NoReturn: with open(str(self.config_path), "r") as j: self.table = json.load(j) def update_config(self, update: dict) -> NoReturn: with open(str(self.config_path), "w") as new: new.write(json.dumps(update)) self.set_config() def send_key(self, midi_message) -> NoReturn: key = midi_message.getMidiNoteName(midi_message.getNoteNumber()) if key not in self.table: return if midi_message.isNoteOn(): self.keyboard.press(self.table[key]) elif midi_message.isNoteOff(): self.keyboard.release(self.table[key]) def run(self) -> NoReturn: ports = range(self.midi.getPortCount()) if ports: print("Running") self.midi.openPort(1) while True: if midi_message := self.midi.getMessage(0): self.send_key(midi_message)
def test_transmission(self): import multiprocessing as mp if hasattr(mp, 'set_start_method'): mp.set_start_method('spawn') iq = mp.Queue() oq = mp.Queue() portName = 'TestVirtualPorts.%i' % time.time() senderProc = mp.Process(target=SenderProc, args=(oq, iq, portName)) senderProc.start() # handshake self.assertEqual(iq.get(), 'init') # virtual midi port is now open # Supposedly you can't just open a virtual port by name from # within the same proc or proc group? Anyway opening by index # works. device = RtMidiIn() for i in range(device.getPortCount()): if device.getPortName(i) == portName: device.openPort(i) break self.assertTrue(device.isPortOpen()) # collect messages and print progress self.messages = [] self.last_s = '' def put(m): self.messages.append(m) if len(self.messages) % 10 == 0: sys.stdout.write('\b' * len(self.last_s)) # backspace self.last_s = '%s: Received message %i / 32640' % ( __name__, len(self.messages)) sys.stdout.write(self.last_s) # sys.stdout.write('.') sys.stdout.flush() oq.put('start') for i in range(128): for j in range(1, 128): msg = device.getMessage(1000) self.assertTrue(msg is not None) self.assertTrue(msg.isNoteOn()) self.assertEqual(msg.getNoteNumber(), i) self.assertEqual(msg.getVelocity(), j) put(msg) oq.put('next') for i in range(128): for j in range(128): msg = device.getMessage(1000) self.assertTrue(msg is not None) self.assertTrue(msg.isController()) self.assertEqual(msg.getControllerNumber(), i) self.assertEqual(msg.getControllerValue(), j) put(msg) oq.put('next') self.assertEqual(len(self.messages), 32640) oq.put('done')