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 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 OnInit(self): #resetAllName() goTo = 0 selectActivArea(goTo) ui.showWindow(midi.widMixer) Tog_TP = True Tog_Steps = True StepsPerTick = 1
def _toggle_visibility(self, window): if not ui.getVisible(window): ui.showWindow(window) ui.setFocused(window) return True else: ui.hideWindow(window) return False
def toggle_browser_visibility(unused_param_value): """Toggle browser""" if PYKEYS_ENABLED: Actions.fl_windows_shortcut('f8', alt=1) else: if ui.getVisible(midi.widBrowser): ui.hideWindow(midi.widBrowser) else: ui.showWindow(midi.widBrowser) ui.setFocused(midi.widBrowser)
def add_time_marker(unused_param_value): """Add time marker""" window_active = ui.getVisible(midi.widPianoRoll) and ui.getFocused( midi.widPianoRoll) window_active |= ui.getVisible(midi.widPlaylist) and ui.getFocused( midi.widPlaylist) if not window_active: window = midi.widPlaylist if transport.getLoopMode( ) else midi.widPianoRoll ui.showWindow(window) ui.setFocused(window) Actions.fl_windows_shortcut('t', ctrl=1)
def _open_app_menu(): # FPT_Menu needs to be triggered when channel rack in focus in order to bring up the app menu. # Save the visibility state of the channel rack and restore at the end. ui.closeActivePopupMenu() channel_rack_visible = ui.getVisible(midi.widChannelRack) # Need to reset focus state of channel rack to ensure menu brought up ui.hideWindow(midi.widChannelRack) ui.showWindow(midi.widChannelRack) ui.setFocused(midi.widChannelRack) transport.globalTransport(midi.FPT_Menu, 1) if not channel_rack_visible: ui.hideWindow(midi.widChannelRack) # Give some time for popup to appear time.sleep(0.2) timeout_time = time.monotonic() + 1 # Avoid exceed waiting more than 1 second while not ui.isInPopupMenu() and time.monotonic() < timeout_time: time.sleep(0.05)
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 onTrackButton(self, control, event): event.handled = True track = self.mixer.tracks[control.index] if control.value == 0: return if controls.masterButton.value: if control.index <= midi.widBrowser: ui.showWindow(control.index) self.lcdText(ui.getFocusedFormCaption()) else: if self.soloMode: track.select(single=True) self.selectMixerTrackChannel(track.index) elif control.double_click: track.solo(flags=midi.fxSoloModeWithSourceTracks + midi.fxSoloModeWithDestTracks) else: track.mute() self.refreshTrackLed(control.index, track) self.lcdText(track.getName()) self.lcdValueText(track.index)
def OnMidiMsg(self, event): event.handled = False print("{:X} {:X} {:2X} {}".format( event.status, event.data1, event.data2, EventNameT[(event.status - 0x80) // 16] + ': ' + utils.GetNoteName(event.data1))) # Use midi.MIDI_NOTEON for note events. if event.midiId == midi.MIDI_CONTROLCHANGE: if event.data2 > 0: if event.data1 == Transport['Stop']: transport.stop() event.handled = True elif event.data1 == Transport['Start']: transport.start() event.handled = True elif event.data1 == Transport['Record']: transport.record() event.handled = True elif event.data1 == Transport['Loop']: transport.setLoopMode() event.handled = True #FL Window Stuff GlobalMIDIChannel = event.status // 16 #Show Window if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad01']) and (event.data2 == 0x7F): ui.showWindow(2) if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad02']) and (event.data2 == 0x7F): ui.showWindow(1) if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad03']) and (event.data2 == 0x7F): ui.showWindow(3) if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad04']) and (event.data2 == 0x7F): ui.showWindow(0) #Hide Window if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad01']) and (event.data2 == 0): ui.hideWindow(2) if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad02']) and (event.data2 == 0): ui.hideWindow(1) if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad03']) and (event.data2 == 0): ui.hideWindow(3) if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad04']) and (event.data2 == 0): ui.hideWindow(0) #Navigation if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad06']) and (event.data2 == 0x7F): ui.escape() if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad07']) and (event.data2 == 0x7F): ui.up() if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad08']) and (event.data2 == 0x7F): ui.enter() if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad14']) and (event.data2 == 0x7F): ui.left() if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad15']) and (event.data2 == 0x7F): ui.down() if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad16']) and (event.data2 == 0x7F): ui.right() #Global Transport if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad09']) and (event.data2 == 0x7F): transport.globalTransport(midi.FPT_Metronome, True) if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad10']) and (event.data2 == 0x7F): transport.globalTransport(midi.FPT_Overdub, True) if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad11']) and (event.data2 == 0x7F): transport.globalTransport(midi.FPT_CountDown, True) if (GlobalMIDIChannel == 0xB) and (event.data1 == Pads['Pad12']) and (event.data2 == 0x7F): transport.globalTransport(midi.FPT_TapTempo, True)
def clone_channel(unused_param_value): """Clone channel""" ui.showWindow(midi.widChannelRack) ui.setFocused(midi.widChannelRack) Actions.fl_windows_shortcut('c', alt=1)
def _show_and_focus(self, window): ui.showWindow(window) ui.setFocused(window)
def _toggle_window_visibility(self, window): if ui.getVisible(window): ui.hideWindow(window) else: ui.showWindow(window) ui.setFocused(window)
def cycleWindowFocus(self, value): self.CURRENT_FOCUSED_WINDOW = (self.CURRENT_FOCUSED_WINDOW + value) % (NUMBER_OF_WINDOW_TYPES + 1) ui.showWindow(self.CURRENT_FOCUSED_WINDOW)
def process(self, command): """Process events in shift menu Args: command (ParsedEvent): Event to process """ command.addProcessor("Main shift menu") if command.type == eventconsts.TYPE_FADER_BUTTON: snap.processSnapMode(command) self.use() elif command.type == eventconsts.TYPE_PAD: if command.is_lift: if command.note == eventconsts.Pads[0][1]: ui.showWindow(consts.WINDOW_PLAYLIST) self.use() command.handle("Switched window to Playlist") elif command.note == eventconsts.Pads[1][1]: ui.showWindow(consts.WINDOW_CHANNEL_RACK) self.use() command.handle("Switched window to Channel rack") elif command.note == eventconsts.Pads[2][1]: ui.showWindow(consts.WINDOW_PIANO_ROLL) self.use() command.handle("Switched window to Piano roll") elif command.note == eventconsts.Pads[3][1]: ui.showWindow(consts.WINDOW_MIXER) self.use() command.handle("Switched window to Mixer") elif command.note == eventconsts.Pads[4][1]: ui.showWindow(consts.WINDOW_BROWSER) self.use() command.handle("Switched window to Browser") elif command.note == eventconsts.Pads[6][0]: ui.selectWindow(True) self.use() command.handle("Previous window") elif command.note == eventconsts.Pads[7][0]: ui.selectWindow(False) self.use() command.handle("Next window") elif command.note == eventconsts.Pads[0][0]: general.undoUp() self.use() command.handle("Undo") elif command.note == eventconsts.Pads[1][0]: general.undoDown() self.use() command.handle("Redo") elif command.note == eventconsts.Pads[7][1]: transport.globalTransport(eventconsts.midi.FPT_F8, 1) self.use() command.handle("Launch Plugin Picker") elif command.note == eventconsts.Pads[3][0]: transport.globalTransport(eventconsts.midi.FPT_Save, 1) self.use() command.handle("Save project") else: command.handle("Shift menu catch others", True) else: command.handle("Shift menu catch press", True) elif command.id == eventconsts.PITCH_BEND: self.use() pitch_val = -pitchBend.getParsedVal() increase = -pitchBend.getDirection() if pitch_val > 0 and increase == 1: direction = 1 elif pitch_val < 0 and increase == -1: direction = -1 else: direction = 0 ui.jog(direction) command.handle("Pitch bend jog wheel")
def _show_and_focus(self, window): if not ui.getVisible(window): ui.showWindow(window) if not ui.getFocused(window): ui.setFocused(window)
def OnDeInit(self): ui.showWindow(midi.widMixer) resetAllName()
def actionButton(self, event, FoundButton): #Action to Button (wiht my Index FoundButton[2]) global goTo global Tog_TP global Tog_Steps global StepsPerTick global lsSPT_Values global SPT_IDX snapVal = 7 def goRight(steps): #Selection go steps to the rigeht sight of Mixer sEnd = " " global goTo #Warum hier global und in goSteps nicht? lastgoTo = goTo if goTo + NK_NrOf_ControlGr + steps < FL_TR_COUNT_MAX: goTo = goTo + steps #print("right") else: goTo = FL_TR_COUNT_MAX - NK_NrOf_ControlGr sEnd = "END of Mixer (right)! - " #wird mir goTo nie überschritten sHi_MixTR_Range = sEnd + "Mix-Tracks " + str(goTo) + "-" + str( NK_NrOf_ControlGr + goTo - 1) #activ HintMsg Track area ui.setHintMsg(sHi_MixTR_Range) if lastgoTo != goTo: resetTrackName(event, lastgoTo) selectActivArea(goTo) event.handled = True def goLeft(steps): #Selection go steps to the left sight of Mixer sEnd = " " global goTo lastgoTo = goTo if goTo > steps - 1: goTo = goTo - steps #print("left") else: goTo = 0 sEnd = "END of Mixer (left)! - " sHi_MixTR_Range = sEnd + "Mix-Tracks " + str(goTo) + "-" + str( NK_NrOf_ControlGr + goTo - 1) #activ HintMsg Track area ui.setHintMsg(sHi_MixTR_Range) if lastgoTo != goTo: resetTrackName(event, lastgoTo) selectActivArea(goTo) if FoundButton[2] == 2: #8 to left goLeft(NK_NrOf_ControlGr) elif FoundButton[2] == 3: #8 to right goRight(NK_NrOf_ControlGr) elif FoundButton[2] == 4: #reset ui.showWindow(midi.widMixer) resetAllName() event.handled = True #sonst knallt es elif FoundButton[2] == 5: #set stepswide ### Könnte ich dazu verwenden um einen Track fest zu zu ordnen if Tog_Steps and SPT_IDX < len(lsSPT_Values): SPT_IDX += 1 if SPT_IDX == (len(lsSPT_Values) - 1): Tog_Steps = not Tog_Steps #max 7 per Ticker, Toggel betwenn Up/down elif SPT_IDX > 0: SPT_IDX -= 1 if SPT_IDX == 0: Tog_Steps = not Tog_Steps #max 7 per Ticker else: print("Error: Step-Counter") StepsPerTick = lsSPT_Values[SPT_IDX] ui.setHintMsg("set " + str(lsSPT_Values[SPT_IDX]) + " steps") event.handled = True time.sleep(ST_HintMsg) elif FoundButton[2] == 6: #StepsPerTick) to left goLeft(StepsPerTick) elif FoundButton[2] == 7: #StepsPerTick) to right goRight(StepsPerTick) elif FoundButton[2] == 8: #TP Rew if Tog_TP: transport.rewind(2) else: transport.rewind(0) Tog_TP = not Tog_TP event.handled = True elif FoundButton[2] == 9: #TP FF if Tog_TP: transport.fastForward(2) else: transport.fastForward(0) Tog_TP = not Tog_TP event.handled = True elif FoundButton[2] == 10: #TP stop if Tog_TP: transport.fastForward(2) transport.stop() event.handled = True elif FoundButton[2] == 11: #TP play transport.start() event.handled = True elif FoundButton[2] == 12: #TP rec if bPrintAction: print("TP rec ", FoundButton[1], " Wert: ", FoundButton[4]) transport.record() event.handled = True elif FoundButton[2] in lsKnob: #Paning nMixTrIndex = FoundButton[3] - (NK_CC_Knob_First ) #36to43-35=MixTrackIdx in FL nMixTrPan = (1 / 64) * (FoundButton[4] - 63 ) # max Pan. FL=-1.0 - 1.0 (0-127 steps) FL_Pan = int(mixer.getTrackPan(nMixTrIndex + goTo) * 64) #Only change the value if the position of the controller matches the FL value. To avoid jumps if FoundButton[4] - 63 in range(FL_Pan - snapVal, FL_Pan + snapVal) and Reg_Snap: mixer.setTrackPan(nMixTrIndex + goTo, nMixTrPan) #Set Paning if Reg_Snap == False: mixer.setTrackPan(nMixTrIndex + goTo, nMixTrPan) #Set Paning selectActivMixTrack(nMixTrIndex + goTo) event.handled = True elif FoundButton[2] in lsSld: #Volume nMixTrIndex = FoundButton[3] - (NK_CC_SLider_First ) #36to43-35=MixTrackIdx in FL nMixTrVolu = (1 / 127) * FoundButton[ 4] # max Vol. FL=1.0 / max Vol. nK2=127, event.data2=Value from nK2-Slider FL_Vol = int(mixer.getTrackVolume(nMixTrIndex + goTo) * 127) #Only change the value if the position of the controller matches the FL value. To avoid jumps if FoundButton[4] in range(FL_Vol - snapVal, FL_Vol + snapVal) and Reg_Snap: mixer.setTrackVolume(nMixTrIndex + goTo, nMixTrVolu) #Set Vol if Reg_Snap == False: mixer.setTrackVolume(nMixTrIndex + goTo, nMixTrVolu) #Set Vol selectActivMixTrack(nMixTrIndex + goTo) event.handled = True elif FoundButton[2] in lsSoloB: #Solo-Button nMixTrIndex = FoundButton[3] + NK_Solo_But_First selectActivMixTrack(nMixTrIndex + goTo) mixer.soloTrack(nMixTrIndex + goTo) # event.handled = True elif FoundButton[2] in lsMuteB: #Mute-Button nMixTrIndex = FoundButton[3] - (NK_Mute_But_First ) #36to43-35=MixTrackIdx in FL mixer.muteTrack(nMixTrIndex + goTo) # selectActivMixTrack(nMixTrIndex + goTo) event.handled = True elif FoundButton[2] in lsRecB: #Rec-Button nMixTrIndex = FoundButton[3] - (NK_Rec_But_First ) #72to73-71=MixTrackIdx in FL mixer.armTrack(nMixTrIndex + goTo) # selectActivMixTrack(nMixTrIndex + goTo) event.handled = True
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 OnMidiMsg(self, event): #print('senderId', event.senderId) if (event.midiId == midi.MIDI_CONTROLCHANGE): if (event.midiChan == 0): event.inEv = event.data2 if event.inEv >= 0x40: event.outEv = -(event.inEv - 0x40) else: event.outEv = event.inEv # knobs if event.data1 in [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17]: r = utils.KnobAccelToRes2(event.outEv) #todo outev signof Res = r * (1 / (40 * 2.5)) self.SetKnobValue(event.data1 - 0x10, event.outEv, Res) event.handled = True else: event.handled = False # for extra CCs in emulators else: event.handled = False # for extra CCs in emulators elif event.midiId == midi.MIDI_PITCHBEND: # pitch bend (faders) if event.midiChan <= 8: event.inEv = event.data1 + (event.data2 << 7) event.outEv = (event.inEv << 16) // 16383 event.inEv -= 0x2000 if self.ColT[event.midiChan].SliderEventID >= 0: # slider (mixer track volume) event.handled = True mixer.automateEvent(self.ColT[event.midiChan].SliderEventID, self.AlphaTrack_SliderToLevel(event.inEv + 0x2000), midi.REC_MIDIController, self.SmoothSpeed) # hint n = mixer.getAutoSmoothEventValue(self.ColT[event.midiChan].SliderEventID) s = mixer.getEventIDValueString(self.ColT[event.midiChan].SliderEventID, n) if s != '': s = ': ' + s self.OnSendTempMsg(self.ColT[event.midiChan].SliderName + s, 500) elif (event.midiId == midi.MIDI_NOTEON) | (event.midiId == midi.MIDI_NOTEOFF): # NOTE if event.midiId == midi.MIDI_NOTEON: if (event.pmeFlags & midi.PME_FromScript != 0): if event.data1 == 0x7F: self.SetFirstTrack(event.data2) # slider hold if event.data1 in [0x68, 0x69, 0x70]: self.SliderHoldCount += -1 + (int(event.data2 > 0) * 2) if (event.pmeFlags & midi.PME_System != 0): if (event.data1 == 0x2E) | (event.data1 == 0x2F): # mixer bank if event.data2 > 0: self.SetFirstTrack(self.FirstTrackT[self.FirstTrack] - 8 + int(event.data1 == 0x2F) * 16) elif (event.data1 == 0x30) | (event.data1 == 0x31): if event.data2 > 0: self.SetFirstTrack(self.FirstTrackT[self.FirstTrack] - 1 + int(event.data1 == 0x31) * 2) elif event.data1 == 0x32: # self.Flip if event.data2 > 0: self.Flip = not self.Flip self.UpdateColT() self.UpdateLEDs() elif event.data1 in [0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27]: # knob reset if event.data2 > 0: n = event.data1 - 0x20 self.SetKnobValue(n, midi.MaxInt) if (event.pmeFlags & midi.PME_System_Safe != 0): if event.data1 == 0x47: # link selected channels to current mixer track if event.data2 > 0: if self.Shift: mixer.linkTrackToChannel(midi.ROUTE_StartingFromThis) else: mixer.linkTrackToChannel(midi.ROUTE_ToThis) elif (event.data1 >= 0x18) & (event.data1 <= 0x1F): # select mixer track if event.data2 > 0: i = event.data1 - 0x18 ui.showWindow(midi.widMixer) mixer.setTrackNumber(self.ColT[i].TrackNum, midi.curfxScrollToMakeVisible | midi.curfxMinimalLatencyUpdate) elif (event.data1 >= 0x8) & (event.data1 <= 0xF): # solo if event.data2 > 0: i = event.data1 - 0x8 self.ColT[i].solomode = midi.fxSoloModeWithDestTracks if self.Shift: Include(self.ColT[i].solomode, midi.fxSoloModeWithSourceTracks) mixer.soloTrack(self.ColT[i].TrackNum, midi.fxSoloToggle, self.ColT[i].solomode) mixer.setTrackNumber(self.ColT[i].TrackNum, midi.curfxScrollToMakeVisible) elif (event.data1 >= 0x10) & (event.data1 <= 0x17): # mute if event.data2 > 0: mixer.enableTrack(self.ColT[event.data1 - 0x10].TrackNum) elif (event.data1 >= 0x0) & (event.data1 <= 0x7): # arm if event.data2 > 0: mixer.armTrack(self.ColT[event.data1].TrackNum) if mixer.isTrackArmed(self.ColT[event.data1].TrackNum): self.OnSendTempMsg(mixer.getTrackName(self.ColT[event.data1].TrackNum) + ' recording to ' + mixer.getTrackRecordingFileName(self.ColT[event.data1].TrackNum), 2500) else: self.OnSendTempMsg(mixer.getTrackName(self.ColT[event.data1].TrackNum) + ' unarmed') event.handled = True else: event.handled = False else: event.handled = False
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