def step_param(self): self.pattern = patterns.patternNumber() self.parameter = switch.Switch.parameter self.pad_step = notes.temp_step[0] self.step = 0 self.nothing = 0 if Switch.mode_toggle == 3 and self.event_one < 27 and ui.getFocused(1): # check if param entry mode is on and make sure knob is not out of parameter range print('in param knob mode') ui.setHintMsg(parameters[self.event_one -20]) if 6 <= self.event_one - 20 >= 5: channels.setStepParameterByIndex(self.channel, self.pattern, self.pad_step - 60, self.event_one - 20, int(mapvalues(self.data_two, 0 , 255, 0, 127)), 1) elif self.event_one - 20 == 3: channels.setStepParameterByIndex(self.channel, self.pattern, self.pad_step - 60, self.event_one - 20, int(mapvalues(self.data_two, 0 , 240, 0, 127)), 1) else: channels.setStepParameterByIndex(self.channel, self.pattern, self.pad_step - 60, self.event_one - 20, self.data_two, 1) if channels.getGridBit(channels.channelNumber(), self.data_one - 20) == 1 and Switch.mode_toggle == 1 and Switch.shift_status == False: # print(f'Switch Mode toggle: {Switch.mode_toggle}') print("getGridBit gotten") if 6 <= self.parameter >= 5: channels.setStepParameterByIndex(self.channel, self.pattern, self.data_one - 20, self.parameter, int(mapvalues(self.data_two, 0 , 255, 0, 127)), 1) elif self.parameter == 3: channels.setStepParameterByIndex(self.channel, self.pattern, self.data_one - 20, self.parameter, int(mapvalues(self.data_two, 0 , 240, 0, 127)), 1) else: channels.setStepParameterByIndex(channels.channelNumber(), patterns.patternNumber(), self.data_one - 20, self.parameter, self.data_two, 1)
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 processMenuMode(command): if command.is_lift: coord = [command.coord_X, command.coord_Y] # Next/prev track if coord == [0, 0]: ui.previous() command.handle("Channel Rack: Previous channel") elif coord == [0, 1]: ui.next() command.handle("Channel Rack: Next channel") # Cut, Copy, Paste elif coord == [2, 0]: ui.cut() command.handle("UI: Cut") elif coord == [3, 0]: ui.copy() command.handle("UI: Copy") elif coord == [4, 0]: ui.paste() command.handle("UI: Paste") # To piano roll elif coord == [7, 1]: ui.showWindow(internal.consts.WINDOW_PIANO_ROLL) command.handle("Sent to pianoroll") # Plugin window elif coord == [6, 1]: channels.showEditor(channels.channelNumber()) command.handle("Opened plugin window")
def drawHighlight(self): current_ch = channels.channelNumber() left = 8 * self.scroll right = 8 * self.zoom top = current_ch bottom = 1 ui.crDisplayRect(left, top, right, bottom, 1000)
def allNotesOff(self): """Remove all notes from the list """ ch_index = channels.channelNumber() self.notes_list = [[] for _ in range(128)] self.active_notes = [0 for _ in range(128)] # Send note off to all notes for x in range(128): channels.midiNoteOn(ch_index, x, 0)
def noteOn(self, ext_note): """Add a note to the list Args: ext_note (ExtensibleNote): The note (and its extensions) to add """ ch_index = channels.channelNumber() # Push note onto list self.notes_list[ext_note.root.data1].append(ext_note) # Set root note to on - don't need to - FL does this for us # channels.midiNoteOn(ch_index, ext_note.root.data1, ext_note.root.data2) for note in ext_note.extended_notes: if self.active_notes[note.data1]: channels.midiNoteOn(ch_index, note.data1, 0) channels.midiNoteOn(ch_index, note.data1, note.data2) self.active_notes[note.data1] += 1
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 handleJog(self, encoder, event): display_message = '' display_value = None i = encoder.index jogmap = self.encoderJogs[controls.shift.value] if i in jogmap: target, display_message = jogmap[i] fpt.callFPT(target, encoder.value, event) direction = '>' if encoder.value > 0 else '<' display_message += ' ' + direction elif i == 4: selected_track = self.moveSelectedMixerTrack(encoder.value) display_message = mixer.getTrackName(selected_track) display_value = selected_track elif i == 5: selected_pattern = (patterns.patternNumber() + encoder.value) % patterns.patternMax() patterns.jumpToPattern(selected_pattern) display_message = patterns.getPatternName(selected_pattern) display_value = selected_pattern elif i == 6: group_channel_count = channels.channelCount(0) current_channel = channels.channelNumber(0) selected_group_index = self.cycleChannels( current=0, count=group_channel_count, condition_func=lambda c: channels.getChannelIndex( c) == current_channel) or 0 selected_index = (selected_group_index + encoder.value) % group_channel_count channels.deselectAll() channels.selectChannel(selected_index) display_message = channels.getChannelName(selected_index) display_value = selected_index self.lcdText(display_message) if display_value: self.lcdValueText(display_value)
def noteOff(self, note): """Remove a note from the notes list Args: note (RawEvent): The note to lift """ ch_index = channels.channelNumber() note_num = note.data1 # Don't need to turn root note off - FL does this for us # channels.midiNoteOn(ch_index, note_num, 0) # Get ext_note from list - return early if list is empty if len(self.notes_list[note_num]) == 0: return ext_note = self.notes_list[note_num].pop() # Loop through and turn off any notes that were associated with that note for enote in ext_note.extended_notes: self.active_notes[enote.data1] -= 1 if not self.active_notes[enote.data1]: channels.midiNoteOn(ch_index, enote.data1, 0)
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 __init__(self, event): global proceed self.event = event global temp_chan proceed = False self.mode_toggle = Switch.mode_toggle # self.mixer_num = mixer.trackNumber() self.channel = channels.channelNumber() self.round_offset = 0.16 self.get_track_value = 0 self.data_one = event.data1 + offset[switch.Switch.offset_iter] self.data_two = event.data2 self.two_rounded = round(self.data_two/127, 2) self.plugin = 0 self.event_one = event.data1 print('knob class') if ui.getFocused(1) and Switch.shift_status == True: print('enter step param edit in turning') if event.data1 == knob['knob_one']: Switch.root_note = int(mapvalues(self.data_two, 0, 11, 0, 127)) ui.setHintMsg(data.notes_list [int(mapvalues(self.data_two, 0, 11, 0, 127)) ] ) print(Switch.root_note) event.handled = True if event.data1 == knob['knob_two']: Switch.scale_choice = int(mapvalues(self.data_two, 0, len(data.scale_names)-1, 0, 127)) ui.setHintMsg(data.scale_names[int(mapvalues(self.data_two, 0, len(data.scale_names)-1, 0, 127))]) print(Switch.scale_choice) event.handled = True if event.data1 == knob['knob_three']: Switch.lower_limit = int(mapvalues(self.data_two, 0, 25, 0, 127)) ui.setHintMsg("Setting Lower Limit") print(Switch.lower_limit) event.handled = True if event.data1 == knob['knob_four']: Switch.upper_limit = int(mapvalues(self.data_two, 50, 0, 0, 127)) ui.setHintMsg("Setting Upper Limit") print(Switch.upper_limit) event.handled = True elif ui.getFocused(5) and plugins.isValid(self.channel): print('plugin control') self.plugin_control() elif ui.getFocused(0) and proceed == False: # This stores the current value at the destination of the knob # print('proceed false mixer focused') if Switch.mixer_num == 0: if mixer.trackNumber() == 0: # Check if master is selected self.get_track_value = mixer.getTrackVolume(0) else: self.get_track_value = mixer.getTrackVolume(self.data_one - 19) elif Switch.mixer_num == 1: # print('store panning info') self.get_track_value = mixer.getTrackPan(self.data_one-19) print(self.get_track_value) self.two_rounded = mapvalues(self.data_two, -1.0, 1.0, 0, 127) print(self.two_rounded) elif ui.getFocused(1) and Switch.shift_status == False: # print('stored channel') if self.mode_toggle != 1 and self.mode_toggle != 3: if self.data_one-20 < channels.channelCount(): self.get_track_value = channels.getChannelVolume(self.data_one-20) else: # print('go to step parameter function') self.step_param() # Knob must match current value before it engages. if self.two_rounded <= (self.get_track_value + self.round_offset) and self.two_rounded >= (self.get_track_value - self.round_offset): print("matched") proceed = True temp_chan = self.data_one # print(f'temp chan: {temp_chan}') if switch.Switch.mode_toggle != 1 and Switch.mode_toggle != 3 or ui.getFocused(1)==False: # print('enter knob turn function') self.knob_turn()
def current_channel_toggle_mute(unused_param_value): """Mute channel""" current = channels.channelNumber() if current >= 0: channels.muteChannel(current)
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 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 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 toggle_plugin_visibility(unused_param_value): """Toggle plugin""" if SCRIPT_VERSION >= 9: channels.showCSForm(channels.channelNumber(), -1) else: channels.focusEditor(channels.channelNumber())
def selectMixerTrackChannel(self, track_index): current = channels.channelNumber() count = channels.channelCount() return self.cycleChannels( current, count, lambda i: channels.getTargetFxTrack(i) == track_index)
def channel_rack_up(unused_param_value): """Channelrack up""" select = (channels.channelNumber() - 1) % channels.channelCount() channels.deselectAll() channels.selectChannel(select, 1)
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
def UpdateOLED(self): if (ui.getFocused(0) == 1) == True: #mixer volume control #spells out 'Mixer' on tracks 1 through 8 on OLED device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x00, 0x4D, 0x69, 0x78, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x01, 0x4D, 0x69, 0x78, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x02, 0x4D, 0x69, 0x78, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x03, 0x4D, 0x69, 0x78, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x04, 0x4D, 0x69, 0x78, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x05, 0x4D, 0x69, 0x78, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x06, 0x4D, 0x69, 0x78, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x07, 0x4D, 0x69, 0x78, 0x65, 0x72, 0xF7])) if mixer.isTrackEnabled(mixer.trackNumber()) == 1: #mute light off device.midiOutSysex(bytes([0x00, 0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x43, 0x00, 0x00, 0xF7])) KompleteDataOut(0x66, 0x00) elif mixer.isTrackEnabled(mixer.trackNumber()) == 0: #mute light on device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x43, 0x01, 0x00, 0xF7])) KompleteDataOut(0x66, 0x01) #if (mixer.isTrackSolo(mixer.trackNumber()) == 1) == True: trying to figure out how to turn off solo when mute turns on the same track # if mixer.isTrackEnabled(mixer.trackNumber()) == False: # device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x44, 0x01, 0x00, 0xF7])) # KompleteDataOut(0x69, 0x01) if (mixer.isTrackSolo(mixer.trackNumber()) == 0) == True: #solo light off device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x44, 0x00, 0x00, 0xF7])) KompleteDataOut(0x69, 0x00) elif (mixer.isTrackSolo(mixer.trackNumber()) == 1) == True: #solo light on device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x44, 0x01, 0x00, 0xF7])) KompleteDataOut(0x69, 0x01) if (ui.getFocused(1) == 1) == True: # channel rack #spells out 'Ch. Rack' on tracks 1 through 8 on OLED device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x00, 0x43, 0x68, 0x2E, 0x20, 0x52, 0x61, 0x63, 0x6B, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x01, 0x43, 0x68, 0x2E, 0x20, 0x52, 0x61, 0x63, 0x6B, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x02, 0x43, 0x68, 0x2E, 0x20, 0x52, 0x61, 0x63, 0x6B, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x03, 0x43, 0x68, 0x2E, 0x20, 0x52, 0x61, 0x63, 0x6B, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x04, 0x43, 0x68, 0x2E, 0x20, 0x52, 0x61, 0x63, 0x6B, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x05, 0x43, 0x68, 0x2E, 0x20, 0x52, 0x61, 0x63, 0x6B, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x06, 0x43, 0x68, 0x2E, 0x20, 0x52, 0x61, 0x63, 0x6B, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x07, 0x43, 0x68, 0x2E, 0x20, 0x52, 0x61, 0x63, 0x6B, 0xF7])) if channels.isChannelMuted(channels.channelNumber()) == 1: #mute light off device.midiOutSysex(bytes([0x00, 0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x43, 0x00, 0x00, 0xF7])) KompleteDataOut(0x66, 0x00) elif channels.isChannelMuted(channels.channelNumber()) == 0: #mute light on device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x43, 0x01, 0x00, 0xF7])) KompleteDataOut(0x66, 0x01) #if (mixer.isTrackSolo(mixer.trackNumber()) == 1) == True: trying to figure out how to turn off solo when mute turns on the same track # if mixer.isTrackEnabled(mixer.trackNumber()) == False: # device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x44, 0x01, 0x00, 0xF7])) # KompleteDataOut(0x69, 0x01) if channels.channelCount() >= 2: if (channels.isChannelSolo(channels.channelNumber()) == 0) == True: #solo light off device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x44, 0x00, 0x00, 0xF7])) KompleteDataOut(0x69, 0x00) elif (channels.isChannelSolo(channels.channelNumber()) == 1) == True: #solo light on device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x44, 0x01, 0x00, 0xF7])) KompleteDataOut(0x69, 0x01) if (ui.getFocused(2) == 1) == True: # playlist #spells out 'Playlist' on tracks 1 through 8 on OLED device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x00, 0x50, 0x6C, 0x61, 0x79, 0x6C, 0x69, 0x73, 0x74, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x01, 0x50, 0x6C, 0x61, 0x79, 0x6C, 0x69, 0x73, 0x74, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x02, 0x50, 0x6C, 0x61, 0x79, 0x6C, 0x69, 0x73, 0x74, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x03, 0x50, 0x6C, 0x61, 0x79, 0x6C, 0x69, 0x73, 0x74, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x04, 0x50, 0x6C, 0x61, 0x79, 0x6C, 0x69, 0x73, 0x74, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x05, 0x50, 0x6C, 0x61, 0x79, 0x6C, 0x69, 0x73, 0x74, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x06, 0x50, 0x6C, 0x61, 0x79, 0x6C, 0x69, 0x73, 0x74, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x07, 0x50, 0x6C, 0x61, 0x79, 0x6C, 0x69, 0x73, 0x74, 0xF7])) if (ui.getFocused(3) == 11) == True: # piano roll #disabled #spells out 'Piano Roll' on tracks 1 through 8 on OLED device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x00, 0x50, 0x69, 0x61, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6C, 0x6C, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x01, 0x50, 0x69, 0x61, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6C, 0x6C, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x02, 0x50, 0x69, 0x61, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6C, 0x6C, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x03, 0x50, 0x69, 0x61, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6C, 0x6C, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x04, 0x50, 0x69, 0x61, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6C, 0x6C, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x05, 0x50, 0x69, 0x61, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6C, 0x6C, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x06, 0x50, 0x69, 0x61, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6C, 0x6C, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x07, 0x50, 0x69, 0x61, 0x6E, 0x6F, 0x20, 0x52, 0x6F, 0x6C, 0x6C, 0xF7])) if (ui.getFocused(4) == 11) == True: # piano roll # disabled #spells out 'Piano Roll' on tracks 1 through 8 on OLED device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x00, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x01, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x02, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x03, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x04, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x05, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x06, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0xF7])) device.midiOutSysex(bytes([0xF0, 0x00, 0x21, 0x09, 0x00, 0x00, 0x44, 0x43, 0x01, 0x00, 0x48, 0x00, 0x07, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x72, 0xF7]))
def channel_rack_down(unused_param_value): """Channelrack down""" select = (channels.channelNumber() + 1) % channels.channelCount() channels.deselectAll() channels.selectChannel(select, 1)
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
def OnMidiIn(self, event): # print ("Event: {:X} {:X} {:2X} {} {:2X}".format(event.status, event.data1, event.data2, EventNameT[(event.status - 0x80) // 16] + ': '+ utils.GetNoteName(event.data1), int(hex(event.data2), 16))) # Create output string output = "" event.handled = False global loopDown global loopInterrupt # Set has snapped flag hasSnapped = False # Process Long Presses: # Stop Button if (event.status is 0xB0 and event.data1 is 0x2E): global stop_PressTime global stop_LiftTime # Press - Start timer if event.data2 is 0x7F: stop_PressTime = time.perf_counter() # Lift - Stop timer elif event.data2 is 0x00: stop_LiftTime = time.perf_counter() if (stop_LiftTime - stop_PressTime) >= LONG_PRESS_TIME: ui.escape() output += "UI: Escape" event.handled = True if event.handled is True: handleOutput(output) return # In popup if ui.isInPopupMenu() is 1 and loopDown is False: output += "[In popup menu] " # Currently this is always inactive? if event.handled is True: handleOutput(output) return # In Playlist if ui.getFocused(2) is 1 and loopDown is False: # Forward Button if (event.status is 0xB0 and event.data1 is 0x30): # Press - No action if markers exist if event.data2 is 0x7F and arrangement.getMarkerName( 0) is not "": event.handled = True # Lift - Skip to next marker, only if markers exist elif event.data2 is 0x00 and arrangement.getMarkerName( 0) is not "": transport.markerJumpJog(1) output += "Transport: Jump to next marker" event.handled = True # Back Button if (event.status is 0xB0 and event.data1 is 0x2F): # Press - No action if markers exist if event.data2 is 0x7F and arrangement.getMarkerName( 0) is not "": event.handled = True # Lift - Skip to previous marker, only if markers exist elif event.data2 is 0x00 and arrangement.getMarkerName( 0) is not "": transport.markerJumpJog(-1) output += "Transport: Jump to previous marker" event.handled = True if event.handled is True: handleOutput(output) return # In Mixer if ui.getFocused(0) is 1 and loopDown is False: selectedTrack = mixer.trackNumber() # Record Button if (event.status is 0xB0 and event.data1 is 0x2C): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Toggle track arm elif event.data2 is 0x00: mixer.armTrack(selectedTrack) if mixer.isTrackArmed(selectedTrack) is 1: output += "Mixer: Armed track: " + getMixerTrackName( selectedTrack) else: output += "Mixer: Disarmed track: " + getMixerTrackName( selectedTrack) event.handled = True # Forward Button if (event.status is 0xB0 and event.data1 is 0x30): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Next track elif event.data2 is 0x00: ui.next() output += "Mixer: Selected next track: " + getMixerTrackName( selectedTrack + 1) event.handled = True # Back Button if (event.status is 0xB0 and event.data1 is 0x2F): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Previous track elif event.data2 is 0x00: ui.previous() output += "Mixer: Selected previous track: " + getMixerTrackName( selectedTrack - 1) event.handled = True # Fader, knob and buttons #9 act on the selected track # Upper button 9 if (event.status is 0xB0 and (event.data1 is 0x1F or event.data1 is 0x4B or event.data1 is 0x73)) or (event.status is 0xB8 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or event.status is 0xB8: output += mixerToggleSolo(selectedTrack) event.handled = True # Lower button 9 if (event.status is 0xB0 and (event.data1 is 0x29 or event.data1 is 0x54 or event.data1 is 0x7C)) or (event.status is 0xB8 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or event.status is 0xB8: output += mixerToggleMute(selectedTrack) event.handled = True # Fader 9 - Selected volume if (event.status is 0xB0 and (event.data1 is 0x0D or event.data1 is 0x38 or event.data1 is 0x5D)) or (event.status is 0xB8 and event.data1 is 0x07): output += mixerAdjustFader(selectedTrack, event.data2) event.handled = True # Knob 9 - Selected pan if (event.status is 0xB0 and (event.data1 is 0x16 or event.data1 is 0x42 or event.data1 is 0x6A)) or (event.status is 0xB8 and event.data1 is 0x0A): output += mixerAdjustPan(selectedTrack, event.data2) event.handled = True # Faders, knobs and buttons #1-8 act on tracks 1-8 respectively # Upper button 1 if (event.status is 0xB0 and (event.data1 is 0x17 or event.data1 is 0x43 or event.data1 is 0x6B)) or (event.status is 0xB0 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB0 and event.data1 is 0x10 and event.data2 is 0x7F): output += mixerToggleSolo(1) event.handled = True # Lower button 1 if (event.status is 0xB0 and (event.data1 is 0x21 or event.data1 is 0x4C or event.data1 is 0x74)) or (event.status is 0xB0 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB0 and event.data1 is 0x11 and event.data2 is 0x7F): output += mixerToggleMute(1) event.handled = True # Upper button 2 if (event.status is 0xB0 and (event.data1 is 0x18 or event.data1 is 0x44 or event.data1 is 0x6C)) or (event.status is 0xB1 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB1 and event.data1 is 0x10): output += mixerToggleSolo(2) event.handled = True # Lower button 2 if (event.status is 0xB0 and (event.data1 is 0x22 or event.data1 is 0x4D or event.data1 is 0x75)) or (event.status is 0xB1 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB2 and event.data1 is 0x11): output += mixerToggleMute(2) event.handled = True # Upper button 3 if (event.status is 0xB0 and (event.data1 is 0x19 or event.data1 is 0x45 or event.data1 is 0x6D)) or (event.status is 0xB2 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB2 and event.data1 is 0x10): output += mixerToggleSolo(3) event.handled = True # Lower button 3 if (event.status is 0xB0 and (event.data1 is 0x23 or event.data1 is 0x4E or event.data1 is 0x76)) or (event.status is 0xB2 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB2 and event.data1 is 0x11): output += mixerToggleMute(3) event.handled = True # Upper button 4 if (event.status is 0xB0 and (event.data1 is 0x1A or event.data1 is 0x46 or event.data1 is 0x6E)) or (event.status is 0xB3 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB3 and event.data1 is 0x10): output += mixerToggleSolo(4) event.handled = True # Lower button 4 if (event.status is 0xB0 and (event.data1 is 0x24 or event.data1 is 0x4F or event.data1 is 0x77)) or (event.status is 0xB3 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB3 and event.data1 is 0x11): output += mixerToggleMute(4) event.handled = True # Upper button 5 if (event.status is 0xB0 and (event.data1 is 0x1B or event.data1 is 0x47 or event.data1 is 0x6F)) or (event.status is 0xB4 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB4 and event.data1 is 0x10): output += mixerToggleSolo(5) event.handled = True # Lower button 5 if (event.status is 0xB0 and (event.data1 is 0x25 or event.data1 is 0x50 or event.data1 is 0x78)) or (event.status is 0xB4 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB4 and event.data1 is 0x11): output += mixerToggleMute(5) event.handled = True # Upper button 6 if (event.status is 0xB0 and (event.data1 is 0x1C or event.data1 is 0x48 or event.data1 is 0x70)) or (event.status is 0xB5 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB5 and event.data1 is 0x10): output += mixerToggleSolo(6) event.handled = True # Lower button 6 if (event.status is 0xB0 and (event.data1 is 0x26 or event.data1 is 0x51 or event.data1 is 0x79)) or (event.status is 0xB5 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB5 and event.data1 is 0x11): output += mixerToggleMute(6) event.handled = True # Upper button 7 if (event.status is 0xB0 and (event.data1 is 0x1D or event.data1 is 0x49 or event.data1 is 0x71)) or (event.status is 0xB6 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB6 and event.data1 is 0x10): output += mixerToggleSolo(7) event.handled = True # Lower button 7 if (event.status is 0xB0 and (event.data1 is 0x27 or event.data1 is 0x52 or event.data1 is 0x7A)) or (event.status is 0xB6 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB6 and event.data1 is 0x11): output += mixerToggleMute(7) event.handled = True # Upper button 8 if (event.status is 0xB0 and (event.data1 is 0x1E or event.data1 is 0x4A or event.data1 is 0x72)) or (event.status is 0xB7 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB7 and event.data1 is 0x10): output += mixerToggleSolo(8) event.handled = True # Lower button 8 if (event.status is 0xB0 and (event.data1 is 0x28 or event.data1 is 0x53 or event.data1 is 0x7B)) or (event.status is 0xB7 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or (event.status is 0xB7 and event.data1 is 0x11): output += mixerToggleMute(8) event.handled = True # Fader 1 - Track 1 volume if event.status is 0xB0 and (event.data1 is 0x02 or event.data1 is 0x2A or event.data1 is 0x55 or event.data1 is 0x07): output += mixerAdjustFader(1, event.data2) event.handled = True # Knob 1 - Track 1 pan if event.status is 0xB0 and (event.data1 is 0x0E or event.data1 is 0x39 or event.data1 is 0x5E or event.data1 is 0x0A): output += mixerAdjustPan(1, event.data2) event.handled = True # Fader 2 - Track 2 volume if (event.status is 0xB0 and (event.data1 is 0x03 or event.data1 is 0x2B or event.data1 is 0x56)) or (event.status is 0xB1 and event.data1 is 0x07): output += mixerAdjustFader(2, event.data2) event.handled = True # Knob 2 - Track 2 pan if (event.status is 0xB0 and (event.data1 is 0x0F or event.data1 is 0x3A or event.data1 is 0x5F)) or (event.status is 0xB1 and event.data1 is 0x0A): output += mixerAdjustPan(2, event.data2) event.handled = True # Fader 3 - Track 3 volume if (event.status is 0xB0 and (event.data1 is 0x04 or event.data1 is 0x32 or event.data1 is 0x57)) or (event.status is 0xB2 and event.data1 is 0x07): output += mixerAdjustFader(3, event.data2) event.handled = True # Knob 3 - Track 3 pan if ((event.status is 0xB0 and (event.data1 is 0x10 or event.data1 is 0x3B or event.data1 is 0x60)) or (event.status is 0xB2 and event.data1 is 0x0A)) and event.handled is False: output += mixerAdjustPan(3, event.data2) event.handled = True # Fader 4 - Track 4 volume if (event.status is 0xB0 and (event.data1 is 0x05 or event.data1 is 0x33 or event.data1 is 0x58)) or (event.status is 0xB3 and event.data1 is 0x07): output += mixerAdjustFader(4, event.data2) event.handled = True # Knob 4 - Track 4 pan if ((event.status is 0xB0 and (event.data1 is 0x11 or event.data1 is 0x3C or event.data1 is 0x61)) or (event.status is 0xB3 and event.data1 is 0x0A)) and event.handled is False: output += mixerAdjustPan(4, event.data2) event.handled = True # Fader 5 - Track 5 volume if (event.status is 0xB0 and (event.data1 is 0x06 or event.data1 is 0x34 or event.data1 is 0x59)) or (event.status is 0xB4 and event.data1 is 0x07): output += mixerAdjustFader(5, event.data2) event.handled = True # Knob 5 - Track 5 pan if (event.status is 0xB0 and (event.data1 is 0x12 or event.data1 is 0x3D or event.data1 is 0x66)) or (event.status is 0xB4 and event.data1 is 0x0A): output += mixerAdjustPan(5, event.data2) event.handled = True # Fader 6 - Track 6 volume if (event.status is 0xB0 and (event.data1 is 0x08 or event.data1 is 0x35 or event.data1 is 0x5A)) or (event.status is 0xB5 and event.data1 is 0x07): output += mixerAdjustFader(1, event.data2) event.handled = True # Knob 6 - Track 6 pan if (event.status is 0xB0 and (event.data1 is 0x13 or event.data1 is 0x3E or event.data1 is 0x67)) or (event.status is 0xB5 and event.data1 is 0x0A): output += mixerAdjustPan(6, event.data2) event.handled = True # Fader 7 - Track 7 volume if (event.status is 0xB0 and (event.data1 is 0x09 or event.data1 is 0x36 or event.data1 is 0x5B)) or (event.status is 0xB6 and event.data1 is 0x07): output += mixerAdjustFader(1, event.data2) event.handled = True # Knob 7 - Track 7 pan if (event.status is 0xB0 and (event.data1 is 0x14 or event.data1 is 0x3F or event.data1 is 0x68)) or (event.status is 0xB6 and event.data1 is 0x0A): output += mixerAdjustPan(7, event.data2) event.handled = True # Fader 8 - Track 8 volume if (event.status is 0xB0 and (event.data1 is 0x0C or event.data1 is 0x37 or event.data1 is 0x5C)) or (event.status is 0xB7 and event.data1 is 0x07): output += mixerAdjustFader(1, event.data2) event.handled = True # Knob 8 - Track 8 pan if (event.status is 0xB0 and (event.data1 is 0x15 or event.data1 is 0x41 or event.data1 is 0x69)) or (event.status is 0xB7 and event.data1 is 0x0A): output += mixerAdjustPan(8, event.data2) event.handled = True if event.handled is True: handleOutput(output) return # In Channel rack if ui.getFocused(1) is 1 and loopDown is False: selectedChannel = channels.channelNumber() # Forward Button if (event.status is 0xB0 and event.data1 is 0x30): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Next track elif event.data2 is 0x00: ui.next() mixerTrackSelect(channels.channelNumber()) output += "Channel rack: Select next track: " + getChannelName( channels.channelNumber()) event.handled = True # Back Button if (event.status is 0xB0 and event.data1 is 0x2F): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Previous track elif event.data2 is 0x00: ui.previous() mixerTrackSelect(channels.channelNumber()) output += "Channel rack: Select previous track: " + getChannelName( channels.channelNumber()) event.handled = True # Fader, knob and buttons #9 act on the selected channel # Upper button 9 if (event.status is 0xB0 and (event.data1 is 0x1F or event.data1 is 0x4B or event.data1 is 0x73)) or (event.status is 0xB8 and event.data1 is 0x10): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Solo channel (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or event.status is 0xB8: output += channelToggleSolo(selectedChannel) event.handled = True # Lower button 9 if (event.status is 0xB0 and (event.data1 is 0x29 or event.data1 is 0x54 or event.data1 is 0x7C)) or (event.status is 0xB8 and event.data1 is 0x11): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Mute track (in scene 4, the buttons toggle automatically) if event.data2 is 0x00 or event.status is 0xB8: output += channelToggleMute(selectedChannel) event.handled = True # Fader 9 - Selected volume if (event.status is 0xB0 and (event.data1 is 0x0D or event.data1 is 0x38 or event.data1 is 0x5D)) or (event.status is 0xB8 and event.data1 is 0x07): output += channelAdjustVolume(selectedChannel, event.data2) event.handled = True # Knob 9 - Selected pan if (event.status is 0xB0 and (event.data1 is 0x16 or event.data1 is 0x42 or event.data1 is 0x6A)) or (event.status is 0xB8 and event.data1 is 0x0A): output += channelAdjustPan(selectedChannel, event.data2) event.handled = True # Maybe include step editor here (when I figure out lights) if event.handled is True: handleOutput(output) return # In Browser if ui.getFocused(4) is 1 and loopDown is False: # Play Button if (event.status is 0xB0 and event.data1 is 0x2D): # Press - Play sample/expand menu if event.data2 is 0x7F: ui.next() ui.previous() ui.right() output += "Browser: Select" event.handled = True # Lift - No action elif event.data2 is 0x00: event.handled = True # Forward Button if (event.status is 0xB0 and event.data1 is 0x30): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Next item elif event.data2 is 0x00: ui.next() output += "Browser: Next" event.handled = True # Back Button if (event.status is 0xB0 and event.data1 is 0x2F): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Previous item elif event.data2 is 0x00: ui.previous() output += "Browser: Previous" event.handled = True # Stop Button if (event.status is 0xB0 and event.data1 is 0x2E): # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Collapse menu elif event.data2 is 0x00: ui.left() output += "Browser: Collapse" event.handled = True if event.handled is True: handleOutput(output) return # Default Actions: # Play Button if (event.status is 0xB0 and event.data1 is 0x2D): loopInterrupt = True # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Play/Pause elif event.data2 is 0x00: transport.start() if transport.isPlaying() is 1: output += "Transport: Play" else: output += "Transport: Pause" event.handled = True # Stop Button if (event.status is 0xB0 and event.data1 is 0x2E): loopInterrupt = True # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Stop elif event.data2 is 0x00: transport.stop() output += "Transport: Stop" event.handled = True # Forward Button if (event.status is 0xB0 and event.data1 is 0x30): loopInterrupt = True # Press - Start FF if event.data2 is 0x7F: transport.fastForward(2) event.handled = True output += "Transport: Fast Forward: Begin" # Lift - End FF elif event.data2 is 0x00: transport.fastForward(0) output += "Transport: Fast Forward: End" event.handled = True # Back Button if (event.status is 0xB0 and event.data1 is 0x2F): # Press - Start Rew if event.data2 is 0x7F: transport.rewind(2) event.handled = True output += "Transport: Rewind: Begin" # Lift - End Rew elif event.data2 is 0x00: transport.rewind(0) output += "Transport: Rewind: End" event.handled = True # Record Button if (event.status is 0xB0 and event.data1 is 0x2C): loopInterrupt = True # Press - No action if event.data2 is 0x7F: event.handled = True # Lift - Toggle Recording elif event.data2 is 0x00: transport.record() if transport.isRecording() is 1: output += "Transport: Recording Enabled" else: output += "Transport: Recording Disabled" event.handled = True # Loop Button if (event.status is 0xB0 and event.data1 is 0x31): # Press - Set Loop flags if event.data2 is 0x7F: # Set flags for loop modifier commands loopDown = True loopInterrupt = False event.handled = True # Lift - Toggle Loop if no action taken elif event.data2 is 0x00: event.handled = True loopDown = False if loopInterrupt is False: transport.setLoopMode() if transport.getLoopMode() is 1: output += "Transport: Loop Mode: Song" else: output += "Transport: Loop Mode: Pattern" # Scene Change """ if event.status is 0xF0: global scene scene += 1 if scene is 5: scene = 1 windowToShow = -1 if scene is 1: windowToShow = 2 # Playlist output += "Scene: Playlist" if scene is 2: windowToShow = 1 # Channel Rack output += "Scene: Channel Rack" if scene is 3: windowToShow = 3 # Piano roll output += "Scene: Piano Roll" if scene is 4: windowToShow = 0 # Mixer output += "Scene: Mixer" ui.showWindow(windowToShow) event.handled = True """ if event.handled is True: handleOutput(output) return # Event not recognised if event.handled is False: print("Unknown Event: {:X} {:X} {:2X} {} {:2X}".format( event.status, event.data1, event.data2, EventNameT[(event.status - 0x80) // 16] + ': ' + utils.GetNoteName(event.data1), int(hex(event.data2), 16)))