def UpdateLEDs(self): if device.isAssigned(): playstatus = [transport.isPlaying()] recstatus = [transport.isRecording()] loopstatus = [transport.getLoopMode()] metrostatus = [ui.isMetronomeEnabled()] prestatus = [ui.isPrecountEnabled()] quanstatus = [ui.getSnapMode()] mutestatusc = [channels.isChannelMuted(0)] solostatusc = [channels.isChannelSolo(0)] mutestatusm = [mixer.isTrackEnabled(mixer.trackNumber())] solostatusm = [mixer.isTrackSolo(mixer.trackNumber())] for a in playstatus: if a == 0: #not playing KompleteDataOut(0x14, 0x01) #stop on elif a == 1: #playing KompleteDataOut(0x14, 0x00) #stop off for b in recstatus: if b == 0: #not recording KompleteDataOut(0x12, 0x00) elif b == 1: #recording KompleteDataOut(0x12, 0x01) for c in loopstatus: if c == 0: #loop mood KompleteDataOut(0x16, 0x00) elif c == 1: #playlist mode KompleteDataOut(0x16, 0x01) for d in metrostatus: if d == 0: #metro off KompleteDataOut(0x17, 0x00) elif d == 1: #metro on KompleteDataOut(0x17, 0x01) for e in prestatus: if e == 0: #pre count on KompleteDataOut(0x13, 0x00) elif e == 1: #pre count off KompleteDataOut(0x13, 0x01) for f in quanstatus: if f == 3: #quantize off KompleteDataOut(0x22, 0x00) elif f != 1: #quantize on KompleteDataOut(0x22, 0x01)
def TOnUpdateMeters(): """ Wrapper for the OnUpdateMeters thread. """ # Update peak meters # TODO: Disabled due to performance issues (multi-threading support needed) # ---------------------------------------------- if DEVICE_SERIES == "S_SERIES": updatePeak(mixer.trackNumber())
def OnEncoderDecreased(self, control, event): control_type, control_name, control_id, control_note_or_color = control.split( ".") control_number = int(control_name) if ui.getFocused(midi.widMixer): index = mixer.trackNumber() + control_number - 1 if self.mixer.encodersTarget == ENCODERS_NUM_TARGETS.MIXER.TRACK_VOL: mixer.setTrackVolume(index, mixer.getTrackVolume(index) - VOL_INC) elif self.mixer.encodersTarget == ENCODERS_NUM_TARGETS.MIXER.TRACK_PAN: mixer.setTrackPan(index, mixer.getTrackPan(index) - PAN_INC) elif ui.getFocused(midi.widChannelRack ) and control_number <= channels.channelCount(): index = channels.channelNumber() + control_number - 1 if self.channels.encodersTarget == ENCODERS_NUM_TARGETS.CHANNELS.CHANNEL_VOL: channels.setChannelVolume( index, channels.getChannelVolume(index) - VOL_INC) elif self.channels.encodersTarget == ENCODERS_NUM_TARGETS.CHANNELS.CHANNEL_PAN: channels.setChannelPan(index, channels.getChannelPan(index) - PAN_INC) elif ui.getFocused(midi.widPlaylist): index = playlist.trackNumber() + control_number - 1 if self.playlist.encodersTarget == ENCODERS_NUM_TARGETS.TRACK_VOL: pass
def getMixerTrackNum(): trackNum = mixer.trackNumber() if(trackNum == 0): trackNum = 1 return trackNum else: return trackNum
def process(command): command.actions.addProcessor("Mixer Processor") current_track = mixer.trackNumber() #--------------------------------- # Faders #--------------------------------- if command.type == eventconsts.TYPE_FADER: processFaders(command) #--------------------------------- # Knobs #--------------------------------- if command.type == eventconsts.TYPE_KNOB: processKnobs(command) #--------------------------------- # Mixer Buttons - mute/solo tracks #--------------------------------- if command.type == eventconsts.TYPE_FADER_BUTTON: processFaderButtons(command) #--------------------------------- # Other #--------------------------------- # Arms current mixer track when shifted if command.id == eventconsts.TRANSPORT_RECORD and command.is_lift and internal.shifts[ "MAIN"].use(): mixer.armTrack(current_track) command.handle("Arm current mixer track")
def setPeaks(lights): # Get selected mixer track selected_track = mixer.trackNumber() peakLeft = mixer.getTrackPeaks(selected_track, 0) peakRight = mixer.getTrackPeaks(selected_track, 1) processPeak(lights, 0, peakLeft) processPeak(lights, 1, peakRight) return
def updateMixer(): """ Updates every property of the mixer of the deivce but the peak values. """ updateMixerTracks("NAME", mixer.trackNumber()) updateMixerTracks("SELECTED", mixer.trackNumber()) updateMixerTracks("VOLUME", mixer.trackNumber()) updateMixerTracks("PAN", mixer.trackNumber()) updateMixerTracks("IS_MUTE", mixer.trackNumber()) updateMixerTracks("IS_SOLO", mixer.trackNumber()) # Update fader visualization on S-Series keyboards if DEVICE_SERIES == "S_SERIES": updateMixerTracks("VOLUME_GRAPH", mixer.trackNumber()) updateMixerTracks("PAN_GRAPH", mixer.trackNumber())
def set_mixer_track_route(n): if type(n) is str and n.isdigit(): n = int(n) currTrack = mixer.trackNumber() for dest in range(mixer.trackCount()): active = mixer.getRouteSendActive(currTrack, dest) if active: mixer.setRouteTo(currTrack, dest, 0) mixer.setRouteTo(currTrack, n, 1) mixer.getRouteSendActive(currTrack, n) print("set_mixer_track_route:", n)
def processFaderButtons(command): current_track = mixer.trackNumber() fader_num = command.coord_X + 1 if fader_num == 9: if internal.shifts["MAIN"].use(): track_num = 0 else: track_num = current_track else: track_num = fader_num processMuteSolo(track_num, command)
def processKnobs(command): current_track = mixer.trackNumber() knob_num = command.coord_X + 1 if knob_num == 8: if internal.shifts["MAIN"].use(): track_num = 0 else: track_num = current_track else: track_num = knob_num setPan(command, track_num, command.value)
def processFaders(command): current_track = mixer.trackNumber() fader_num = command.coord_X + 1 if fader_num == 9: if internal.shifts["MAIN"].use(): track_num = 0 else: track_num = current_track else: track_num = fader_num setVolume(command, track_num, command.value)
def onFader(self, fader, event): if self.faderSwitcher.mode == FaderMode.Mixer: fader_float = fader.value / 127.0 if fader.index == 8: # Master if controls.masterButton.value: target_event = rec.MainVol else: target_event = MixerTrack(mixer.trackNumber()).volume else: target_event = self.mixer.tracks[fader.index].volume if self.tryControllingTargetEvent(target_event, fl_event=event): target_event.setValue(fader_float, max=1.25) self.displayEventFeedback(target_event, fader, max=1.25) event.handled = True
def UpdateColT(self): f = self.FirstTrackT[self.FirstTrack] CurID = mixer.getTrackPluginId(mixer.trackNumber(), 0) for m in range(0, len(self.ColT)): self.ColT[m].KnobPressEventID = -1 # mixer if m == 8: self.ColT[m].TrackNum = -2 self.ColT[m].BaseEventID = midi.REC_MainVol self.ColT[m].SliderEventID = self.ColT[m].BaseEventID self.ColT[m].SliderName = 'Master Vol' else: self.ColT[m].TrackNum = midi.TrackNum_Master + ((f + m) % mixer.trackCount()) self.ColT[m].BaseEventID = mixer.getTrackPluginId(self.ColT[m].TrackNum, 0) self.ColT[m].SliderEventID = self.ColT[m].BaseEventID + midi.REC_Mixer_Vol s = mixer.getTrackName(self.ColT[m].TrackNum) self.ColT[m].SliderName = s + ' - Vol' self.ColT[m].KnobEventID = -1 self.ColT[m].KnobResetEventID = -1 self.ColT[m].KnobResetValue = midi.FromMIDI_Max >> 1 self.ColT[m].KnobName = '' self.ColT[m].KnobMode = 1 # parameter, pan, volume, off self.ColT[m].KnobCenter = -1 self.ColT[m].KnobEventID = self.ColT[m].BaseEventID + midi.REC_Mixer_Pan self.ColT[m].KnobResetEventID = self.ColT[m].KnobEventID self.ColT[m].KnobName = mixer.getTrackName( self.ColT[m].TrackNum) + ' - ' + 'Pan' # self.Flip knob & slider if self.Flip: self.ColT[m].KnobEventID, self.ColT[m].SliderEventID = utils.SwapInt(self.ColT[m].KnobEventID, self.ColT[m].SliderEventID) s = self.ColT[m].SliderName self.ColT[m].SliderName = self.ColT[m].KnobName self.ColT[m].KnobName = s self.ColT[m].KnobMode = 2 self.ColT[m].KnobCenter = -1 self.ColT[m].KnobResetValue = round(12800 * midi.FromMIDI_Max / 16000) self.ColT[m].KnobResetEventID = self.ColT[m].KnobEventID self.ColT[m].LastValueIndex = 48 + m * 6 self.ColT[m].Peak = 0 self.ColT[m].ZPeak = False self.UpdateCol(m)
def knob_turn(self): global proceed if proceed == True and temp_chan == self.data_one: print("proceeding") if ui.getFocused(0) and Switch.mixer_num == 0: if mixer.trackNumber() == 0 and self.data_one == 20: mixer.setTrackVolume(0, self.data_two/127) else: mixer.setTrackVolume(self.data_one-19, self.data_two/127) elif ui.getFocused(0) and Switch.mixer_num == 1: mixer.setTrackPan(self.data_one-19, mapvalues(self.data_two, -1, 1, 0, 127)) # print(f'panning: {mapvalues(self.data_two, -1, 1, 0, 127)}') elif ui.getFocused(1) and self.data_one-20 < channels.channelCount() and Switch.shift_status == False: # print(f'volume: {mapvalues(self.data_two, -1, 1, 0, 127)}') channels.setChannelVolume(self.data_one-20, mapvalues(self.data_two, 0, 1, 0, 127)) elif proceed == True and temp_chan != self.data_one: print("proceed no more") proceed = False
def OnEncoderTempoDecreased(self, control, event): if self.controls.isButtonShiftPressed: transport.globalTransport(midi.FPT_TempoJog, -10) elif ui.getFocused(midi.widChannelRack): idx = channels.channelNumber(1) print(idx) if idx == -1: channels.selectChannel(channels.channelCount() - 1, 1) elif idx > 0: channels.deselectAll() channels.selectChannel(idx - 1, 1) elif ui.getFocused(midi.widPlaylist): idx = patterns.patternNumber() if idx > 1: # TODO figure out why patternNumber starts at one instead of zero! patterns.jumpToPattern(idx - 1) elif ui.getFocused(midi.widMixer): idx = mixer.trackNumber() if idx > 1: # do not include the master track (0) mixer.setTrackNumber(idx - 1)
def handleSliderChange(self, target, value): # print(f"self.handlePressureChange called for {event.status} {event.data1} {event.data2}") print(f"{target.name} changed to {value}") # handle input mode change lock if self.getInputMode() == 'ui': # if mixer: if target == self.getSliderByNumber(1): print(f"Changing volume to {self.getTargetValue()} on track {mixer.trackNumber()}") mixer.setTrackVolume(mixer.trackNumber(), self.getTargetValue() if self.getTargetValue() < .8 else .8) else: self.updateKnobOrSliderToggleState(target, value != 127) self.MODE_CHANGE_UNLOCKED = all(slider.toggle == False for slider in [ self.getSliderByNumber(i) for i in range(1, 5)]) """ Start custom events here. """ """
def handle_rec_press(self, event, rec): """ Put rec press code here. """ # Mixer Mode if ui.getFocused(0) == 1: selectedTrack = mixer.trackNumber() mixer.armTrack(selectedTrack) self.output = "Mixer: Armed track: " + helpers.getMixerTrackName( selectedTrack) # Default Mode else: transport.record() if transport.isRecording() == 1: self.output = "Transport: Recording Enabled" else: self.output = "Transport: Recording Disabled" self.set_hint_message(self.output) print("Pressed rec button.") event.handled = True
def process(command): # Add event processor to actions list (useful for debugging) command.actions.addProcessor("Colour Picker Processor") if command.type == eventconsts.TYPE_PAD and command.coord_X != 8: command.handled == True if command.is_lift: colour = COLOUR_HEX_MAP[command.coord_X][command.coord_Y] if internal.window.active_fl_window == internal.consts.WINDOW_PLAYLIST: patterns.setPatternColor(patterns.patternNumber(), colour) if internal.window.active_fl_window == internal.consts.WINDOW_MIXER: mixer.setTrackColor(mixer.trackNumber(), colour) if internal.window.active_fl_window == internal.consts.WINDOW_CHANNEL_RACK: channels.setChannelColor(channels.channelNumber(), colour) command.actions.appendAction("Set colour to " + str(colour)) # quit the colour picker ui.escape() return
def OnMidiIn(self, event): #tbuttons if (event.data1 == playb): transport.start() #play self.UpdateLEDs() if (event.data1 == recb): transport.record() #record self.UpdateLEDs() if (event.data1 == stopb): transport.stop() #stop self.UpdateLEDs() if (event.data1 == loopb): transport.setLoopMode() #loop/pattern mode self.UpdateLEDs() if (event.data1 == metrob): # metronome/button transport.globalTransport(midi.FPT_Metronome, 110) self.UpdateLEDs() if (event.data1 == tempob): transport.stop() #tap tempo if (event.data1 == quantizeb): transport.globalTransport(midi.FPT_Snap, 48) #snap toggle if (event.data1 == squantizeb): ui.snapMode(1) #snap toggle if (event.data1 == srecb): transport.globalTransport(midi.FPT_CountDown, 115) #countdown before recordin #if (event.data1 == sstopb): # transport.globalTransport(midi.FPT_F12, 71) #clear all windows if (event.data1 == undob): general.undoUp() #undo if (event.data1 == sundob): general.undo() #redo if (event.data1 == squantizeb): transport.globalTransport(midi.FPT_SnapMode, 49, event.pmeFlags) #snap toggle self.UpdateLEDs() if (event.data1 == tempob): transport.globalTransport(midi.FPT_TapTempo, 106) #tap tempo #4D controller if (event.data1 == knobe): transport.globalTransport(midi.FPT_Enter, 80) #enter if (event.data1 == knobsp) & (event.data2 == right): #4d encoder spin right ui.jog(1) elif (event.data1 == knobsp) & (event.data2 == left): #4d encoder spin left ui.jog(-1) if (event.data1 == knoblr) & (event.data2 == right): #4d encoder push right transport.globalTransport(midi.FPT_Right, 1) elif (event.data1 == knoblr) & (event.data2 == left): #4d encoder push left transport.globalTransport(midi.FPT_Left, 1) if (event.data1 == knobud) & (event.data2 == up): #4d encoder push up transport.globalTransport(midi.FPT_Up, 1) elif (event.data1 == knobud) & (event.data2 == down): #4d encoder push down transport.globalTransport(midi.FPT_Down, 1) #8 volume knobs for mixer & channel rack, 8 tracks at a time volinc = .005 #volume increments paninc = .01 # pan increments if ui.getFocused(0) == 1: #mixer volume control if (event.data1 == muteb): mixer.enableTrack(mixer.trackNumber()) #mute if (event.data1 == solob): mixer.soloTrack(mixer.trackNumber()) #solo # VOLUME CONTROL #knob 1 if (event.data1 == knob1): if event.data2 == 127: mixer.setTrackVolume( mixer.trackNumber() + 0, mixer.getTrackVolume(mixer.trackNumber()) + 0 - volinc) # volume values go down elif event.data2 == 1: mixer.setTrackVolume( mixer.trackNumber() + 0, mixer.getTrackVolume(mixer.trackNumber()) + 0 + volinc) # volume values go up #knob 2 if (event.data1 == knob2): if event.data2 == 127: mixer.setTrackVolume( mixer.trackNumber() + 1, mixer.getTrackVolume(mixer.trackNumber() + 1) - volinc) # volume values go down elif event.data2 == 1: mixer.setTrackVolume( mixer.trackNumber() + 1, mixer.getTrackVolume(mixer.trackNumber() + 1) + volinc) # volume values go up #knob 3 if (event.data1 == knob3): if event.data2 == 127: mixer.setTrackVolume( mixer.trackNumber() + 2, mixer.getTrackVolume(mixer.trackNumber() + 2) - volinc) # volume values go down elif event.data2 == 1: mixer.setTrackVolume( mixer.trackNumber() + 2, mixer.getTrackVolume(mixer.trackNumber() + 2) + volinc) # volume values go up #knob 4 if (event.data1 == knob4): if event.data2 == 127: mixer.setTrackVolume( mixer.trackNumber() + 3, mixer.getTrackVolume(mixer.trackNumber() + 3) - volinc) # volume values go down elif event.data2 == 1: mixer.setTrackVolume( mixer.trackNumber() + 3, mixer.getTrackVolume(mixer.trackNumber() + 3) + volinc) # volume values go up #knob5 if (event.data1 == knob5): if event.data2 == 127: mixer.setTrackVolume( mixer.trackNumber() + 4, mixer.getTrackVolume(mixer.trackNumber() + 4) - volinc) # volume values go down elif event.data2 == 1: mixer.setTrackVolume( mixer.trackNumber() + 4, mixer.getTrackVolume(mixer.trackNumber() + 4) + volinc) # volume values go up #knob 6 if (event.data1 == knob6): if event.data2 == 127: mixer.setTrackVolume( mixer.trackNumber() + 5, mixer.getTrackVolume(mixer.trackNumber() + 5) - volinc) # volume values go down elif event.data2 == 1: mixer.setTrackVolume( mixer.trackNumber() + 5, mixer.getTrackVolume(mixer.trackNumber() + 5) + volinc) # volume values go up #knob 7 if (event.data1 == knob7): if event.data2 == 127: mixer.setTrackVolume( mixer.trackNumber() + 6, mixer.getTrackVolume(mixer.trackNumber() + 6) - volinc) # volume values go down elif event.data2 == 1: mixer.setTrackVolume( mixer.trackNumber() + 6, mixer.getTrackVolume(mixer.trackNumber() + 6) + volinc) # volume values go up #knob 8 if (event.data1 == knob8): if event.data2 == 127: mixer.setTrackVolume( mixer.trackNumber() + 7, mixer.getTrackVolume(mixer.trackNumber() + 7) - volinc) # volume values go down elif event.data2 == 1: mixer.setTrackVolume( mixer.trackNumber() + 7, mixer.getTrackVolume(mixer.trackNumber() + 7) + volinc) # volume values go up # PAN CONTROL #sknob 1 if (event.data1 == sknob1): if event.data2 == 127: mixer.setTrackPan(mixer.trackNumber() + 0, mixer.getTrackPan(mixer.trackNumber()) + 0 - paninc) # volume values go down elif event.data2 == 1: mixer.setTrackPan(mixer.trackNumber() + 0, mixer.getTrackPan(mixer.trackNumber()) + 0 + paninc) # volume values go up #sknob 2 if (event.data1 == sknob2): if event.data2 == 127: mixer.setTrackPan( mixer.trackNumber() + 1, mixer.getTrackPan(mixer.trackNumber() + 1) - paninc) # volume values go down elif event.data2 == 1: mixer.setTrackPan( mixer.trackNumber() + 1, mixer.getTrackPan(mixer.trackNumber() + 1) + paninc) # volume values go up #sknob 3 if (event.data1 == sknob3): if event.data2 == 127: mixer.setTrackPan( mixer.trackNumber() + 2, mixer.getTrackPan(mixer.trackNumber() + 2) - paninc) # volume values go down elif event.data2 == 1: mixer.setTrackPan( mixer.trackNumber() + 2, mixer.getTrackPan(mixer.trackNumber() + 2) + paninc) # volume values go up #sknob 4 if (event.data1 == sknob4): if event.data2 == 127: mixer.setTrackPan( mixer.trackNumber() + 3, mixer.getTrackPan(mixer.trackNumber() + 3) - paninc) # volume values go down elif event.data2 == 1: mixer.setTrackPan( mixer.trackNumber() + 3, mixer.getTrackPan(mixer.trackNumber() + 3) + paninc) # volume values go up #sknob5 if (event.data1 == sknob5): if event.data2 == 127: mixer.setTrackPan( mixer.trackNumber() + 4, mixer.getTrackPan(mixer.trackNumber() + 4) - paninc) # volume values go down elif event.data2 == 1: mixer.setTrackPan( mixer.trackNumber() + 4, mixer.getTrackPan(mixer.trackNumber() + 4) + paninc) # volume values go up #sknob 6 if (event.data1 == sknob6): if event.data2 == 127: mixer.setTrackPan( mixer.trackNumber() + 5, mixer.getTrackPan(mixer.trackNumber() + 5) - paninc) # volume values go down elif event.data2 == 1: mixer.setTrackPan( mixer.trackNumber() + 5, mixer.getTrackPan(mixer.trackNumber() + 5) + paninc) # volume values go up #sknob 7 if (event.data1 == sknob7): if event.data2 == 127: mixer.setTrackPan( mixer.trackNumber() + 6, mixer.getTrackPan(mixer.trackNumber() + 6) - paninc) # volume values go down elif event.data2 == 1: mixer.setTrackPan( mixer.trackNumber() + 6, mixer.getTrackPan(mixer.trackNumber() + 6) + paninc) # volume values go up #sknob 8 if (event.data1 == sknob8): if event.data2 == 127: mixer.setTrackPan( mixer.trackNumber() + 7, mixer.getTrackPan(mixer.trackNumber() + 7) - paninc) # volume values go down elif event.data2 == 1: mixer.setTrackPan( mixer.trackNumber() + 7, mixer.getTrackPan(mixer.trackNumber() + 7) + paninc) # volume values go up elif ui.getFocused(0) == 0: # channel rack if (event.data1 == muteb): channels.muteChannel(channels.channelNumber()) #mute if (event.data1 == solob): channels.soloChannel(channels.channelNumber()) #solo # VOLUME CONTROL #knob 1 if (event.data1 == knob1): if event.data2 == 127: channels.setChannelVolume( channels.channelNumber() + 0, channels.getChannelVolume(channels.channelNumber() + 0) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelVolume( channels.channelNumber() + 0, channels.getChannelVolume(channels.channelNumber() + 0) + volinc) # volume values go up #knob 2 if (event.data1 == knob2): if event.data2 == 127: channels.setChannelVolume( channels.channelNumber() + 1, channels.getChannelVolume(channels.channelNumber() + 1) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelVolume( channels.channelNumber() + 1, channels.getChannelVolume(channels.channelNumber() + 1) + volinc) # volume values go up #knob 3 if (event.data1 == knob3): if event.data2 == 127: channels.setChannelVolume( channels.channelNumber() + 2, channels.getChannelVolume(channels.channelNumber() + 2) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelVolume( channels.channelNumber() + 2, channels.getChannelVolume(channels.channelNumber() + 2) + volinc) # volume values go up #knob 4 if (event.data1 == knob4): if event.data2 == 127: channels.setChannelVolume( channels.channelNumber() + 3, channels.getChannelVolume(channels.channelNumber() + 3) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelVolume( channels.channelNumber() + 3, channels.getChannelVolume(channels.channelNumber() + 3) + volinc) # volume values go up #knob 5 if (event.data1 == knob5): if event.data2 == 127: channels.setChannelVolume( channels.channelNumber() + 4, channels.getChannelVolume(channels.channelNumber() + 4) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelVolume( channels.channelNumber() + 4, channels.getChannelVolume(channels.channelNumber() + 4) + volinc) # volume values go up #knob 6 if (event.data1 == knob6): if event.data2 == 127: channels.setChannelVolume( channels.channelNumber() + 5, channels.getChannelVolume(channels.channelNumber() + 5) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelVolume( channels.channelNumber() + 5, channels.getChannelVolume(channels.channelNumber() + 5) + volinc) # volume values go up #knob 7 if (event.data1 == knob7): if event.data2 == 127: channels.setChannelVolume( channels.channelNumber() + 6, channels.getChannelVolume(channels.channelNumber() + 6) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelVolume( channels.channelNumber() + 6, channels.getChannelVolume(channels.channelNumber() + 6) + volinc) # volume values go up #knob 8 if (event.data1 == knob8): if event.data2 == 127: channels.setChannelVolume( channels.channelNumber() + 7, channels.getChannelVolume(channels.channelNumber() + 7) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelVolume( channels.channelNumber() + 7, channels.getChannelVolume(channels.channelNumber() + 7) + volinc) # volume values go up # PAN CONTROL #sknob 1 if (event.data1 == sknob1): if event.data2 == 127: channels.setChannelPan( channels.channelNumber() + 0, channels.getChannelPan(channels.channelNumber() + 0) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelPan( channels.channelNumber() + 0, channels.getChannelPan(channels.channelNumber() + 0) + volinc) # volume values go up #sknob 2 if (event.data1 == sknob2): if event.data2 == 127: channels.setChannelPan( channels.channelNumber() + 1, channels.getChannelPan(channels.channelNumber() + 1) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelPan( channels.channelNumber() + 1, channels.getChannelPan(channels.channelNumber() + 1) + volinc) # volume values go up #sknob 3 if (event.data1 == sknob3): if event.data2 == 127: channels.setChannelPan( channels.channelNumber() + 2, channels.getChannelPan(channels.channelNumber() + 2) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelPan( channels.channelNumber() + 2, channels.getChannelPan(channels.channelNumber() + 2) + volinc) # volume values go up #sknob 4 if (event.data1 == sknob4): if event.data2 == 127: channels.setChannelPan( channels.channelNumber() + 3, channels.getChannelPan(channels.channelNumber() + 3) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelPan( channels.channelNumber() + 3, channels.getChannelPan(channels.channelNumber() + 3) + volinc) # volume values go up #sknob 5 if (event.data1 == sknob5): if event.data2 == 127: channels.setChannelPan( channels.channelNumber() + 4, channels.getChannelPan(channels.channelNumber() + 4) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelPan( channels.channelNumber() + 4, channels.getChannelPan(channels.channelNumber() + 4) + volinc) # volume values go up #sknob 6 if (event.data1 == sknob6): if event.data2 == 127: channels.setChannelPan( channels.channelNumber() + 5, channels.getChannelPan(channels.channelNumber() + 5) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelPan( channels.channelNumber() + 5, channels.getChannelPan(channels.channelNumber() + 5) + volinc) # volume values go up #sknob 7 if (event.data1 == sknob7): if event.data2 == 127: channels.setChannelPan( channels.channelNumber() + 6, channels.getChannelPan(channels.channelNumber() + 6) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelPan( channels.channelNumber() + 6, channels.getChannelPan(channels.channelNumber() + 6) + volinc) # volume values go up #sknob 8 if (event.data1 == sknob8): if event.data2 == 127: channels.setChannelPan( channels.channelNumber() + 7, channels.getChannelPan(channels.channelNumber() + 7) - volinc) # volume values go down elif event.data2 == 1: channels.setChannelPan( channels.channelNumber() + 7, channels.getChannelPan(channels.channelNumber() + 7) + volinc) # volume values go up
def get_mixer_track(_): n = mixer.trackNumber() print("get_mixer_track:", n) return n
def TOnRefresh(HW_Dirty_LEDs): """ Wrapper for the OnRefresh thread. """ # PLAY button if transport.isPlaying() == True: nihia.buttonSetLight("PLAY", 1) elif transport.isPlaying() == False: nihia.buttonSetLight("PLAY", 0) # STOP button if transport.isPlaying() == True: nihia.buttonSetLight("STOP", 0) elif transport.isPlaying() == False: nihia.buttonSetLight("STOP", 1) # REC button if transport.isRecording() == True: nihia.buttonSetLight("REC", 1) elif transport.isRecording() == False: nihia.buttonSetLight("REC", 0) # COUNT-IN button if ui.isPrecountEnabled() == True: nihia.buttonSetLight("COUNT_IN", 1) elif ui.isPrecountEnabled() == False: nihia.buttonSetLight("COUNT_IN", 0) # CLEAR button (moved to OnIdle, since OnRefresh isn't called when focused window changes) # LOOP button if ui.isLoopRecEnabled() == True: nihia.buttonSetLight("LOOP", 1) elif ui.isLoopRecEnabled() == False: nihia.buttonSetLight("LOOP", 0) # METRO button if ui.isMetronomeEnabled() == True: nihia.buttonSetLight("METRO", 1) elif ui.isMetronomeEnabled() == False: nihia.buttonSetLight("METRO", 0) # MUTE button if mixer.isTrackMuted(mixer.trackNumber()) == True: nihia.buttonSetLight("MUTE_SELECTED", 1) elif mixer.isTrackMuted(mixer.trackNumber()) == False: nihia.buttonSetLight("MUTE_SELECTED", 0) # SOLO button if mixer.isTrackSolo(mixer.trackNumber()) == True: nihia.buttonSetLight("SOLO_SELECTED", 1) elif mixer.isTrackSolo(mixer.trackNumber()) == False: nihia.buttonSetLight("SOLO_SELECTED", 0) # Update mixer but peak meters updateMixer() # Tell the device if a mixer track is selected or not # It enables the ability to control mixer tracks using the 4D Encoder on S-Series keyboards # Disabled due to lack of awareness on how it is enabled and disabled correctly # if ui.getFocused(midi.widMixer) == True: # nihia.mixerSendInfoSelected("SELECTED", "GENERIC") # # if ui.getFocused(midi.widMixer) == False: # nihia.mixerSendInfoSelected("SELECTED", "EMPTY") # Check if the selected plugin is a Komplete Kontrol instance if (plugins.isValid( channels.channelNumber()) == True): # Checks if plugin exists # If it does, sends the instance ID if plugins.getPluginName( channels.channelNumber()) == "Komplete Kontrol": nihia.mixerSendInfo("KOMPLETE_INSTANCE", 0, info=plugins.getParamName( 0, channels.channelNumber())) # If it doesn't, tells the keyboard about it else: nihia.mixerSendInfo("KOMPLETE_INSTANCE", 0, info="") else: nihia.mixerSendInfo("KOMPLETE_INSTANCE", 0, info="")
def OnMidiMsg(self, event): event.handled = False # FOR PRINTING DATA ON SCRIPT OUTPUT print("status: {}, port: {}, midiId: {}, data1: {}, data2: {}".format( event.status, event.port, event.midiId, event.data1, event.data2)) # CONTROL CHANGE EVENT FOR BUTTONS OF MIDI if event.midiId == midi.MIDI_CONTROLCHANGE: if event.data2 > 0: if event.data1 == Play: print('Playback') transport.start() ui.setHintMsg("Play/Pause") event.handled = True elif event.data1 == Record: print('Record') transport.record() ui.setHintMsg("Record") event.handled = True elif event.data1 == Stop: print('Stop') transport.stop() ui.setHintMsg("Stop") event.handled = True elif event.data1 == ToggleLoop: print('Toggle Loop') transport.setLoopMode() ui.setHintMsg("Pattern/Song") event.handled = True elif event.data1 == Left: print('Previous Tab') transport.globalTransport(midi.FPT_WindowJog, -1) ui.setHintMsg("Previous Tab") event.handled = True elif event.data1 == Right: print('Next Tab') transport.globalTransport(midi.FPT_WindowJog, 1) ui.setHintMsg("Next Tab") event.handled = True elif event.data1 == Up: print('Undo Up') general.undoUp() ui.setHintMsg("Undo Up") event.handled = True elif event.data1 == Down: print('Undo Down/ReDo') general.restoreUndo() ui.setHintMsg("Undo Down/ReDo") event.handled = True elif event.data1 in Knobs: mixer.setTrackVolume( mixer.trackNumber() + Knobs.index(event.data1), event.data2 / 127) event.handled = True #MIDI NOTE ON/OFF FOR NOTE EVENTS elif event.midiId == midi.MIDI_NOTEON: if (event.pmeFlags & midi.PME_System != 0): if event.data1 == Playlist: print('Playlist') transport.globalTransport(midi.FPT_F5, 1) ui.setHintMsg("Playlist") event.handled = True elif event.data1 == ChannelRack: print('ChannelRack') transport.globalTransport(midi.FPT_F6, 1) ui.setHintMsg("ChannelRack") event.handled = True elif event.data1 == PianoRoll: print('PianoRoll') transport.globalTransport(midi.FPT_F7, 1) ui.setHintMsg("PianoRoll") event.handled = True elif event.data1 == Mixer: print('Mixer') transport.globalTransport(midi.FPT_F9, 1) ui.setHintMsg("Mixer") event.handled = True elif event.data1 == Previous: print('Previous') ui.previous() ui.setHintMsg("Previous") event.handled = True elif event.data1 == Next: print('Next') ui.next() ui.setHintMsg("Next") event.handled = True elif event.data1 == Mute: print('Mute') channels.muteChannel(channels.channelNumber()) ui.setHintMsg("Mute") event.handled = True elif event.data1 == Solo: print('Solo') channels.soloChannel(channels.channelNumber()) ui.setHintMsg("Solo") event.handled = True elif event.data1 == PatternUp: print('Pattern Up') transport.globalTransport(midi.FPT_PatternJog, -1) ui.setHintMsg("Pattern Up") event.handled = True elif event.data1 == PatternDown: print('Pattern Down') transport.globalTransport(midi.FPT_PatternJog, 1) ui.setHintMsg("Pattern Down") event.handled = True elif event.data1 == Overdub: print('Overdub') transport.globalTransport(midi.FPT_Overdub, 1) ui.setHintMsg("Overdub") event.handled = True elif event.data1 == LoopRecord: print('Loop Record') transport.globalTransport(midi.FPT_LoopRecord, 1) ui.setHintMsg("Loop Record") event.handled = True elif event.data1 == SnapUp: print('Snap -1') transport.globalTransport(midi.FPT_SnapMode, -1) ui.setHintMsg("Snap -1") event.handled = True elif event.data1 == SnapDown: print('Snap +1') transport.globalTransport(midi.FPT_SnapMode, 1) ui.setHintMsg("Snap +1") event.handled = True elif event.data1 == TapTempo: print('Tap Tempo') transport.globalTransport(midi.FPT_TapTempo, 1) ui.setHintMsg("Tap Tempo") event.handled = True elif event.data1 == Metro: print('Metronome') transport.globalTransport(midi.FPT_Metronome, 1) ui.setHintMsg("Metronome") event.handled = True
def OnRefresh(self, flags): if device.isAssigned(): print("On Refresh") i = mixer.trackNumber() Volume = mixer.getTrackVolume(i) sVol = self.scaleValue(Volume, 1, 127) self.UpdateKnobs(self.KNOB.VOL, sVol) self.UpdateLEDs(self.KNOB.VOL, self.COLOR.BRIGHT_GREEN, self.ANI.SOLID) Pan = 1 + (mixer.getTrackPan(i)) sPan = self.scaleValue(Pan, 2, 127) self.UpdateKnobs(self.KNOB.PAN, sPan) if mixer.isTrackSolo(i): self.UpdateLEDs(self.BTN.SOLO, self.COLOR.GREEN_YELLOW, self.ANI.PULSE) else: if (Pan < 1): self.UpdateLEDs(self.KNOB.PAN, self.COLOR.YELLOW, self.ANI.SOLID) elif (Pan > 1): self.UpdateLEDs(self.KNOB.PAN, self.COLOR.RED, self.ANI.SOLID) else: self.UpdateLEDs(self.KNOB.PAN, self.COLOR.BRIGHT_GREEN, self.ANI.SOLID) if mixer.isTrackEnabled(i): self.UpdateLEDs(self.BTN.MUTE, self.COLOR.BRIGHT_GREEN, self.ANI.SOLID) else: self.UpdateLEDs(self.BTN.MUTE, self.COLOR.GREEN_YELLOW, self.ANI.PULSE) if mixer.isTrackArmed(i): self.UpdateLEDs(self.KNOB.VOL, self.COLOR.RED, self.ANI.PULSE) color = mixer.getTrackColor(i) if transport.isPlaying(): self.UpdateLEDs(self.BTN.PLAY, self.COLOR.GREEN, self.ANI.PULSE) self.UpdateLEDs(self.BTN.STOP, self.COLOR.GREEN, self.ANI.SOLID) else: self.UpdateLEDs(self.BTN.PLAY, self.COLOR.DARK_BLUE, self.ANI.SOLID) self.UpdateLEDs(self.BTN.STOP, self.COLOR.DARK_BLUE, self.ANI.SOLID) if transport.isRecording(): self.UpdateLEDs(self.BTN.RECORD, self.COLOR.RED, self.ANI.PULSE) else: self.UpdateLEDs(self.BTN.RECORD, self.COLOR.YELLOW, self.ANI.SOLID) if transport.getLoopMode(): self.UpdateLEDs(self.BTN.LOOP_MODE, self.COLOR.BRIGHT_GREEN, self.ANI.SOLID) else: self.UpdateLEDs(self.BTN.LOOP_MODE, self.COLOR.LIGHT_ORANGE, self.ANI.SOLID)
def moveSelectedMixerTrack(self, offset): selected_track = (mixer.trackNumber() + offset) % mixer.trackCount() mixer.setTrackNumber(selected_track) return selected_track
def OnMidiMsg(self, event): print("On Midi Msg") #print("CC: ", event.controlNum, " Value: ", event.controlVal, " Chan: ", event.midiChan) i = mixer.trackNumber() if (event.midiChan == self.CHN.KNOB): event.handled = False if event.controlNum == self.KNOB.VOL: sVol = self.scaleValue(event.controlVal, 127, 1) mixer.setTrackVolume(mixer.trackNumber(), sVol) event.handled = True if event.controlNum == self.KNOB.PAN: sPan = (self.scaleValue(event.controlVal, 127, 2) - 1) if (abs(sPan) < 0.008): sPan = 0 mixer.setTrackPan(mixer.trackNumber(), sPan) event.handled = True elif (event.midiChan == self.CHN.BTN): event.handled = False if (event.controlNum == self.BTN.PLAY) & (event.controlVal == 127): transport.start() event.handled = True if (event.controlNum == self.BTN.STOP) & (event.controlVal == 127): transport.stop() event.handled = True if (event.controlNum == self.BTN.RECORD) & (event.controlVal == 127): transport.record() event.handled = True if (event.controlNum == self.BTN.LOOP_MODE) & (event.controlVal == 127): transport.setLoopMode() event.handled = True if (event.controlNum == self.BTN.MUTE) & (event.controlVal == 127): mixer.enableTrack(i) event.handled = True if (event.controlNum == self.BTN.SOLO) & (event.controlVal == 127): mixer.soloTrack(i) event.handled = True if (event.controlNum == self.BTN.TRACK_ARM) & (event.controlVal == 127): mixer.armTrack(i) event.handled = True else: event.handled = False
def mixer_track_right(unused_param_value): """Next mixer track""" select = (mixer.trackNumber() + 1) % (mixer.trackCount() - 1) mixer.setTrackNumber(select, midi.curfxScrollToMakeVisible)
def UpdateMixer_Sel(self): if device.isAssigned(): for m in range(0, len(self.ColT) - 1): device.midiOutNewMsg(((0x18 + m) << 8) + midi.TranzPort_OffOnT[self.ColT[m].TrackNum == mixer.trackNumber()], self.ColT[m].LastValueIndex + 4)
def OnMidiIn(event): """ Wrapper for the OnMidiIn thread. """ # Play button if event.data1 == nihia.buttons.get("PLAY"): event.handled = True transport.start() # Restart button elif event.data1 == nihia.buttons.get("RESTART"): event.handled = True transport.setLoopMode() # Record button elif event.data1 == nihia.buttons.get("REC"): event.handled = True transport.record() # Count-In button elif event.data1 == nihia.buttons.get("COUNT_IN"): event.handled = True # Defines the standard behaviour (just to toggle "Countdown before recording" on/off) if COUNT_IN_BEHAVIOUR == 0: transport.globalTransport(midi.FPT_CountDown, 1) # Defines behaviour of the button if the user chooses the Maschine-alike behaviour if COUNT_IN_BEHAVIOUR == 1: # Toggles recording on if it isn't enabled already if transport.isRecording() == 0: transport.record() # Toggles countdown before recording on if it isn't enabled already if ui.isPrecountEnabled() == 0: transport.globalTransport(midi.FPT_CountDown, 1) # Stops playback if FL Studio is playing if transport.isPlaying() == True: transport.stop() # Then turns playback on again. This time record and countdown before recording will be activated transport.start() # Stop button elif event.data1 == nihia.buttons.get("STOP"): event.handled = True transport.stop() # Clear button # This one in other DAWs (in Maschine, specifically) this button is meant to clear the MIDI clip you're # on so you can record again on it without having to use a mouse to delete all of the notes on the clip before # recording again # # However, since the MIDI API on FL Studio doesn't allow control over the piano roll specifically, for now it will only just # emulate the delete button (which does the same) elif event.data1 == nihia.buttons.get("CLEAR"): event.handled = True ui.delete() # Loop button (toggles loop recording on/off) elif event.data1 == nihia.buttons.get("LOOP"): event.handled = True transport.globalTransport(midi.FPT_LoopRecord, 1) # Metronome button elif event.data1 == nihia.buttons.get("METRO"): event.handled = True transport.globalTransport(midi.FPT_Metronome, 1) # Tempo button elif event.data1 == nihia.buttons.get("TEMPO"): event.handled = True transport.globalTransport(midi.FPT_TapTempo, 1) # Undo button elif event.data1 == nihia.buttons.get("UNDO"): event.handled = True general.undoUp() # Redo button elif event.data1 == nihia.buttons.get("REDO"): event.handled = True general.undo() # Quantize button # TODO: Not imlpemented yet in FL Studio MIDI API # # Instead, it changes between FL windows # TODO: The code is correctly written, but the ui.showWindow() method has a bug that causes the Piano roll and Browser windows not to # appear when invoked. It has been said it should be fixed in a future update. # ----------------------------------------------------------------------------------------------------------------------------------- # if event.data1 == nihia.buttons.get("QUANTIZE"): # global window # window += 1 # if window <= 4: # ui.showWindow(window) # print("if reached") # elif window > 4: # window = 0 # ui.showWindow(window) # ----------------------------------------------------------------------------------------------------------------------------------- # # Alternative implementation: Emulate the Fn buttons elif event.data1 == nihia.buttons.get("QUANTIZE"): event.handled = True global window2 window2 += 1 # Normal behaviour if the action ID is between the desired range if window2 <= 68 and window2 != 67: transport.globalTransport(window2, 1) # Skips the 67 value which calls the full screen plugin picker and calls the mixer instead elif window2 == 67: window2 += 1 transport.globalTransport(window2, 1) # Once window value is out of range, it sets it again to the first value in range elif window2 > 68: window2 = 64 transport.globalTransport(window2, 1) # Automation button # Enables and disables the recording automation events # TODO: Not implemented yet in FL Studio MIDI API # # Instead, it shows the full-screen plugin browser elif event.data1 == nihia.buttons.get("AUTO"): event.handled = True transport.globalTransport(midi.FPT_F8, 1) # Mute button - A-Series elif event.data1 == nihia.buttons.get("MUTE_SELECTED"): event.handled = True mixer.muteTrack(mixer.trackNumber()) # Solo button - A-Series elif event.data1 == nihia.buttons.get("SOLO_SELECTED"): event.handled = True mixer.soloTrack(mixer.trackNumber()) # Mute button - S-Series elif event.data1 == nihia.buttons.get("MUTE"): event.handled = True mixerMuteSoloHandler("MUTE", event.data2, mixer.trackNumber()) # Solo button - S-Series elif event.data1 == nihia.buttons.get("SOLO"): event.handled = True mixerMuteSoloHandler("SOLO", event.data2, mixer.trackNumber()) # 4D Encoder + elif event.data1 == nihia.buttons.get( "ENCODER_GENERAL") and event.data2 == nihia.buttons.get("PLUS"): event.handled = True # Mixer navigation (right) if ui.getFocused(midi.widMixer) == True: ui.right() # Playback jogging elif (ui.getFocused(midi.widPianoRoll) == True) or (ui.getFocused( midi.widPlaylist) == True): transport.setSongPos( transport.getSongPos(midi.SONGLENGTH_S) + 1, midi.SONGLENGTH_S) # General navigation else: ui.down() # 4D Encoder - elif event.data1 == nihia.buttons.get( "ENCODER_GENERAL") and event.data2 == nihia.buttons.get("MINUS"): event.handled = True # Mixer navigation if ui.getFocused(midi.widMixer) == True: ui.left() elif (ui.getFocused(midi.widPianoRoll) == True) or (ui.getFocused( midi.widPlaylist) == True): transport.setSongPos( transport.getSongPos(midi.SONGLENGTH_S) - 1, midi.SONGLENGTH_S) # General navigation else: ui.up() # 4D Encoder + (selected track volume) elif event.data1 == nihia.buttons.get( "ENCODER_VOLUME_SELECTED") and event.data2 == nihia.buttons.get( "PLUS"): event.handled = True mixer.setTrackVolume(mixer.trackNumber(), mixer.getTrackVolume(mixer.trackNumber()) + 0.01) # 4D Encoder - (selected track volume) elif event.data1 == nihia.buttons.get( "ENCODER_VOLUME_SELECTED") and event.data2 == nihia.buttons.get( "MINUS"): event.handled = True mixer.setTrackVolume(mixer.trackNumber(), mixer.getTrackVolume(mixer.trackNumber()) - 0.01) # 4D Encoder + (selected track pan) elif event.data1 == nihia.buttons.get( "ENCODER_PAN_SELECTED") and event.data2 == nihia.buttons.get( "PLUS"): event.handled = True mixer.setTrackPan(mixer.trackNumber(), mixer.getTrackPan(mixer.trackNumber()) + 0.01) # 4D Encoder + (selected track pan) elif event.data1 == nihia.buttons.get( "ENCODER_PAN_SELECTED") and event.data2 == nihia.buttons.get( "MINUS"): event.handled = True mixer.setTrackPan(mixer.trackNumber(), mixer.getTrackPan(mixer.trackNumber()) - 0.01) # 4D Encoder up elif event.data1 == encoderHandler( "Y") and event.data2 == nihia.buttons.get("UP"): event.handled = True ui.up() # 4D Encoder down elif event.data1 == encoderHandler( "Y") and event.data2 == nihia.buttons.get("DOWN"): event.handled = True ui.down() # 4D Encoder (using FPT because ui.left doesn't work on the playlist) elif event.data1 == encoderHandler( "X") and event.data2 == nihia.buttons.get("LEFT"): event.handled = True if ui.getFocused(midi.widMixer) == True: # This one doesn't move the mixer view as you get to the border # ---------------------------------------------------- # mixer.setTrackNumber(mixer.trackNumber() - 1) # ---------------------------------------------------- ui.left() else: ui.left() # 4D Encoder (using FPT because ui.right doesn't work on the playlist) elif event.data1 == encoderHandler( "X") and event.data2 == nihia.buttons.get("RIGHT"): event.handled = True if ui.getFocused(midi.widMixer) == True: # This one doesn't move the mixer view as you get to the border # ---------------------------------------------------- # mixer.setTrackNumber(mixer.trackNumber() + 1) # ---------------------------------------------------- ui.right() else: ui.right() # 4D Encoder button elif event.data1 == nihia.buttons.get("ENCODER_BUTTON"): event.handled = True ui.enter() # 4D Encoder button (shifted) elif event.data1 == nihia.buttons.get("ENCODER_BUTTON_SHIFTED"): event.handled = True transport.globalTransport(midi.FPT_Menu, 1) # Knobs # Normal knobs - increase values elif event.data1 == nihia.knobs.get( "KNOB_1A") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(0, "VOLUME", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_2A") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(1, "VOLUME", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_3A") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(2, "VOLUME", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_4A") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(3, "VOLUME", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_5A") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(4, "VOLUME", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_6A") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(5, "VOLUME", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_7A") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True # Handles track group 15 exception if math.trunc(1 / 8 * mixer.trackNumber()) == 15: return else: adjustMixer(6, "VOLUME", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_8A") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True # Handles track group 15 exception if math.trunc(1 / 8 * mixer.trackNumber()) == 15: return else: adjustMixer(7, "VOLUME", "INCREASE", mixer.trackNumber()) # Normal knobs - decrease values elif event.data1 == nihia.knobs.get( "KNOB_1A") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(0, "VOLUME", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_2A") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(1, "VOLUME", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_3A") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(2, "VOLUME", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_4A") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(3, "VOLUME", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_5A") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(4, "VOLUME", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_6A") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(5, "VOLUME", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_7A") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True # Handles track group 15 exception if math.trunc(1 / 8 * mixer.trackNumber()) == 15: return else: adjustMixer(6, "VOLUME", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_8A") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True # Handles track group 15 exception if math.trunc(1 / 8 * mixer.trackNumber()) == 15: return else: adjustMixer(7, "VOLUME", "DECREASE", mixer.trackNumber()) # Shifted knobs - increase values elif event.data1 == nihia.knobs.get( "KNOB_1B") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(0, "PAN", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_2B") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(1, "PAN", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_3B") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(2, "PAN", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_4B") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(3, "PAN", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_5B") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(4, "PAN", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_6B") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True adjustMixer(5, "PAN", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_7B") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True # Handles track group 15 exception if math.trunc(1 / 8 * mixer.trackNumber()) == 15: return else: adjustMixer(6, "PAN", "INCREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_8B") and event.data2 == nihia.knobs.get("INCREASE"): event.handled = True # Handles track group 15 exception if math.trunc(1 / 8 * mixer.trackNumber()) == 15: return else: adjustMixer(7, "PAN", "INCREASE", mixer.trackNumber()) # Shifted knobs - decrease values elif event.data1 == nihia.knobs.get( "KNOB_1B") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(0, "PAN", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_2B") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(1, "PAN", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_3B") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(2, "PAN", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_4B") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(3, "PAN", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_5B") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(4, "PAN", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_6B") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True adjustMixer(5, "PAN", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_7B") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True # Handles track group 15 exception if math.trunc(1 / 8 * mixer.trackNumber()) == 15: return else: adjustMixer(6, "PAN", "DECREASE", mixer.trackNumber()) elif event.data1 == nihia.knobs.get( "KNOB_8B") and event.data2 == nihia.knobs.get("DECREASE"): event.handled = True # Handles track group 15 exception if math.trunc(1 / 8 * mixer.trackNumber()) == 15: return else: adjustMixer(7, "PAN", "DECREASE", mixer.trackNumber())
def switch_moment(event): """handles momentary witch midi events""" if event.data1 == button["pad_mode_toggle"]: # This Rotates through pad modes - standard, step sequencer, pad to channel Switch.mode_toggle += 1 if Switch.mode_toggle == 4: Switch.mode_toggle = 0 print('Pad Mode: ' + mode[Switch.mode_toggle]) ui.setHintMsg(mode[Switch.mode_toggle]) elif event.midiId == 224: # pitch wheel Switch.pitch_num = event.data2 if Switch.shift_status == True: print(data.notes_list[int(mapvalues(Switch.pitch_num, 0, 11, 0, 244))]) elif event.data1 == button["play"]: transport.start() event.handled = True elif event.data1 == button["offset_range"]: Switch.offset_iter += 1 if Switch.offset_iter == 2: # 2 here will limit to 32 steps, knobs. Changing to 4 will allow up to 64 steps, knobs. Switch.offset_iter = 0 ui.setHintMsg("Offset Range: " + str(Switch.offset_iter)) elif event.data1 == button["stop"]: print('Stop') transport.stop() event.handled = True elif event.data1 == button["record"]: print('Record') transport.record() event.handled = True elif event.data1 == button["pattern_down"]: if ui.getFocused(5): print("Previous Preset") ui.previous() else: print('Pattern Down') transport.globalTransport(midi.FPT_PatternJog, -1) event.handled = True elif event.data1 == button["pattern_up"]: if ui.getFocused(5): print("Next Preset") ui.next() else: print('Pattern Up') transport.globalTransport(midi.FPT_PatternJog, 1) event.handled = True # Set mod wheel to control channels when channels focused and tracks when mixer elif event.data1 == button["mod_wheel"]: if ui.getFocused(0): mixer.setTrackNumber(int(mapvalues(event.data2, 0, 64, 0, 127))) ui.scrollWindow(midi.widMixer, mixer.trackNumber()) elif ui.getFocused(1): print("Channel Number: " + str(channels.selectedChannel())) channels.selectOneChannel(int(round(mapvalues(event.data2, channels.channelCount()-1, 0, 0, 127), 0))) elif event.data1 == 72: print(channels.getChannelColor(channels.selectedChannel())) Switch.color_num += 1 if Switch.color_num == len(colors): Switch.color_num = 0 if ui.getFocused(1): channels.setChannelColor(channels.selectedChannel(), colors[Switch.color_num]) elif ui.getFocused(0): mixer.setTrackColor(mixer.trackNumber(), colors[Switch.color_num]) event.handled = True elif event.data1 == button["enter"]: if ui.getFocused(4): print("Select Browser Item") ui.selectBrowserMenuItem() event.handled = True elif ui.getFocused(1): print("Mute Channel") channels.muteChannel(channels.selectedChannel()) elif ui.getFocused(0): print("Mute Track") mixer.muteTrack(mixer.trackNumber()) else: print('enter') ui.enter() event.handled = True elif event.data1 in range(59, 64) and config.PATTERN_JUMP_ON: # Sets jump to pattern patterns.jumpToPattern(event.data1 - 58) event.handled = True elif event.data1 in range(75, 80) and config.PATTERN_JUMP_ON: patterns.jumpToPattern(event.data1 - 69) event.handled = True elif event.data1 == button["solo"]: print('Solo') if ui.getFocused(0): mixer.soloTrack(mixer.trackNumber()) elif ui.getFocused(1): channels.soloChannel(channels.selectedChannel()) elif event.data1 == button["view_plugin_picker"]: print('View Plugin Picker') transport.globalTransport(midi.FPT_F8, 67) event.handled = True elif event.data1 == button["song_mode_toggle"]: print('Toggle Song and Pattern Mode') transport.setLoopMode() event.handled = True elif event.data1 == button["view_playlist"]: print('View Playlist') transport.globalTransport(midi.FPT_F5, 65) event.handled = True elif event.data1 == button["view_piano_roll"]: print('View Piano Roll') transport.globalTransport(midi.FPT_F7, 66) event.handled = True elif event.data1 == button["view_channel_rack"]: print('View Channel Rack') transport.globalTransport(midi.FPT_F6, 65) event.handled = True elif event.data1 == button["view_mixer"]: print('View Mixer') transport.globalTransport(midi.FPT_F9, 68) event.handled = True # Toggle through step parameter options - pitch, pan etc. No Shift control right now. elif event.data1 == button["step_parameter"]: if ui.getFocused(1) and Switch.mode_toggle == 1: print('Toggle Step Parameter') Switch.parameter += 1 if Switch.parameter == 7: Switch.parameter = 0 print(Switch.parameter) ui.setHintMsg(parameters[Switch.parameter]) elif ui.getFocused(0): Switch.mixer_num += 1 if Switch.mixer_num == 2: Switch.mixer_num = 0 print('Mixer Mode: ' + str(Switch.mixer_num)) ui.setHintMsg(mixer_choice[Switch.mixer_num]) event.handled = True elif event.data1 == button["open_channel_sampler"]: print('Open Sampler Channel') channels.showCSForm(channels.channelNumber(), -1) event.handled = True elif event.data1 == button["left"]: print('Left') ui.left() event.handled = True elif event.data1 == button["down"]: print('Down') ui.down() event.handled = True elif event.data1 == button["right"]: print('Right') ui.right() event.handled = True elif event.data1 == button["save"]: print('Save') transport.globalTransport(midi.FPT_Save, 92) # If mixer is open and mute mode selected, top row will mute respective track elif event.data1 == button["undo"]: print('Undo') transport.globalTransport(midi.FPT_Undo, 20) device.midiOutMsg(144, 1, 63, 80) event.handled = True elif event.data1 == button["escape"]: print('Escape') ui.escape() event.handled = True elif event.data1 == button["up"]: print('Up') ui.up() event.handled = True elif event.data1 == button["rotate_window"]: print('Rotate Window') ui.nextWindow() event.handled = True elif event.data1 == button["browser"]: print('Browser') if Switch.shift_status == False: if ui.getFocused(4): ui.hideWindow(4) event.handled = True else: ui.showWindow(4) ui.setFocused(4) event.handled = True elif event.data1 == button["step_rec"]: if ui.getFocused(0): mixer.armTrack(mixer.trackNumber()) print("Toggle Track Rec") else: transport.globalTransport(midi.FPT_StepEdit, 114) print('Step Record') event.handled = True elif event.data1 == button["quantize"]: print('quantize') channels.quickQuantize(channels.channelNumber()) event.handled = True elif event.data1 == button["link_chan"]: print('link channel') mixer.linkTrackToChannel(0) elif event.data1 == button["rand_steps"]: print("Random") print(f'Pitch Bend: {event.pitchBend}') for i in range(patterns.getPatternLength(patterns.patternNumber())): channels.setGridBit(channels.channelNumber(), i, 0) for z in range (patterns.getPatternLength(patterns.patternNumber())): y = num_gen() if y > ( Switch.pitch_num * 516): channels.setGridBit(channels.channelNumber(), z, 1) else: pass event.handled = True elif event.data1 == button["rand_notes"]: print("Randomize Notes") Switch.note_gen() event.handled = True
class MPDHandler(MPD26): port = None init_time = None last_pad_press_time = None last_stop_press_time = None button_map = 0 rewind = 0 fast_forward = 0 knob_last_position = 0 output = "" mode_change_unlocked = True selected_track = mixer.trackNumber() selected_channel = channels.channelNumber() octave = 4 """ Initialization """ def set_port_number(self): self.port = self.get_port_number() def set_init_time(self): self.init_time = self.get_timestamp() """ External accessors """ def get_port_number(self): return device.getPortNumber() def get_timestamp(self): return time.perf_counter() """ Utility methods """ def set_hint_message(self, message): if isinstance(message, str): ui.setHintMsg(message) else: print("self.setHintMessage error:\n " + "Param 'message' must be of type str.") """ Input handlers """ def handle_pad_press(self, event, pad): """ Put pad press code here. """ # CHANNEL RACK OMNI MODE if pad.bank == 'a': ui.showWindow(midi.widChannelRack) ui.setFocused(midi.widChannelRack) helpers.channelMidiNoteOn((pad.number - 1), 60, event) helpers.channelSelect(pad.number - 1) event.handled = True # FPC MODE elif pad.bank == 'b': # Check if there is an FPC instance pad_note = self.pads_fpc_note_map[pad.number] event.data1 = pad_note event.handled = False # Chromatic Mode elif pad.bank == 'c': if pad.number == 15: if self.octave >= 0: self.octave -= 1 self.output = 'Octave Shift: ' + str(self.octave) event.handled = True elif pad.number == 16: if self.octave <= 8: self.octave += 1 self.output = 'Octave Shift: ' + str(self.octave) event.handled = True else: pad_note = self.pads_chromatic_note_map[pad.number] pad_note_shifted_on = (12 * self.octave) + (12 + pad_note) event.data1 = pad_note_shifted_on event.handled = False # Function Mode (use pads to control the ui functions) elif pad.bank == 'd': if pad.number == 1: # enter button transport.globalTransport(midi.FPT_Enter, 80, event.pmeFlags - 1) self.output = 'Enter' elif pad.number == 2: # escape button transport.globalTransport(midi.FPT_Escape, 81, event.pmeFlags - 1) self.output = 'Escape' elif pad.number == 3: # cut button transport.globalTransport(midi.FPT_Cut, 2, event.pmeFlags - 1) self.output = 'Cut' elif pad.number == 4: print('menu') transport.globalTransport(midi.FPT_ItemMenu, 91) # Edison is focused if ui.getFocusedPluginName() == 'Edison': transport.globalTransport(midi.FPT_AddMarker, 33, event.pmeFlags - 1) self.output = 'Set Marker' # Default else: self.output = 'unasigned' elif pad.number == 5: # song/pattern transport.globalTransport(midi.FPT_Loop, 15, event.pmeFlags - 1) self.output = 'Toggle: Song/Pattern' elif pad.number == 6: # metronome transport.globalTransport(midi.FPT_Metronome, 112, event.pmeFlags - 1) self.output = 'Toggle: Metronome' elif pad.number == 7: # overdub transport.globalTransport(midi.FPT_Overdub, 112, event.pmeFlags - 1) self.output = 'Toggle: Overdub' elif pad.number == 8: # loop record transport.globalTransport(midi.FPT_LoopRecord, 113, event.pmeFlags - 1) self.output = 'Toggle: Loop Record' elif pad.number == 9: # open mixer ui.showWindow(midi.widMixer) ui.setFocused(midi.widMixer) self.output = 'Open: Mixer' elif pad.number == 10: # plugin picker transport.globalTransport(midi.FPT_F8, 67, event.pmeFlags - 1) elif pad.number == 11: # Browser - there is a bug and this doesn't work ui.setFocused(midi.widBrowser) self.output = 'Open: File Browser' elif pad.number == 12: # down ui.down() self.output = 'Down' elif pad.number == 13: # playlist view transport.globalTransport(midi.FPT_F5, 64, event.pmeFlags - 1) self.output = 'Open: Playlist' elif pad.number == 14: # open piano roll transport.globalTransport(midi.FPT_F7, 66, event.pmeFlags - 1) self.output = 'Open: Piano Roll' elif pad.number == 15: # open channel rack # transport.globalTransport(midi.FPT_F6, 65, event.pmeFlags-1) ui.showWindow(midi.widChannelRack) ui.setFocused(midi.widChannelRack) self.output = 'Open: Channel Rack' elif pad.number == 16: # up button ui.up() self.output = 'Up' event.handled = True print("Pressed pad " + str(pad.number) + ".") self.set_hint_message(self.output) def handle_pad_release(self, event, pad): """ Put pad release code here. """ # Omni Mode if pad.bank == 'a': pass # FPC MODE elif pad.bank == 'b': # Check if there is an FPC instance pad_note = self.pads_fpc_note_map[pad.number] event.data1 = pad_note event.handled = False # Chromatic Mode elif pad.bank == 'c': if pad.number <= 13: pad_note = self.pads_chromatic_note_map[pad.number] pad_note_shifted_off = (12 * self.octave) + (12 + pad_note) event.data1 = pad_note_shifted_off event.handled = False else: event.handled = True # Function Mode elif pad.bank == 'd': pass print("Released pad " + str(pad.number) + ".") self.set_hint_message(self.output) def handle_pad_pressure_change(self, event, pad, value): """ Put pad pressure change code here. """ print("Changed pad " + str(pad.number) + " pressure to " + str(value) + ".") event.handled = True def handle_nrpn_change(self, event, input, value): pass def handle_knob_change(self, event, knob, value): """ Put knob change code here. """ self.selected_channel = channels.selectedChannel() # Mixer Focused if (ui.getFocused(midi.widMixer) == 1): if knob.number != 1: offset = knob.number - 2 trackNum = helpers.getMixerTrackNum() helpers.mixerAdjustPan(trackNum + offset, event.data2) else: helpers.mixerAdjustPan(0, event.data2) event.handled = True # Everything else else: if knob.number == 1: ui.showWindow(midi.widChannelRack) ui.setFocused(midi.widChannelRack) helpers.channelAdjustPan(self.selected_channel, event.data2) elif knob.number == 2: ui.showWindow(midi.widChannelRack) ui.setFocused(midi.widChannelRack) helpers.channelAdjustVolume(self.selected_channel, event.data2) print("Changed knob " + str(knob.number) + " to " + str(value) + ".") def handle_slider_change(self, event, slider, value): """ Put slider change code here. """ # Sliders 2-6 ui.showWindow(midi.widMixer) ui.setFocused(midi.widMixer) if slider.number != 1: offset = slider.number - 2 trackNum = helpers.getMixerTrackNum() helpers.mixerAdjustFader(trackNum + offset, event.data2) # Slider 1 always controls the master mixer volume else: helpers.mixerAdjustFader(0, event.data2) print("Changed slider " + str(slider.number) + " to " + str(value) + ".") #self.set_hint_message(self.output) event.handled = True def handle_backward_press(self, event, backward): """ Put backward press code here. """ # Mixer Mode if ui.getFocused(0) == 1: ui.previous() self.output = "Mixer: Selected next track: " + helpers.getMixerTrackName( self.selected_track - 1) # Edison is focused elif ui.getFocusedPluginName() == "Edison": ui.jog(-1) self.output = "Jog Back" # Default Mode else: self.output = "Previous" ui.previous() self.set_hint_message(self.output) print("Pressed backward button.") event.handled = True def handle_forward_press(self, event, forward): """ Put forward press code here. """ # Mixer Mode if ui.getFocused(0) == 1: ui.next() self.output = "Mixer: Selected next track: " + helpers.getMixerTrackName( self.selected_track + 1) # Edison is focused elif ui.getFocusedPluginName() == "Edison": ui.jog(1) self.output = "Jog Forward" # Default Mode else: self.output = "Next" ui.next() self.set_hint_message(self.output) print("Pressed forward button." + str(forward.on)) event.handled = True def handle_stop_press(self, event, stop): """ Put stop press code here. """ print(ui.getFocusedPluginName()) transport.stop() self.output = "Transport: Stop" self.set_hint_message(self.output) print("Pressed stop button.") event.handled = True def handle_play_press(self, event, play): """ Put play press code here. """ transport.start() if transport.isPlaying() == 1: self.output = "Transport: Play" else: self.output = "Transport: Paused at " + transport.getSongPosHint() self.set_hint_message(self.output) print("Pressed play button.") event.handled = True def handle_rec_press(self, event, rec): """ Put rec press code here. """ # Mixer Mode if ui.getFocused(0) == 1: selectedTrack = mixer.trackNumber() mixer.armTrack(selectedTrack) self.output = "Mixer: Armed track: " + helpers.getMixerTrackName( selectedTrack) # Default Mode else: transport.record() if transport.isRecording() == 1: self.output = "Transport: Recording Enabled" else: self.output = "Transport: Recording Disabled" self.set_hint_message(self.output) print("Pressed rec button.") event.handled = True """ Other event handlers """ def handle_beat(self, value): """ Respond to beat indicators. Value is 1 at bar, 2 at beat, 0 at off. """ pass