def __init__(self, midiDevice = -1): ''' Constructor ''' self.midiDevice = midiDevice self._midiThread = None self._midiRecogniser = MidiRecogniser() self._midi = {} self._actions = [] self._descriptions = {} self._actionPairs = set() self._parameterActions = set() self._shortcuts = {} self._byOp = {}
class ControlSet(object): ''' classdocs ''' def __init__(self, midiDevice = -1): ''' Constructor ''' self.midiDevice = midiDevice self._midiThread = None self._midiRecogniser = MidiRecogniser() self._midi = {} self._actions = [] self._descriptions = {} self._actionPairs = set() self._parameterActions = set() self._shortcuts = {} self._byOp = {} def _addAction(self, action, description): if action not in self._actions: self._actions.append(action) self._descriptions[action] = description self._shortcuts[action] = action.shortcut() self._byOp[action.opnum] = action def addSingleAction(self, action, description, opnum): self._addAction(SingleAction(action, opnum), description) def addActionPair(self, actionOn, actionOff, shortcut, description, opnum): actionPair = ActionPair(actionOn, actionOff, shortcut, opnum) self._actionPairs.add(actionPair) self._addAction(actionPair, description) def addParameterAction(self, method, description, outputMin, outputMax, opnum): parameterAction = ParameterAction(method, outputMin, outputMax, opnum) self._parameterActions.add(parameterAction) self._addAction(parameterAction, description) def __getitem__(self, index): return self._actions[index] def __len__(self): return len(self._actions) def iterActions(self): return iter(self._actions) def getDescription(self, action): return self._descriptions.get(action, "") def getShortcutString(self, action): if action not in self._descriptions: raise KeyError("Unrecognised action") shortcut = self._shortcuts[action] if shortcut is None: return "" else: return shortcut.toString() def setShortcut(self, action, shortcut): if action not in self._descriptions: raise KeyError("Unrecognised action") action.setShortcut(shortcut) def getMidi(self, action): if action not in self._descriptions: raise KeyError("Unrecognised action") return self._midi.get(action, None) def getMidiAsString(self, action): if action not in self._descriptions: raise KeyError("Unrecognised action") if action not in self._midi: return "" return self._midi[action].unparamString() def isValidMidi(self, action, midiMsg): if isinstance(midiMsg, SysExMessage): return False elif action in self._actionPairs: return isinstance(midiMsg, PairedMidi) else: return isinstance(midiMsg, MidiMessage) def setMidi(self, action, midiData): if action not in self._descriptions: raise KeyError("Unrecognised action") if midiData is None and action in self._midi: midiData = self._midi[action] if action.numActions() == 1: self._midiRecogniser.removeMessageTarget(midiData) else: self._midiRecogniser.removeMessageTarget(midiData.midiOn) self._midiRecogniser.removeMessageTarget(midiData.midiOff) del self._midi[action] elif midiData is not None: if action.numActions() == 1: self._midi[action] = midiData self._midiRecogniser.addMessageTarget(midiData, action) elif not isinstance(midiData, PairedMidi): raise TypeError("On/Off actions require two MIDI messages") else: self._midi[action] = midiData self._midiRecogniser.addMessageTarget(midiData.midiOn, action.actionOn) self._midiRecogniser.addMessageTarget(midiData.midiOff, action.actionOff) def openMidiDevice(self, deviceId): self.midiDevice = deviceId if self._midiThread is not None: self.closeMidiDevice() self._midiThread = MidiControlThread(deviceId) self._midiThread.midiReceived.connect(self.midiToAction) self._midiThread.start() def closeMidiDevice(self): if self._midiThread is not None: self._midiThread.close() self._midiThread.wait() def midiToAction(self, midiData): target = self._midiRecogniser.getTarget(midiData) if target is None: return if target in self._parameterActions: target.trigger(midiData.parameterValue()) else: target.trigger() def save(self, handle, midiDict = None): if midiDict is None: midiDict = self._midi for action in self.iterActions(): opnum = action.opnum midiMsg = midiDict.get(action, None) pickle.dump((opnum, midiMsg), handle) def load(self, handle): newMidi = dict((action, None) for action in self.iterActions()) try: while True: opnum, midiMsg = pickle.load(handle) newMidi[self._byOp[opnum]] = midiMsg except EOFError: return newMidi return None