def open_mixer_plugin(channel_index): """Open mixer plugin""" if SCRIPT_VERSION < 8: return Actions.noop mixer_track_index = channel_index + 1 mixer.setTrackNumber(mixer_track_index, midi.curfxScrollToMakeVisible) for i in range(Actions._num_effects(mixer_track_index)): transport.globalTransport(midi.FPT_MixerWindowJog, 1)
def select(self, value=True, single=True, flags=midi.curfxScrollToMakeVisible): if single and value: mixer.setTrackNumber(self.index, flags) elif value is None or bool(value) != bool(self.isSelected()): mixer.selectTrack(self.index)
def selectActivArea(goTo): #mark the 8 tracks that are controlled if Flag_No_Sel_Names: return x = NK_NrOf_ControlGr #8 if goTo + NK_NrOf_ControlGr > FL_TR_COUNT_MAX: goL_Delta = (goTo + NK_NrOf_ControlGr - FL_TR_COUNT_MAX) x = x - goL_Delta for i in range(goTo, goTo + x): orgName = mixer.getTrackName(i) mixer.setTrackNumber(i, 1) if isSelName(orgName) == False: mixer.setTrackName(i, lsSelTrackNames[i - goTo] + orgName[0:])
def OnUpdateTargetMixerTrack(self, delta): max_track_idx = mixer.trackCount() - 2 # One of the track is a control track prev_track = channels.getTargetFxTrack(channels.selectedChannel()) target_track = self.circular(0, max_track_idx, prev_track + delta) # Remember to unset the name of the previous pointed to track. mixer.setTrackNumber(target_track, midi.curfxMinimalLatencyUpdate) mixer.linkTrackToChannel(midi.ROUTE_ToThis) channel_idx = self._channel_with_route_to_mixer_track(prev_track) if channel_idx < 0: mixer.setTrackName(prev_track, '') elif mixer.getTrackName(prev_track) == mixer.getTrackName(target_track): mixer.setTrackName(prev_track, channels.getChannelName(channel_idx)) if target_track == 0: mixer.setTrackName(target_track, '')
def setTrackData(): global trackOffset updateLEDs() mixer.deselectAll() mixer.setTrackNumber(trackOffset) if selectFeedbackDuration > 0: for i in range(0, 8): try: mixer.selectTrack(trackOffset + i) except: break time.sleep(selectFeedbackDuration) mixer.deselectAll() mixer.setTrackNumber(trackOffset)
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 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 selectActivMixTrack(MixTrackNr): #Select only MixTrackNr mixer.setTrackNumber(MixTrackNr, 1)
def _toggle_all_mixer_plugins(self): mixer_track = channels.getTargetFxTrack(channels.selectedChannel()) mixer.setTrackNumber(mixer_track)
def moveSelectedMixerTrack(self, offset): selected_track = (mixer.trackNumber() + offset) % mixer.trackCount() mixer.setTrackNumber(selected_track) return selected_track
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 mixer_track_right(unused_param_value): """Next mixer track""" select = (mixer.trackNumber() + 1) % (mixer.trackCount() - 1) mixer.setTrackNumber(select, midi.curfxScrollToMakeVisible)
def selectBank(self, focus=0): mixer.setTrackNumber(self.bank_start + focus, midi.curfxScrollToMakeVisible) for i in range(self.track_width): if i != focus: mixer.selectTrack(self.bank_start + i)
def set_mixer_track(n): mixer.deselectAll() mixer.setTrackNumber(n) print("set_mixer_track:", n)