Example #1
0
class MidiMonitor(object):
    def __init__(self, connect=None, start=True, app=None):
        self.events = EmitterGroup(source=self,
                                   start=Event,
                                   stop=Event,
                                   midiIn=Event)

        if app is None:
            self._app = use_app(call_reuse=False)
        elif isinstance(app, Application):
            self._app = app
        elif isinstance(app, string_types):
            self._app = Application(app)
        else:
            raise ValueError('Invalid value for app %r' % app)
        self._running = False
        if connect is not None:
            self.connect(connect)
        if start:
            self.start()

    @property
    def running(self):
        return self._running

    def start(self):
        if self.running:
            return  # don't do anything if already running
        port = sys.argv[1] if len(sys.argv) > 1 else None
        try:
            self.midiin = rtmidi.MidiIn(name="game")
            available_ports = self.midiin.get_ports()
            if available_ports:
                self.midiin.open_port(0)
            else:
                self.midiin.open_virtual_port("My virtual output")
        except (EOFError, KeyboardInterrupt):
            sys.exit()
        self.midiInputHandler = MidiInputHandler(self, port)
        self.midiin.set_callback(self.midiInputHandler)
        self._running = True
        self.events.start(type='midi_start')
        print(self.midiin)

    def stop(self):
        self.events.stop(type='midi_stop')

    def _midiIn(self, message):
        if not self.running:
            return
        if message[0] == 144:
            print(message)
            self.events.midiIn(type='midi_in', message=message)

    def connect(self, callback):
        return self.events.midiIn.connect(callback)

    def disconnect(self, callback=None):
        return self.events.midiIn.disconnect(callback)