def keyDown(self, event): if QLiveLib.getVar("MidiLearnMode"): if event.GetKeyCode() in [wx.WXK_BACK, wx.WXK_DELETE, wx.WXK_NUMPAD_DELETE]: self.revertMidiAssignation() event.Skip() return if self.selected: char = '' if event.GetKeyCode() in range(324, 334): char = str(event.GetKeyCode() - 324) elif event.GetKeyCode() == 390: char = '-' elif event.GetKeyCode() == 391: char = '.' elif event.GetKeyCode() == wx.WXK_BACK: if self.new != '': self.new = self.new[0:-1] self.labelChanged() elif event.GetKeyCode() < 256: char = chr(event.GetKeyCode()) if char in ['0','1','2','3','4','5','6','7','8','9','.','-']: self.new += char self.labelChanged() elif event.GetKeyCode() in [wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER]: self.SetValue(eval(self.new)) self.new = '' self.selected = False QLiveLib.setVar("CanProcessCueKeys", True) wx.CallAfter(self.Refresh) event.Skip()
def connectAudioMixer(self): audioMixer = QLiveLib.getVar("AudioMixer") audioServer = QLiveLib.getVar("AudioServer") for obj in self.buttonsInputs: if obj.name == "AudioIn": inchnls = obj.getInChannels() ismulti = obj.getIsMultiChannels() channels = [audioMixer.getInputChannel(i).getOutput() for i in range(NUM_INPUTS) if inchnls[i]] if not ismulti: channels = sum(channels) obj.setInput(channels) elif obj.name == "Soundfile": id = obj.getSoundfileId() if id is not None: source = audioServer.getSoundfiles()[id] if source: obj.setInput(source.looper) for i, obj in enumerate(self.buttonsFxs): if obj.name == "AudioOut": chnls = len(obj.getOutput()) outchnls = obj.getOutChannels() channels = [j for j in range(NUM_OUTPUTS) if outchnls[j]] for j in range(chnls): audioMixer.addToMixer(channels[j % len(channels)], obj.getOutput()[j])
def assignMidiCtl(self, num, which): self.midiBindings[num] = which if which == "up": self.upButton.SetToolTip(QLiveTooltip("Midi key: %d" % num)) elif which == "down": self.downButton.SetToolTip(QLiveTooltip("Midi key: %d" % num)) QLiveLib.getVar("MidiServer").bind("noteon", num, self.midi)
def onClose(self, evt): if self.tabAudio.reinit_server: try: QLiveLib.getVar("AudioServer").reinitServer() except: pass self.Destroy()
def revertMidiAssignation(self): self.midiscanning = False QLiveLib.getVar("MidiServer").ctlscan(None) self.slider.setMidiLearn(False) QLiveLib.getVar("MidiServer").unbind("ctls", self.slider.midictl, self.midi) self.slider.setMidiCtl(None)
def reinitServer(self): mixer = QLiveLib.getVar("AudioMixer") mixerPanel = QLiveLib.getVar("MixerPanel") restart = False reboot = False if self.isStarted(): restart = True self.start(False) time.sleep(.1) mixer.deleteMixer() if self.isBooted(): reboot = True self.shutdown() time.sleep(.1) sr, bufferSize, audio, jackname, nchnls, inchnls, duplex, outdev, indev, firstin, firstout = self.getPrefs( ) self.server.reinit(audio=audio, jackname=jackname) self.server.setSamplingRate(sr) self.server.setBufferSize(bufferSize) self.server.setNchnls(nchnls) self.server.setDuplex(duplex) if inchnls != None: self.server.setIchnls(inchnls) self.server.deactivateMidi() self.server.setOutputDevice(outdev) self.server.setInputOffset(firstin) self.server.setOutputOffset(firstout) if duplex: self.server.setInputDevice(indev) if reboot: self.server.boot() mixer.createMixer() mixerPanel.connectSliders() if restart: self.start(True)
def doLabelAction(self, evt): if evt.GetId() == 1: # Duplicate obj = self.objects[self.selRow] id = obj.getId() filename = obj.getFilename() new = SoundFileObject(id, filename) new.copy(obj) self.selRow += 1 self.objects.insert(self.selRow, new) self.addRow(index=self.selRow) self.putObjectAttrOnCells(new, self.selRow) for id in [ID_COL_TRANSPO, ID_COL_GAIN, ID_COL_STARTPOINT, ID_COL_ENDPOINT, ID_COL_CROSSFADE, ID_COL_CHANNEL]: attr = self.GetOrCreateCellAttr(self.selRow, id) attr.SetReadOnly(False) elif evt.GetId() == 2: # Delete QLiveLib.getVar("FxTracks").checkForDeletedSoundfile(self.selRow) del self.objects[self.selRow] self.DeleteRows(self.selRow, 1, True) if evt.GetId() in [3, 4]: # Show parameter values/interpolation times self.objects[self.selRow].setShowInterp(evt.GetId() - 3) self.putObjectAttrOnCells(self.objects[self.selRow], self.selRow) if evt.GetId() == 5: self.objects[self.selRow].openTranspoAutomationWindow() elif evt.GetId() == 6: self.objects[self.selRow].openGainAutomationWindow() for i, obj in enumerate(self.objects): obj.setId(i)
def setSaveState(self, state): if state: self.cueMidiNotes = state["cueMidiNotes"] for val, state in self.cueMidiNotes.items(): if state in ["up", "down"]: QLiveLib.getVar("ControlPanel").setButtonTooltip(state, "Midi key: %d" % val)
def __init__(self, init=0, inter=None): # Globals self.server = QLiveLib.getVar("AudioServer") self.mixer = QLiveLib.getVar("AudioMixer") interpTime = QLiveLib.getVar("globalInterpTime") self.mixmethod = -1 # Main value if inter == None: self.param = SigTo(init, interpTime, init) else: self.param = SigTo(init, inter, init) # Envelope follower signal chain self.envInputs = [0] * NUM_INPUTS self.envActive = 0 self.envThreshold = SigTo(-90, time=interpTime, init=-90) self.envCutoff = SigTo(20, time=interpTime, init=20) self.envMin = SigTo(0, time=interpTime, init=0) self.envMax = SigTo(1, time=interpTime, init=1) self.envInput = Gate(Sig(0), thresh=self.envThreshold) self.envFol = Follower(self.envInput, freq=self.envCutoff) self.env = Scale(self.envFol, 0, 1, self.envMin, self.envMax) self.envStop() self.auto = Sig(0) self.output = Interp(self.param, self.auto, 0)
def connectAudioMixer(self): audioMixer = QLiveLib.getVar("AudioMixer") audioServer = QLiveLib.getVar("AudioServer") for obj in self.buttonsInputs: if obj.name == "AudioIn": inchnls = obj.getInChannels() ismulti = obj.getIsMultiChannels() channels = [ audioMixer.getInputChannel(i).getOutput() for i in range(NUM_INPUTS) if inchnls[i] ] if not ismulti: channels = sum(channels) obj.setInput(channels) elif obj.name == "Soundfile": id = obj.getSoundfileId() if id is not None: source = audioServer.getSoundfiles()[id] if source: obj.setInput(source.looper) for i, obj in enumerate(self.buttonsFxs): if obj.name == "AudioOut": chnls = len(obj.getOutput()) outchnls = obj.getOutChannels() channels = [j for j in range(NUM_OUTPUTS) if outchnls[j]] for j in range(chnls): audioMixer.addToMixer(channels[j % len(channels)], obj.getOutput()[j])
def output(self, evt): if self.previous in ["", ".", "-"]: self.previous = "0" self.value = 0 self.ChangeValue(self.previous) if self.callback is not None: self.callback(self.value, self.interp) QLiveLib.setVar("CanProcessCueKeys", True)
def deleteButton(self, but): if but.isInput: self.buttonsInputs.remove(but) else: self.buttonsFxs.remove(but) but.delete() self.checkTrackSize() QLiveLib.getVar("FxTracks").drawAndRefresh()
def onMidiLearn(self, evt): QLiveLib.setVar("MidiLearnMode", evt.GetInt()) if evt.GetInt(): QLiveLib.getVar("MixerPanel").SetBackgroundColour(MIDILEARN_COLOUR) QLiveLib.setVar("CanProcessCueKeys", False) else: QLiveLib.getVar("MixerPanel").SetBackgroundColour(BACKGROUND_COLOUR) QLiveLib.setVar("CanProcessCueKeys", True)
def drawAndRefresh(self, restart=True): self.draw() wx.CallAfter(self.Refresh) server = QLiveLib.getVar("AudioServer") if restart and server.isStarted(): server.start(False) server.start(True) QLiveLib.getVar("CuesPanel").loadCurrentCue()
def onMoveCue(self, evt): if QLiveLib.getVar("CanProcessCueKeys"): cues = QLiveLib.getVar("CuesPanel") current = cues.getCurrentCue() if evt.GetId() == self.prevId: cues.onCueSelection(current - 1) elif evt.GetId() == self.nextId: cues.onCueSelection(current + 1)
def onCueCut(self, evt): cues = QLiveLib.getVar("CuesPanel") current = cues.getCurrentCue() if current == 0: QLiveLib.PRINT("Can't cut cue number 0.") return cues.onCopyCue() cues.onDelCue()
def __init__(self, parent): wx.Panel.__init__(self, parent, size=(95, -1), style=wx.SUNKEN_BORDER) self.mainSizer = wx.BoxSizer(wx.VERTICAL) self.newAddSizer = wx.BoxSizer(wx.HORIZONTAL) self.upDownSizer = wx.BoxSizer(wx.HORIZONTAL) self.learnButton = None self.buttons = TransportButtons(self, playCallback=QLiveLib.getVar("AudioServer").start, recordCallback=QLiveLib.getVar("AudioServer").record) self.mainSizer.Add(self.buttons, 0, wx.ALIGN_CENTER_HORIZONTAL) self.mainSizer.Add(wx.StaticLine(self, size=(1, 1)), 0, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, 5) title = wx.StaticText(self, label="-- CUES --") self.mainSizer.Add(title, 0, wx.ALIGN_CENTER, 5) #button = wx.Button(self,wx.ID_OK, label="Interp Time" ) #self.mainSizer.Add(button, 0, wx.ALIGN_CENTER, 5) #button.Bind(wx.EVT_BUTTON, self.onSetInterpTime) bmp = wx.Bitmap(ICON_ADD, wx.BITMAP_TYPE_PNG) self.newButton = wx.BitmapButton(self, wx.ID_ANY, bmp) self.newButton.Bind(wx.EVT_BUTTON, self.onNewCue) self.newAddSizer.Add(self.newButton, 1) bmp = wx.Bitmap(ICON_DELETE, wx.BITMAP_TYPE_PNG) self.delButton = wx.BitmapButton(self, wx.ID_ANY, bmp) self.delButton.Bind(wx.EVT_BUTTON, self.onDelCue) self.newAddSizer.Add(self.delButton, 1) self.mainSizer.Add(self.newAddSizer, 0, wx.EXPAND|wx.ALL, 5) self.upbmp = wx.Bitmap(ICON_ARROW_UP, wx.BITMAP_TYPE_PNG) self.upmidbmp = wx.Bitmap(ICON_ARROW_UP_MIDI, wx.BITMAP_TYPE_PNG) self.upButton = wx.BitmapButton(self, wx.ID_ANY, self.upbmp) self.upButton.Bind(wx.EVT_BUTTON, self.onMoveCueUp) self.upButton.Bind(wx.EVT_RIGHT_DOWN, self.midiLearn) self.upTooltip = wx.ToolTip("") self.upButton.SetToolTip(self.upTooltip) self.upDownSizer.Add(self.upButton, 1) self.downbmp = wx.Bitmap(ICON_ARROW_DOWN, wx.BITMAP_TYPE_PNG) self.downmidbmp = wx.Bitmap(ICON_ARROW_DOWN_MIDI, wx.BITMAP_TYPE_PNG) self.downButton = wx.BitmapButton(self, wx.ID_ANY, self.downbmp) self.downButton.Bind(wx.EVT_BUTTON, self.onMoveCueDown) self.downButton.Bind(wx.EVT_RIGHT_DOWN, self.midiLearn) self.downTooltip = wx.ToolTip("") self.downButton.SetToolTip(self.downTooltip) self.upDownSizer.Add(self.downButton, 1) self.mainSizer.Add(self.upDownSizer, 0, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, 5) self.SetSizerAndFit(self.mainSizer)
def handleMidiScan(self): if not self.midiscanning: self.midiscanning = True QLiveLib.getVar("MidiServer").ctlscan(self.getMidiScan) self.slider.setMidiLearn(True) else: self.midiscanning = False QLiveLib.getVar("MidiServer").ctlscan(None) self.slider.setMidiLearn(False)
def deleteButton(self, but): # work only for fxs, not for inputs but.delete() self.buttonsFxs.remove(but) for i, but in enumerate(self.buttonsFxs): id = but.getId() id[0] = i but.setId(id) QLiveLib.getVar("FxTracks").drawAndRefresh()
def deleteButton(self, but): # TODO: work only for fxs, not for inputs but.delete() self.buttonsFxs.remove(but) for i, but in enumerate(self.buttonsFxs): id = but.getId() id[0] = i but.setId(id) QLiveLib.getVar("FxTracks").drawAndRefresh()
def setMidiLearn(self, state): self.midiLearn = state if self.midiLearn: QLiveLib.setVar("CanProcessCueKeys", False) self.backColour = MIDILEARN_COLOUR else: QLiveLib.setVar("CanProcessCueKeys", True) self.backColour = CONTROLSLIDER_BACK_COLOUR wx.CallAfter(self.Refresh)
def cueMidiLearnCallback(self, val, ctl=False): if ctl: self.cueMidiCtls[val] = self.cueMidiLearnState else: self.cueMidiNotes[val] = self.cueMidiLearnState QLiveLib.getVar("ControlPanel").setButtonTooltip(self.cueMidiLearnState, "Midi key: %d" % val) self.cueMidiLearnState = None QLiveLib.getVar("ControlPanel").resetCueButtonBackgroundColour()
def handleMidiScan(self): if not self.midiscanning: self.midiscanning = True QLiveLib.getVar("MidiServer").ctlscan(self.getMidiScan) self.setMidiBackgroundColour(MIDILEARN_COLOUR) else: self.midiscanning = False QLiveLib.getVar("MidiServer").ctlscan(None) self.revertMidiBackgroundColour()
def createBoxObjects(self): tracks = QLiveLib.getVar("FxTracks").getTracks() for track in tracks: trackchnls = 1 for but in track.getButtonInputs(): chnls = 1 name = but.name if not name: name = "None" if name == "AudioIn": inchnls = but.getInChannels() numchnls = inchnls.count(1) ismulti = but.getIsMultiChannels() if ismulti: chnls = max(chnls, numchnls) else: chnls = 1 elif name == "Soundfile": id = but.getSoundfileId() if id is not None: chnls = self.soundfiles[id].getChnls() else: chnls = 1 elif name.startswith("MS-"): chnls = 2 ctrls = INPUT_DICT[name]["ctrls"] values = but.getCurrentValues() if values is not None: obj = AUDIO_OBJECTS[name](chnls, ctrls, values, but.getCurrentInterps()) but.setAudioRef(obj) self.audioObjects.append(obj) if name == "AudioIn": obj.setGains(inchnls) if name.startswith("MS-"): QLiveLib.getVar("MidiServer").registerMidiSynth( obj, (0, 127)) trackchnls = max(trackchnls, chnls) for but in track.getButtonFxs(): name = but.name category = but.category if not name: name = "None" if name != "None": ctrls = FX_DICT[category][name]["ctrls"] values = but.getCurrentValues() if values is not None: obj = AUDIO_OBJECTS[name](trackchnls, ctrls, values, but.getCurrentInterps()) but.setAudioRef(obj) self.audioObjects.append(obj) if name == "AudioOut": obj.setGains(but.getOutChannels()) # TODO: we will need a better algorithm for spatialization. if name in ["Panning", "StereoVerb"]: trackchnls *= 2
def DoubleClick(self, event): if QLiveLib.getVar("MidiLearnMode"): return w, h = self.GetSize() pos = event.GetPosition() if self.textrect.Contains(pos): QLiveLib.setVar("CanProcessCueKeys", False) self.selected = True wx.CallAfter(self.Refresh) event.Skip()
def onApply(self, evt): cue = self.cueButton.GetSelection() # 0 = current, 1 = all track = self.trackButton.GetSelection() # 0 = current, 1 = all, 2 = none snd = self.sndButton.GetSelection() # 0 = current, 1 = all = 2 = none value = self.knob.GetValue() # interpolation time in secs meth = self.method.GetSelection() # 0 = overwrite, 1 = add, 2 = sub if meth == 0: QLiveLib.setVar("globalInterpTime", value) if self.callback is not None: self.callback(cue, track, snd, value, meth)
def onApply(self, evt): cue = self.cueButton.GetSelection() # 0 = current, 1 = all track = self.trackButton.GetSelection( ) # 0 = current, 1 = all, 2 = none snd = self.sndButton.GetSelection() # 0 = current, 1 = all = 2 = none value = self.knob.GetValue() # interpolation time in secs meth = self.method.GetSelection() # 0 = overwrite, 1 = add, 2 = sub if meth == 0: QLiveLib.setVar("globalInterpTime", value) if self.callback is not None: self.callback(cue, track, snd, value, meth)
def SetValue(self, value, propagate=True): self.propagate = propagate if self.HasCapture(): self.ReleaseMouse() value = clamp(value, self.minvalue, self.maxvalue) t = tFromValue(value, self.minvalue, self.maxvalue) self.value = interpFloat(t, self.minvalue, self.maxvalue) self.clampPos() self.selected = False QLiveLib.setVar("CanProcessCueKeys", True) self.valueChanged() wx.CallAfter(self.Refresh)
def MouseMotion(self, evt): if QLiveLib.getVar("MidiLearnMode"): return posY = evt.GetPosition()[1] h = self.GetSize()[1] - self.meterOffset if evt.LeftIsDown() and evt.Dragging(): self.pos = clamp(posY, self.knobHalfSize, h-self.knobHalfSize) self.value = self.scale() self.selected = False QLiveLib.setVar("CanProcessCueKeys", True) self.valueChanged() wx.CallAfter(self.Refresh)
def onLoad(self, evt): if not self.askForSaving(): return if QLiveLib.getVar("currentProject"): filepath = os.path.split(QLiveLib.getVar("currentProject"))[0] else: filepath = os.path.expanduser("~") dlg = wx.FileDialog(self, "Open Qlive Projet", filepath, "", "QLive Project files (*.qlp)|*.qlp", style=wx.OPEN) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() self.loadFile(path) dlg.Destroy()
def OnClose(self, evt): self.timer.Stop() if not self.askForSaving(): return if self.audioServer.isStarted(): self.audioServer.stop() time.sleep(0.25) if self.audioServer.isBooted(): self.audioServer.shutdown() time.sleep(0.25) QLiveLib.saveVars() self.tracks.close() self.Destroy()
def recStart(self, filename="", fileformat=0, sampletype=0): self.server.recordOptions(fileformat=fileformat, sampletype=sampletype) if not filename: filename = os.path.basename(QLiveLib.getVar("currentProject")) filename, ext = os.path.splitext(filename) filename = os.path.join(QLiveLib.getVar("projectFolder"), "bounce", filename) if fileformat >= 0 and fileformat < 8: ext = RECORD_EXTENSIONS[fileformat] else: ext = ".wav" date = time.strftime('_%d_%b_%Y_%Hh%M') complete_filename = QLiveLib.toSysEncoding(filename+date+ext) self.server.recstart(complete_filename)
def deleteButton(self, but): if but.isInput: self.buttonsInputs.remove(but) lst = self.buttonsInputs else: self.buttonsFxs.remove(but) lst = self.buttonsFxs for i, but in enumerate(lst): id = but.getId() id[0] = i but.setId(id) but.delete() QLiveLib.getVar("FxTracks").drawAndRefresh()
def keyDown(self, evt): if QLiveLib.getVar("MidiLearnMode"): if evt.GetKeyCode() in [wx.WXK_BACK, wx.WXK_DELETE, wx.WXK_NUMPAD_DELETE]: # remove current binding midi = QLiveLib.getVar("MidiServer") self.learning = False self.select(0) midi.noteonscan(None) if self.midinote is not None: midi.unbind("noteon", self.midinote, self.midi) self.midinote = None self.SetToolTip(QLiveTooltip("")) evt.Skip()
def sendCueEvent(self, evt): if QLiveLib.getVar("MainWindow") != None: QLiveLib.getVar("FxTracks").cueEvent(evt) QLiveLib.getVar("Soundfiles").cueEvent(evt) QLiveLib.getVar("AudioMixer").cueEvent(evt) currentCueWindow = QLiveLib.getVar("CurrentCueWindow") currentCueWindow.refresh(self.getCurrentCue())
def __init__(self, id, filename, loopmode=0, transpo=1, gain=0, playing=0, directout=True, startpoint=0, endpoint=-1, crossfade=5, channel=0): interpTime = QLiveLib.getVar("globalInterpTime") self.id = id self.filename = filename sndfolder = os.path.join(QLiveLib.getVar("projectFolder"), "sounds") info = sndinfo(os.path.join(sndfolder, self.filename)) if info is None: self.valid = False self.duration = -1 self.sndchnls = -1 else: self.valid = True self.duration = info[1] self.sndchnls = info[3] self.loopmode = loopmode self.transpo = transpo self.gain = gain self.playing = playing self.directout = directout self.startpoint = startpoint self.endpoint = self.duration self.crossfade = crossfade self.channel = channel self.transpox = interpTime self.gainx = interpTime self.transpoDict = None self.gainDict = None self.showInterp = 0 self.playerRef = None self.transpoAutoWindow = None self.gainAutoWindow = None self.cues = {} self.copied = {} currentCue = QLiveLib.getVar("CuesPanel").getCurrentCue() self.addCue(0) self.addCue(currentCue)
def loadFile(self, path): with open(path, "r") as f: magicline = f.readline() if magicline != QLIVE_MAGIC_LINE: print "The file loaded is not a valid QLive file." return self.tracks.close() execfile(path, globals()) if path == NEW_FILE_PATH: QLiveLib.setVar("currentProject", "") QLiveLib.setVar("projectFolder", "") else: QLiveLib.setVar("currentProject", path) QLiveLib.setVar("projectFolder", os.path.dirname(path)) self.newRecent(path) self.saveState = copy.deepcopy(dictSave) if "soundfiles" in self.saveState: self.soundfiles.setSaveState(self.saveState["soundfiles"]) self.tracks.setSaveState(self.saveState["tracks"]) self.cues.setSaveDict(self.saveState["cues"]) self.mixer.setSaveDict(self.saveState["mixer"]) self.controlPanel.setSaveState(self.saveState.get("control", {})) #self.audioServer.setSaveState(self.saveState.get("server", {})) linkMenuItem = self.GetMenuBar().FindItemById(LINK_STEREO_ID) linkMenuItem.Check(dictSave["mixer"].get("inputLinked", False))
def onSaveAs(self, evt): if QLiveLib.getVar("currentProject"): filepath = os.path.split(QLiveLib.getVar("currentProject")) else: filepath = os.path.join(os.path.expanduser("~"), "qlive_project.qlp") filepath = os.path.split(filepath) dlg = wx.FileDialog(self, "Save Qlive Projet", filepath[0], filepath[1], "QLive Project files (*.qlp)|*.qlp", style=wx.SAVE|wx.FD_OVERWRITE_PROMPT) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() self.saveFile(path) dlg.Destroy()
def DoubleClick(self, event): if self._enable: w, h = self.GetSize() pos = event.GetPosition() reclab = wx.Rect(3, 60, w-3, 10) recpt = wx.Rect(self.knobPointPos[0]-3, self.knobPointPos[1]-3, 9, 9) if reclab.Contains(pos): self.selected = True QLiveLib.setVar("CanProcessCueKeys", False) elif recpt.Contains(pos): self.mode = (self.mode+1) % 3 wx.CallAfter(self.Refresh) event.Skip()
def OnClose(self, evt): self.timer.Stop() if not self.askForSaving(): return self.currentCueWindow.Destroy() if self.audioServer.isStarted(): self.audioServer.stop() time.sleep(0.25) if self.audioServer.isBooted(): self.audioServer.shutdown() time.sleep(0.25) QLiveLib.saveVars() self.tracks.close() self.Destroy()
def onExportMEI(self, evt): if QLiveLib.getVar("currentProject"): filepath = os.path.split(QLiveLib.getVar("currentProject")) else: filepath = os.path.join(os.path.expanduser("~"), "qlive_project.mei") filepath = os.path.split(filepath) dlg = wx.FileDialog(self, "Export Qlive Projet in MEI format", filepath[0], os.path.splitext(filepath[1])[0]+".mei", "MEI files (*.mei)|*.mei", style=wx.SAVE|wx.FD_OVERWRITE_PROMPT) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() self.saveMEI(path) dlg.Destroy()
def onMoveCue(self, evt): if QLiveLib.getVar("CanProcessCueKeys"): cues = QLiveLib.getVar("CuesPanel") current = cues.getCurrentCue() if evt.GetId() == self.prevId: cues.onCueSelection(current - 1) elif evt.GetId() == self.nextId: cues.onCueSelection(current + 1) elif evt.GetId() == self.cueZeroId: cues.onCueSelection(0) elif evt.GetId() >= self.cue1Id and evt.GetId() <= self.cue10Id: which = evt.GetId() - self.cue1Id + 1 cues.onCueSelection(which) else: evt.Skip()
def OnQuit(self, evt): self.timer.Stop() if not self.askForSaving(): return self.currentCueWindow.Destroy() if self.audioServer.isStarted(): self.audioServer.stop() time.sleep(0.25) if self.audioServer.isBooted(): self.audioServer.shutdown() time.sleep(0.25) QLiveLib.getVar("Soundfiles").cleanUpSoundsFolder() QLiveLib.saveVars() self.tracks.close() self.Destroy()
def reinitServer(self): mixer = QLiveLib.getVar("AudioMixer") mixerPanel = QLiveLib.getVar("MixerPanel") restart = False reboot = False if self.isStarted(): restart = True self.start(False) time.sleep(.1) mixer.deleteMixer() if self.isBooted(): reboot = True self.shutdown() time.sleep(.1) prefs = self.getPrefs() sr = prefs[0] bufferSize = prefs[1] audio = prefs[2] jackname = prefs[3] nchnls = prefs[4] inchnls = prefs[5] duplex = prefs[6] outdev = prefs[7] indev = prefs[8] firstin = prefs[9] firstout = prefs[10] midi = prefs[11] self.server.reinit(audio=audio, midi=midi, jackname=jackname) self.server.setSamplingRate(sr) self.server.setBufferSize(bufferSize) self.server.setNchnls(nchnls) self.server.setDuplex(duplex) if inchnls != None: self.server.setIchnls(inchnls) self.server.deactivateMidi() self.server.setOutputDevice(outdev) self.server.setInputOffset(firstin) self.server.setOutputOffset(firstout) if duplex: self.server.setInputDevice(indev) if reboot: self.server.boot() mixer.createMixer() mixerPanel.connectSliders() if restart: self.start(True)
def midiLearn(self, evt): obj = evt.GetEventObject() if self.learnButton is not None and self.learnButton != obj: if self.learnButton == self.upButton: wx.CallAfter(self.learnButton.SetBitmapLabel, self.upbmp) elif self.learnButton == self.downButton: wx.CallAfter(self.learnButton.SetBitmapLabel, self.downbmp) server = QLiveLib.getVar("AudioServer") if self.learnButton == obj: if obj == self.upButton: obj.SetBitmapLabel(self.upbmp) elif obj == self.downButton: obj.SetBitmapLabel(self.downbmp) self.learnButton = None server.stopCueMidiLearn() else: if obj == self.upButton: obj.SetBitmapLabel(self.upmidbmp) elif obj == self.downButton: obj.SetBitmapLabel(self.downmidbmp) self.learnButton = obj if obj == self.upButton: which = "up" elif obj == self.downButton: which = "down" server.setCueMidiLearnState(which) server.startCueMidiLearn()
def OnLabelRightClick(self, evt): row = evt.GetRow() if row != -1 and row < len(self.objects): actions = [("Duplicate Row", wx.ITEM_NORMAL), ("Delete Row", wx.ITEM_NORMAL), ("Show Parameter Values", wx.ITEM_RADIO), ("Show Interpolation Times", wx.ITEM_RADIO), ("Show Automations for Transpo Parameter", wx.ITEM_NORMAL), ("Show Automations for Gain Parameter", wx.ITEM_NORMAL)] self.selRow = row menu = wx.Menu() for i, act in enumerate(actions): menu.Append(i + 1, act[0], kind=act[1]) if i in [1, 3]: menu.AppendSeparator() menu.Check(self.objects[self.selRow].getShowInterp() + 3, True) if QLiveLib.getVar("locked"): menu.Enable(1, False) menu.Enable(2, False) menu.Bind(wx.EVT_MENU, self.doLabelAction, id=1, id2=i + 1) self.PopupMenu(menu, evt.GetPosition()) menu.Destroy() evt.Skip()