You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
2.6 KiB
53 lines
2.6 KiB
6 years ago
|
|
||
|
|
||
|
class MidiState(object):
|
||
|
"""Various data to keep track what midi in looks like currently"""
|
||
|
def __init__(self):
|
||
|
self.midiInIsActive = False
|
||
|
self.ccState = {}
|
||
|
for cc in range(0,127):
|
||
|
self.ccState[cc] = None #start with undefined.
|
||
|
self.firstActiveNote = None #for chord entry.
|
||
|
self.cboxMidiPortUid = None #the INPUT midi in port. set in startMidiModule
|
||
|
self.currentOutputMidiPortUid = None #set in self.setMidiThrough. This changes with the active track
|
||
|
self.scene = cbox.Document.get_engine().new_scene()
|
||
|
self.scene.clear()
|
||
|
|
||
|
def toggleMidiIn(self):
|
||
|
self.midiInIsActive = not self.midiInIsActive
|
||
|
if self.midiInIsActive:
|
||
|
#CachedTrackDuration is a dict and never cleared completely. So our midiIn will never get touched
|
||
|
#We hope that nobody uses the PortUid as a track name by chance :)
|
||
|
api.session.data.cachedTrackDurations[self.cboxMidiPortUid] = api.DINF
|
||
|
else:
|
||
|
api.session.data.cachedTrackDurations[self.cboxMidiPortUid] = 0
|
||
|
|
||
|
finalizeRecordingBuffer()
|
||
|
api.callbacksDatabase._prevailingBaseDurationChanged(api.session.data.cursor.prevailingBaseDuration)
|
||
|
|
||
|
def updateCCState(self, ccNumber, ccValue):
|
||
|
assert 0 <= ccValue <= 127
|
||
|
self.ccState[ccNumber] = ccValue
|
||
|
|
||
|
def setMidiThrough(self, cursorExport):
|
||
|
"""
|
||
|
Instruct the RT part to echo midi in directly to the connect output ports so we hear the current track with the tracks instrument.
|
||
|
Added to the cursorChanged api callback"""
|
||
|
if not self.currentOutputMidiPortUid == cursorExport["cboxMidiOutUuid"]: #most of the time this stays the same e.g. cursor left/right. we only care about up and down
|
||
|
self.currentOutputMidiPortUid = cursorExport["cboxMidiOutUuid"]
|
||
|
cbox.JackIO.route_midi_input(midiState.cboxMidiPortUid, cursorExport["cboxMidiOutUuid"])
|
||
|
|
||
|
def startMidiModule(pApi):
|
||
|
global api
|
||
|
api = pApi
|
||
|
|
||
|
#global midiState
|
||
|
#midiState = MidiState()
|
||
|
|
||
|
midiState.cboxMidiPortUid = cbox.JackIO.create_midi_input("in")
|
||
|
cbox.JackIO.set_appsink_for_midi_input(midiState.cboxMidiPortUid, True) #This sounds like a program wide sink, but it is needed for every port.
|
||
|
cbox.JackIO.route_midi_input(midiState.cboxMidiPortUid, midiState.scene.uuid)
|
||
|
#midiState.currentOutputMidiPortUid = api.session.data.cursorExport()["cboxMidiOutUuid"] #TODO. Im cursor habn ich das deaktiviert.
|
||
|
#api.callbacks.setCursor.append(midiState.setMidiThrough) #TODO. Das brauchen wir damit wir das verknüpfte instrument vom track hören.
|
||
|
return processMidiIn
|