from midi_wrapper_mido import MidiWrapper class MidiController: DEVICE_NAME = "Launchpad Mini MIDI 1" LIGHT_CONTROL_CHANNEL = 0 LED_GREEN = 124 LED_YELLOW = 126 LED_RED = 3 LED_OFF = 0 BUTTON_MATRIX = [[x for x in range(y * 16, y * 16 + 8)] for y in range(0,8)] # address as [row][col] def __init__(self, soloTool, midiWrapperOverride=None): self._soloTool = soloTool if midiWrapperOverride is not None: self._midiWrapper = midiWrapperOverride else: self._midiWrapper = MidiWrapper() self._registerHandlers() def _registerHandlers(self): self._handlers = { 96 : self._stop, 112 : self._playPause, 101 : self._soloTool.jumpToA, 102 : self._soloTool.previousStoredAbLimits, 103 : self._soloTool.nextStoredAbLimits, 118 : self._soloTool.previousSong, 119 : self._soloTool.nextSong } for i in range(0, 8): volume = round(0.125 + i * 0.125, 3) self._handlers[i] = self._createSetPlaybackVolumeCallback(volume) for i in range(16, 24): rate = round(0.5 + (i - 16) * 0.1, 1) self._handlers[i] = self._createSetPlaybackRateCallback(rate) def connect(self): self._midiWrapper.setCallback(self._callback) self._midiWrapper.connect(MidiController.DEVICE_NAME) self._initialiseButtonLEDs() def _callback(self, msg): if msg.velocity < 127: return if msg.note in self._handlers: handler = self._handlers[msg.note]() def _playPause(self): if self._soloTool.isPlaying(): self._soloTool.pause() self._setButtonLED(7, 0, MidiController.LED_YELLOW) else: self._soloTool.play() self._setButtonLED(7, 0, MidiController.LED_GREEN) def _stop(self): self._soloTool.stop() self._setButtonLED(7, 0, MidiController.LED_YELLOW) def _createSetPlaybackRateCallback(self, rate): def f(): self._soloTool.setPlaybackRate(rate) return f def _createSetPlaybackVolumeCallback(self, volume): def f(): self._soloTool.setPlaybackVolume(volume) return f def _setButtonLED(self, row, col, colour): self._midiWrapper.sendMessage(MidiController.BUTTON_MATRIX[row][col], colour, MidiController.LIGHT_CONTROL_CHANNEL) def _allLEDsOff(self): for row in range(0, 8): for col in range(0, 8): self._setButtonLED(row, col, MidiController.LED_OFF) def _initialiseButtonLEDs(self): self._allLEDsOff() # volume buttons for col in range(0, 8): self._setButtonLED(0, col, MidiController.LED_GREEN) # playback rate buttons for col in range(0, 6): self._setButtonLED(1, col, MidiController.LED_YELLOW) # playback control self._setButtonLED(6, 0, MidiController.LED_RED) self._setButtonLED(7, 0, MidiController.LED_YELLOW) # AB control self._setButtonLED(6, 5, MidiController.LED_YELLOW) self._setButtonLED(6, 6, MidiController.LED_RED) self._setButtonLED(6, 7, MidiController.LED_GREEN) # Song control self._setButtonLED(7, 6, MidiController.LED_RED) self._setButtonLED(7, 7, MidiController.LED_GREEN)