From 49b109b4a2d0cc9e6692374477120ef65c919dd3 Mon Sep 17 00:00:00 2001 From: Francois Best Date: Thu, 10 Apr 2014 14:30:53 +0200 Subject: [PATCH] Added MIDI to validator (requires python-rtmidi). --- res/validator/midi.py | 101 ++++++++++++++++++++++++++++++++ res/{ => validator}/validate.py | 7 ++- 2 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 res/validator/midi.py rename res/{ => validator}/validate.py (97%) diff --git a/res/validator/midi.py b/res/validator/midi.py new file mode 100644 index 0000000..764c09a --- /dev/null +++ b/res/validator/midi.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- + +import rtmidi +import random + +# ------------------------------------------------------------------------------ + +class Midi: + InvalidType = 0x00 # For notifying errors + NoteOff = 0x80 # Note Off + NoteOn = 0x90 # Note On + AfterTouchPoly = 0xA0 # Polyphonic AfterTouch + ControlChange = 0xB0 # Control Change / Channel Mode + ProgramChange = 0xC0 # Program Change + AfterTouchChannel = 0xD0 # Channel (monophonic) AfterTouch + PitchBend = 0xE0 # Pitch Bend + SystemExclusive = 0xF0 # System Exclusive + TimeCodeQuarterFrame = 0xF1 # System Common - MIDI Time Code Quarter Frame + SongPosition = 0xF2 # System Common - Song Position Pointer + SongSelect = 0xF3 # System Common - Song Select + TuneRequest = 0xF6 # System Common - Tune Request + Clock = 0xF8 # System Real Time - Timing Clock + Start = 0xFA # System Real Time - Start + Continue = 0xFB # System Real Time - Continue + Stop = 0xFC # System Real Time - Stop + ActiveSensing = 0xFE # System Real Time - Active Sensing + SystemReset = 0xFF # System Real Time - System Reset + + @staticmethod + def getChannel(statusByte): + return statusByte & 0x0f; + + @staticmethod + def getType(statusByte): + if statusByte >= 0xf0: + # System messages + return statusByte + else: + # Channel messages + return statusByte & 0xf0; + + +# ------------------------------------------------------------------------------ + +class MidiInterface: + def __init__(self, listenerCallback = None): + self.interface = rtmidi.MidiIn() + self.listenerCallback = listenerCallback + self.ports = self.getAvailablePorts() + self.port = self.connect(self.choosePort()) + + # -------------------------------------------------------------------------- + + def read(self): + pass + + def handleMidiInput(self, message, timestamp): + midiData = message[0] + print(midiData) + if self.listenerCallback: + self.listenerCallback(midiData) + + # -------------------------------------------------------------------------- + + def getAvailablePorts(self): + return self.interface.get_ports() + + def choosePort(self): + if not self.ports: + print('No MIDI ports available, bailing out.') + return None + + if len(self.ports) == 1: + return (0, self.ports[0]) + + else: + # Give a choice + print('Multiple ports available, please make a choice:') + choices = [] + for port, i in zip(self.ports, range(0, len(self.ports))): + choices.append((i, port)) + print(' [%d]' % i, port) + choiceIndex = int(input('-> ')) + return choices[choiceIndex] + + # -------------------------------------------------------------------------- + + def connect(self, port): + if not port: + return None + print(port) + print('Connecting to %s' % port[1]) + self.interface.set_callback(self.handleMidiInput) + self.interface.open_port(port[0]) + return port + + +midi = MidiInterface() + +while True: + midi.read() diff --git a/res/validate.py b/res/validator/validate.py similarity index 97% rename from res/validate.py rename to res/validator/validate.py index 3c84e5e..25b386d 100644 --- a/res/validate.py +++ b/res/validator/validate.py @@ -8,7 +8,7 @@ from pprint import pprint # ------------------------------------------------------------------------------ -rootDir = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..')) +rootDir = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../..')) logsDir = os.path.join(rootDir, 'logs') resDir = os.path.join(rootDir, 'res') srcDir = os.path.join(rootDir, 'src') @@ -77,8 +77,9 @@ class Arduino: Arduino.binary, '--verify', sketch, '--board', boardId, - #'--verbose-build', - ], stdout = open(os.devnull, 'wb'))) + '--verbose-build', + ])) + #], stdout = open(os.devnull, 'wb'))) # ------------------------------------------------------------------------------