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 setMidiDriver(self, evt): if QLiveLib.getVar("midi") != evt.GetString(): self.reinit_server = True if evt.GetInt() == 1: QLiveLib.setVar("midi", "jack") else: QLiveLib.setVar("midi", "portmidi")
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 keyDown(self, event): 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] elif event.GetKeyCode() < 256: char = chr(event.GetKeyCode()) if char in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']: self.new += char elif char == '.' and not '.' in self.new: self.new += char elif char == '-' and len(self.new) == 0: self.new += char elif event.GetKeyCode() in [wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER]: if self.new != '': self.SetValue(eval(self.new)) # Send value if self.outFunction: self.outFunction(self.GetValue()) self.new = '' self.selected = False QLiveLib.setVar("CanProcessCueKeys", True) wx.CallAfter(self.Refresh)
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()) QLiveLib.setVar("currentProject", path) QLiveLib.setVar("projectFolder", os.path.dirname(path)) filename = os.path.split(path)[1] self.newRecent(path) self.saveState = copy.deepcopy(dictSave) self.soundfiles.setSaveState(self.saveState.get("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)) if "main" in self.saveState: self.SetPosition(self.saveState["main"]["position"]) self.SetSize(self.saveState["main"]["size"]) self.splitter.SetSashPosition(self.saveState["main"]["sashpos"]) self.setTitle(filename) self.onPlayMode(PlayModeEvt(1), force=True)
def onPlayMode(self, evt, force=False): if evt.GetInt() and not force: self.askForSaving() QLiveLib.setVar("locked", bool(evt.GetInt())) colour = QLiveLib.getBackgroundColour() panels = [self.mainPanel, self.controlPanel, self.cues, self.splitter] for panel in panels: panel.SetBackgroundColour(colour) panel.Refresh() self.soundfiles.setBackgroundColour(colour) self.mixer.setBackgroundColour(colour) self.controlPanel.onPlayMode(evt.GetInt()) state = not evt.GetInt() ids = [CUE_CUT_ID, CUE_COPY_ID, CUE_PASTE_ID, NEW_TRACK_ID, DELETE_TRACK_ID, MIDI_LEARN_ID, INTERP_TIME_ID] menubar = self.GetMenuBar() for id in ids: menubar.Enable(id, state) if QLiveLib.getVar("currentProject") == "": filename = "Untitled" else: filename = os.path.split(QLiveLib.getVar("currentProject"))[1] self.setTitle(filename)
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 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 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 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 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 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 saveFile(self, path): QLiveLib.getVar("CuesPanel").onSaveCue() dictSave = self.getCurrentState() self.saveState = copy.deepcopy(dictSave) QLiveLib.setVar("currentProject", path) QLiveLib.setVar("projectFolder", os.path.dirname(path)) with open(path, "w") as f: f.write(QLIVE_MAGIC_LINE) f.write("### %s ###\n" % APP_VERSION) f.write("dictSave = %s" % pprint.pformat(dictSave, indent=4))
def saveFile(self, path): QLiveLib.getVar("CuesPanel").onSaveCue() dictSave = self.getCurrentState() self.saveState = copy.deepcopy(dictSave) QLiveLib.setVar("currentProject", path) QLiveLib.setVar("projectFolder", os.path.dirname(path)) with open(path, "w") as f: f.write(QLIVE_MAGIC_LINE) f.write("### %s ###\n" % APP_VERSION) f.write("dictSave = %s" % pprint.pformat(dictSave, indent=4))
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 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 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 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 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 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 DoubleClick(self, event): if QLiveLib.getVar("MidiLearnMode"): return if self._enable: w, h = self.GetSize() pos = event.GetPosition() reclab = wx.Rect(3, 55, w-3, 15) 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 MouseDown(self, evt): w, h = self.GetSize() if self._enable: rec = wx.Rect(5, 13, 45, 45) pos = evt.GetPosition() if rec.Contains(pos): self.clickPos = wx.GetMousePosition() self.oldValue = self.value self.CaptureMouse() self.selected = False rec = wx.Rect(w-15, 69, 15, 15) if rec.Contains(pos): self.showEdit = not self.showEdit self.editFunction(self.showEdit) QLiveLib.setVar("CanProcessCueKeys", True) wx.CallAfter(self.Refresh) evt.Skip()
def filter(self, evt): QLiveLib.setVar("CanProcessCueKeys", False) value = self.GetValue().strip() # numeric check if value.count(".") > 1 or value.count("-") > 1: self.ChangeValue(self.previous) elif value in ["", ".", "-"]: self.previous = value elif value and all(x in '0123456789.-' for x in value): self.previous = value try: tmp = float(value) except: tmp = 0 if self.mode == 0: self.value = tmp else: self.interp = tmp else: self.ChangeValue(self.previous)
def filter(self, evt): QLiveLib.setVar("CanProcessCueKeys", False) value = self.GetValue().strip() # numeric check if value.count(".") > 1 or value.count("-") > 1: self.ChangeValue(self.previous) elif value in ["", ".", "-"]: self.previous = value elif value and all(x in '0123456789.-' for x in value): self.previous = value try: tmp = float(value) except: tmp = 0 if self.mode == 0: self.value = tmp else: self.interp = tmp else: self.ChangeValue(self.previous)
def MouseDown(self, evt): if QLiveLib.getVar("MidiLearnMode"): self.parent.handleMidiScan() evt.Skip() return w, h = self.GetSize() if self._enable: rec = wx.Rect(5, 13, 45, 45) pos = evt.GetPosition() if rec.Contains(pos): self.clickPos = wx.GetMousePosition() self.oldValue = self.value self.CaptureMouse() self.selected = False rec = wx.Rect(w-15, 69, 15, 15) if rec.Contains(pos): self.showEdit = not self.showEdit self.editFunction(self.showEdit) QLiveLib.setVar("CanProcessCueKeys", True) wx.CallAfter(self.Refresh) evt.Skip()
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 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 saveFile(self, path): curpath = QLiveLib.getVar("currentProject") bakpath = curpath + ".bak" shutil.copy(curpath, bakpath) try: if not QLiveLib.getVar("locked"): QLiveLib.getVar("CuesPanel").onSaveCue() dictSave = self.getCurrentState() self.saveState = copy.deepcopy(dictSave) QLiveLib.setVar("currentProject", path) QLiveLib.setVar("projectFolder", os.path.dirname(path)) with open(path, "w") as f: f.write(QLIVE_MAGIC_LINE) f.write("### %s ###\n" % APP_VERSION) f.write("dictSave = %s" % pprint.pformat(dictSave, indent=4)) success = True self.setTitle(os.path.split(path)[1]) except: msg = "Failed to save file. Backup was created in project directory..." win = wx.MessageDialog(self, msg, style=wx.OK|wx.ICON_ERROR) success = False if success: os.remove(bakpath)
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) self.tracks.setSaveState(self.saveState["tracks"]) self.cues.setSaveDict(self.saveState["cues"]) self.mixer.setSaveDict(self.saveState["mixer"]) self.audioServer.setSaveState(self.saveState.get("server", {})) if "soundfiles" in self.saveState: self.soundfiles.setSaveState(self.saveState["soundfiles"]) linkMenuItem = self.GetMenuBar().FindItemById(LINK_STEREO_ID) linkMenuItem.Check(dictSave["mixer"].get("inputLinked", False))
def __init__(self, pos, size): wx.Frame.__init__(self, None, pos=pos, size=size) self.SetMinSize((600, 400)) self.SetTitle("QLive Session") # Status bar, the third filed is unused yet. self.status = self.CreateStatusBar(3) self.status.SetStatusWidths([100, 100, -1]) self.status.SetStatusText("CPU: 0.0 %", 0) self.status.SetStatusText("MEM: 0.00 Mb", 1) # Retrieve the current process self.process = psutil.Process() # Start a timer to update CPU and memory usage self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.updateUsage, self.timer) self.timer.Start(1000) self.audioServer = AudioServer() QLiveLib.setVar("AudioServer", self.audioServer) self.saveState = None menubar = wx.MenuBar() menu1 = wx.Menu() menu1.Append(wx.ID_NEW, "New\tCtrl+N") self.Bind(wx.EVT_MENU, self.onNew, id=wx.ID_NEW) menu1.Append(wx.ID_OPEN, "Open\tCtrl+O") self.Bind(wx.EVT_MENU, self.onLoad, id=wx.ID_OPEN) self.submenu1 = wx.Menu() ID_OPEN_RECENT = 2000 recentFiles = [] filename = QLiveLib.ensureNFD(OPEN_RECENT_PATH) if os.path.isfile(filename): f = codecs.open(filename, "r", encoding="utf-8") for line in f.readlines(): recentFiles.append(line.replace("\n", "")) f.close() if recentFiles: for file in recentFiles: self.submenu1.Append(ID_OPEN_RECENT, file) self.Bind(wx.EVT_MENU, self.openRecent, id=ID_OPEN_RECENT) ID_OPEN_RECENT += 1 menu1.AppendMenu(1999, "Open Recent...", self.submenu1) menu1.AppendSeparator() menu1.Append(wx.ID_CLOSE, "Close\tCtrl+W") self.Bind(wx.EVT_MENU, self.onClose, id=wx.ID_CLOSE) menu1.Append(wx.ID_SAVE, "Save\tCtrl+S") self.Bind(wx.EVT_MENU, self.onSave, id=wx.ID_SAVE) menu1.Append(wx.ID_SAVEAS, "Save As...\tShift+Ctrl+S") self.Bind(wx.EVT_MENU, self.onSaveAs, id=wx.ID_SAVEAS) if PLATFORM != "darwin": menu1.AppendSeparator() prefItem = menu1.Append(wx.ID_PREFERENCES, "Preferences...\tCtrl+;") self.Bind(wx.EVT_MENU, self.openPrefs, prefItem) if PLATFORM != "darwin": menu1.AppendSeparator() quitItem = menu1.Append(wx.ID_EXIT, "Quit\tCtrl+Q") self.Bind(wx.EVT_MENU, self.OnClose, quitItem) menubar.Append(menu1, 'File') menu2 = wx.Menu() menu2.Append(NEW_TRACK_ID, "Add Track\tCtrl+T") self.Bind(wx.EVT_MENU, self.onNewTrack, id=NEW_TRACK_ID) menu2.Append(DELETE_TRACK_ID, "Delete Track\tShift+Ctrl+D") self.Bind(wx.EVT_MENU, self.onDeleteTrack, id=DELETE_TRACK_ID) menubar.Append(menu2, 'Tracks') menu3 = wx.Menu() menu3.AppendCheckItem(LINK_STEREO_ID, "Link Mixer Sliders\tCtrl+L") self.Bind(wx.EVT_MENU, self.onLinkSliders, id=LINK_STEREO_ID) menubar.Append(menu3, 'Mixer') self.SetMenuBar(menubar) tabId = wx.NewId() self.prevId = wx.NewId() self.nextId = wx.NewId() accel_tbl = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_TAB, tabId), (wx.ACCEL_NORMAL, wx.WXK_LEFT, self.prevId), (wx.ACCEL_NORMAL, wx.WXK_RIGHT, self.nextId)]) self.SetAcceleratorTable(accel_tbl) self.Bind(wx.EVT_MENU, self.onTabulate, id=tabId) self.Bind(wx.EVT_MENU, self.onMoveCue, id=self.prevId, id2=self.nextId) self.mainPanel = wx.Panel(self, style=wx.SUNKEN_BORDER) self.mainPanel.SetBackgroundColour(BACKGROUND_COLOUR) self.audioMixer = AudioMixer() QLiveLib.setVar("AudioMixer", self.audioMixer) self.controlPanel = ControlPanel(self.mainPanel) QLiveLib.setVar("ControlPanel", self.controlPanel) csize = self.controlPanel.GetSize() self.cues = CuesPanel(self.mainPanel, size=(csize[0], 1000)) QLiveLib.setVar("CuesPanel", self.cues) splitter = wx.SplitterWindow(self.mainPanel, style=wx.SP_LIVE_UPDATE|wx.SP_3DSASH) self.tracks = FxTracks(splitter) QLiveLib.setVar("FxTracks", self.tracks) self.soundfiles = SoundFilePanel(splitter) QLiveLib.setVar("Soundfiles", self.soundfiles) splitter.SetMinimumPaneSize(60) splitter.SplitHorizontally(self.tracks, self.soundfiles, 350) self.mixer = MixerPanel(self.mainPanel, self.audioMixer) QLiveLib.setVar("MixerPanel", self.mixer) self.mainSizer = wx.BoxSizer(wx.HORIZONTAL) self.rightSizer = wx.BoxSizer(wx.VERTICAL) self.controlSizer = wx.BoxSizer(wx.VERTICAL) self.controlSizer.Add(self.controlPanel, 0) self.controlSizer.Add(self.cues, 1, wx.EXPAND) self.rightSizer.Add(splitter, 1, wx.EXPAND, 5) self.rightSizer.Add(self.mixer, 0, wx.EXPAND, 5) self.mainSizer.Add(self.controlSizer, 0) self.mainSizer.AddSizer(self.rightSizer, 2, wx.EXPAND, 5) self.mainPanel.SetSizer(self.mainSizer) wx.CallAfter(self.showIntro)
def onfocus(self, evt): QLiveLib.setVar("CanProcessCueKeys", False)
def doubleClick(self, evt): self.SelectAll() QLiveLib.setVar("CanProcessCueKeys", False)
def setSamplingRate(self, evt): if QLiveLib.getVar("sr") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("sr", evt.GetString())
def setnumOutputChannels(self, evt): if QLiveLib.getVar("nchnls") != int(evt.GetString()): self.reinit_server = True QLiveLib.setVar("nchnls", int(evt.GetString()))
def __init__(self, pos, size): wx.Frame.__init__(self, None, pos=pos, size=size) self.SetMinSize((600, 400)) self.SetTitle("QLive Session") # Status bar, the third field is unused yet. self.status = self.CreateStatusBar(3) self.status.SetStatusWidths([100, 150, -1]) self.status.SetStatusText("CPU: 0.0 %", 0) self.status.SetStatusText("MEM: 0.00 Mb", 1) # Retrieve the current process self.process = psutil.Process() # Start a timer to update CPU and memory usage self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.updateUsage, self.timer) self.timer.Start(1000) # Query & load available Audio and MIDI drivers QLiveLib.queryAudioMidiDrivers() self.audioServer = AudioServer() QLiveLib.setVar("AudioServer", self.audioServer) self.midiServer = MidiServer() QLiveLib.setVar("MidiServer", self.midiServer) self.saveState = None menubar = wx.MenuBar() menu1 = wx.Menu() menu1.Append(wx.ID_NEW, "New\tCtrl+N") self.Bind(wx.EVT_MENU, self.onNew, id=wx.ID_NEW) menu1.Append(wx.ID_OPEN, "Open\tCtrl+O") self.Bind(wx.EVT_MENU, self.onLoad, id=wx.ID_OPEN) self.submenu1 = wx.Menu() ID_OPEN_RECENT = 2000 recentFiles = QLiveLib.getRecentFiles() if recentFiles: for file in recentFiles: self.submenu1.Append(ID_OPEN_RECENT, file) self.Bind(wx.EVT_MENU, self.openRecent, id=ID_OPEN_RECENT) ID_OPEN_RECENT += 1 menu1.AppendMenu(1999, "Open Recent...", self.submenu1) menu1.AppendSeparator() menu1.Append(wx.ID_CLOSE, "Close\tCtrl+W") self.Bind(wx.EVT_MENU, self.onClose, id=wx.ID_CLOSE) menu1.Append(wx.ID_SAVE, "Save\tCtrl+S") self.Bind(wx.EVT_MENU, self.onSave, id=wx.ID_SAVE) menu1.Append(wx.ID_SAVEAS, "Save As...\tShift+Ctrl+S") self.Bind(wx.EVT_MENU, self.onSaveAs, id=wx.ID_SAVEAS) if PLATFORM != "darwin": menu1.AppendSeparator() prefItem = menu1.Append(wx.ID_PREFERENCES, "Preferences...\tCtrl+;") self.Bind(wx.EVT_MENU, self.openPrefs, prefItem) if PLATFORM != "darwin": menu1.AppendSeparator() quitItem = menu1.Append(wx.ID_EXIT, "Quit\tCtrl+Q") self.Bind(wx.EVT_MENU, self.OnQuit, quitItem) menubar.Append(menu1, 'File') menu4 = wx.Menu() menu4.Append(CUE_CUT_ID, "Cut Cue\tCtrl+X") self.Bind(wx.EVT_MENU, self.onCueCut, id=CUE_CUT_ID) menu4.Append(CUE_COPY_ID, "Copy Cue\tCtrl+C") self.Bind(wx.EVT_MENU, self.onCueCopy, id=CUE_COPY_ID) menu4.Append(CUE_PASTE_ID, "Paste Cue\tCtrl+V") self.Bind(wx.EVT_MENU, self.onCuePaste, id=CUE_PASTE_ID) menubar.Append(menu4, 'Cues') menu2 = wx.Menu() menu2.Append(NEW_TRACK_ID, "Add Track\tCtrl+T") self.Bind(wx.EVT_MENU, self.onNewTrack, id=NEW_TRACK_ID) menu2.Append(DELETE_TRACK_ID, "Delete Track\tShift+Ctrl+D") self.Bind(wx.EVT_MENU, self.onDeleteTrack, id=DELETE_TRACK_ID) menubar.Append(menu2, 'Tracks') menu3 = wx.Menu() menu3.AppendCheckItem(MIDI_LEARN_ID, "Midi Learn Mode\tShift+Ctrl+M") self.Bind(wx.EVT_MENU, self.onMidiLearn, id=MIDI_LEARN_ID) menu3.AppendSeparator() menu3.Append(INTERP_TIME_ID, "Set Global Interpolation Time\tCtrl+G") self.Bind(wx.EVT_MENU, self.onNewInterpTime, id=INTERP_TIME_ID) menu3.AppendSeparator() menu3.AppendCheckItem(VIEW_CUE_WINDOW_ID, "Show Current Cue Window\tShift+Ctrl+C") self.Bind(wx.EVT_MENU, self.onViewCurrentCue, id=VIEW_CUE_WINDOW_ID) menu3.AppendSeparator() menu3.AppendCheckItem(LINK_STEREO_ID, "Link Mixer Sliders\tCtrl+L") self.Bind(wx.EVT_MENU, self.onLinkSliders, id=LINK_STEREO_ID) menubar.Append(menu3, 'Actions') self.SetMenuBar(menubar) tabId = wx.NewId() self.prevId = KEY_EVENT_FIRST_ID self.nextId = KEY_EVENT_FIRST_ID + 1 self.cueZeroId = KEY_EVENT_FIRST_ID + 2 self.cue1Id = KEY_EVENT_FIRST_ID + 3 self.cue2Id = KEY_EVENT_FIRST_ID + 4 self.cue3Id = KEY_EVENT_FIRST_ID + 5 self.cue4Id = KEY_EVENT_FIRST_ID + 6 self.cue5Id = KEY_EVENT_FIRST_ID + 7 self.cue6Id = KEY_EVENT_FIRST_ID + 8 self.cue7Id = KEY_EVENT_FIRST_ID + 9 self.cue8Id = KEY_EVENT_FIRST_ID + 10 self.cue9Id = KEY_EVENT_FIRST_ID + 11 self.cue10Id = KEY_EVENT_FIRST_ID + 12 accel_tbl = wx.AcceleratorTable( [(wx.ACCEL_NORMAL, wx.WXK_TAB, tabId), (wx.ACCEL_NORMAL, wx.WXK_LEFT, self.prevId), (wx.ACCEL_NORMAL, wx.WXK_RIGHT, self.nextId), (wx.ACCEL_NORMAL, wx.WXK_ESCAPE, self.cueZeroId), (wx.ACCEL_NORMAL, ord("1"), self.cue1Id), (wx.ACCEL_NORMAL, ord("2"), self.cue2Id), (wx.ACCEL_NORMAL, ord("3"), self.cue3Id), (wx.ACCEL_NORMAL, ord("4"), self.cue4Id), (wx.ACCEL_NORMAL, ord("5"), self.cue5Id), (wx.ACCEL_NORMAL, ord("6"), self.cue6Id), (wx.ACCEL_NORMAL, ord("7"), self.cue7Id), (wx.ACCEL_NORMAL, ord("8"), self.cue8Id), (wx.ACCEL_NORMAL, ord("9"), self.cue9Id), (wx.ACCEL_NORMAL, ord("0"), self.cue10Id)]) self.SetAcceleratorTable(accel_tbl) self.Bind(wx.EVT_MENU, self.onTabulate, id=tabId) self.Bind(wx.EVT_MENU, self.onMoveCue, id=KEY_EVENT_FIRST_ID, id2=KEY_EVENT_FIRST_ID+100) self.mainPanel = wx.Panel(self, style=wx.SUNKEN_BORDER) self.mainPanel.SetBackgroundColour(BACKGROUND_COLOUR) self.audioMixer = AudioMixer() QLiveLib.setVar("AudioMixer", self.audioMixer) self.controlPanel = ControlPanel(self.mainPanel) QLiveLib.setVar("ControlPanel", self.controlPanel) csize = self.controlPanel.GetSize() self.cues = CuesPanel(self.mainPanel, size=(csize[0], 1000)) QLiveLib.setVar("CuesPanel", self.cues) self.currentCueWindow = CurrentCuePanel(self) QLiveLib.setVar("CurrentCueWindow", self.currentCueWindow) splitter = wx.SplitterWindow(self.mainPanel, style=wx.SP_LIVE_UPDATE|wx.SP_3DSASH) self.soundfiles = SoundFilePanel(splitter) QLiveLib.setVar("Soundfiles", self.soundfiles) self.tracks = FxTracks(splitter) QLiveLib.setVar("FxTracks", self.tracks) splitter.SetMinimumPaneSize(60) splitter.SplitHorizontally(self.tracks, self.soundfiles, 350) self.mixer = MixerPanel(self.mainPanel, self.audioMixer) QLiveLib.setVar("MixerPanel", self.mixer) self.mainSizer = wx.BoxSizer(wx.HORIZONTAL) self.rightSizer = wx.BoxSizer(wx.VERTICAL) self.controlSizer = wx.BoxSizer(wx.VERTICAL) self.controlSizer.Add(self.controlPanel, 0) self.controlSizer.Add(self.cues, 1, wx.EXPAND) self.rightSizer.Add(splitter, 1, wx.EXPAND, 5) self.rightSizer.Add(self.mixer, 0, wx.EXPAND, 5) self.mainSizer.Add(self.controlSizer, 0) self.mainSizer.AddSizer(self.rightSizer, 2, wx.EXPAND, 5) self.mainPanel.SetSizer(self.mainSizer) wx.CallAfter(self.showIntro)
def OnCellEditorHidden(self, evt): QLiveLib.setVar("CanProcessCueKeys", True)
def setBufferSize(self, evt): if QLiveLib.getVar("bufferSize") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("bufferSize", evt.GetString())
def setDuplex(self, evt): QLiveLib.setVar("duplex", evt.GetInt()) self.reinit_server = True
def enableTooltips(self, state): QLiveLib.setVar("useTooltips", state.GetEventObject().GetValue())
def setBufferSize(self, evt): if QLiveLib.getVar("bufferSize") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("bufferSize", evt.GetString())
def LooseFocus(self, event): self.selected = False QLiveLib.setVar("CanProcessCueKeys", True) wx.CallAfter(self.Refresh)
def setOutputDevice(self, evt): if QLiveLib.getVar("audioOutput") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("audioOutput", evt.GetString())
def setAudioDriver(self, evt): if QLiveLib.getVar("audio") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("audio", evt.GetString()) self.EnableDisablePortaudioOpts()
def setDuplex(self, state): if state.GetEventObject().GetValue() == True: QLiveLib.setVar("duplex", "1") else: QLiveLib.setVar("duplex", "0") self.reinit_server = True
def setOutputDevice(self, evt): if QLiveLib.getVar("audioOutput") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("audioOutput", evt.GetString())
def __init__(self, pos, size): wx.Frame.__init__(self, None, pos=pos, size=size) self.SetMinSize((600, 400)) # Status bar, the third field is unused yet. self.status = self.CreateStatusBar(3) self.status.SetStatusWidths([100, 150, -1]) self.status.SetStatusText("CPU: 0.0 %", 0) self.status.SetStatusText("MEM: 0.00 Mb", 1) # Retrieve the current process self.process = psutil.Process() # Start a timer to update CPU and memory usage self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.updateUsage, self.timer) self.timer.Start(1000) # Query & load available Audio and MIDI drivers QLiveLib.queryAudioMidiDrivers() self.audioServer = AudioServer() QLiveLib.setVar("AudioServer", self.audioServer) self.midiServer = MidiServer() QLiveLib.setVar("MidiServer", self.midiServer) self.saveState = None menubar = wx.MenuBar() menu1 = wx.Menu() menu1.Append(wx.ID_NEW, "New\tCtrl+N") self.Bind(wx.EVT_MENU, self.onNew, id=wx.ID_NEW) menu1.Append(wx.ID_OPEN, "Open\tCtrl+O") self.Bind(wx.EVT_MENU, self.onLoad, id=wx.ID_OPEN) self.submenu1 = wx.Menu() ID_OPEN_RECENT = 2000 recentFiles = QLiveLib.getRecentFiles() if recentFiles: for file in recentFiles: self.submenu1.Append(ID_OPEN_RECENT, file) self.Bind(wx.EVT_MENU, self.openRecent, id=ID_OPEN_RECENT) ID_OPEN_RECENT += 1 menu1.AppendMenu(1999, "Open Recent...", self.submenu1) menu1.AppendSeparator() menu1.Append(wx.ID_CLOSE, "Close\tCtrl+W") self.Bind(wx.EVT_MENU, self.onClose, id=wx.ID_CLOSE) menu1.Append(wx.ID_SAVE, "Save\tCtrl+S") self.Bind(wx.EVT_MENU, self.onSave, id=wx.ID_SAVE) menu1.Append(wx.ID_SAVEAS, "Save As...\tShift+Ctrl+S") self.Bind(wx.EVT_MENU, self.onSaveAs, id=wx.ID_SAVEAS) menu1.Append(EXPORT_MEI_ID, "Export MEI...\tShift+Ctrl+M") self.Bind(wx.EVT_MENU, self.onExportMEI, id=EXPORT_MEI_ID) menu1.Append(EXPORT_PDF_ID, "Export PDF...\tShift+Ctrl+P") self.Bind(wx.EVT_MENU, self.onExportPDF, id=EXPORT_PDF_ID) menu1.Enable(EXPORT_PDF_ID, False) if PLATFORM != "darwin": menu1.AppendSeparator() metaItem = menu1.Append(wx.ID_PROPERTIES, "Properties...") self.Bind(wx.EVT_MENU, self.openMeta, metaItem) if PLATFORM != "darwin": menu1.AppendSeparator() quitItem = menu1.Append(wx.ID_EXIT, "Quit\tCtrl+Q") self.Bind(wx.EVT_MENU, self.OnQuit, quitItem) menubar.Append(menu1, 'File') menu4 = wx.Menu() menu4.Append(CUE_CUT_ID, "Cut Cue\tCtrl+X") self.Bind(wx.EVT_MENU, self.onCueCut, id=CUE_CUT_ID) menu4.Append(CUE_COPY_ID, "Copy Cue\tCtrl+C") self.Bind(wx.EVT_MENU, self.onCueCopy, id=CUE_COPY_ID) menu4.Append(CUE_PASTE_ID, "Paste Cue\tCtrl+V") self.Bind(wx.EVT_MENU, self.onCuePaste, id=CUE_PASTE_ID) if PLATFORM != "darwin": menu4.AppendSeparator() menu4.Append(NEW_TRACK_ID, "Add Track\tCtrl+T") self.Bind(wx.EVT_MENU, self.onNewTrack, id=NEW_TRACK_ID) menu4.Append(DELETE_TRACK_ID, "Delete Track\tShift+Ctrl+D") self.Bind(wx.EVT_MENU, self.onDeleteTrack, id=DELETE_TRACK_ID) if PLATFORM != "darwin": menu4.AppendSeparator() prefItem = menu4.Append(wx.ID_PREFERENCES, "Preferences...\tCtrl+;") self.Bind(wx.EVT_MENU, self.openPrefs, prefItem) menubar.Append(menu4, 'Edit') menu3 = wx.Menu() item = menu3.AppendCheckItem(PLAY_MODE_ID, "Play Mode\tCtrl+E") item.Check(True) self.Bind(wx.EVT_MENU, self.onPlayMode, id=PLAY_MODE_ID) menu3.AppendSeparator() menu3.AppendCheckItem(MIDI_LEARN_ID, "Midi Learn Mode\tShift+Ctrl+M") self.Bind(wx.EVT_MENU, self.onMidiLearn, id=MIDI_LEARN_ID) menu3.AppendSeparator() menu3.Append(INTERP_TIME_ID, "Set Global Interpolation Time\tCtrl+G") self.Bind(wx.EVT_MENU, self.onNewInterpTime, id=INTERP_TIME_ID) menu3.AppendSeparator() menu3.AppendCheckItem(VIEW_CUE_WINDOW_ID, "Show Current Cue Window\tShift+Ctrl+C") self.Bind(wx.EVT_MENU, self.onViewCurrentCue, id=VIEW_CUE_WINDOW_ID) menu3.AppendSeparator() menu3.AppendCheckItem(LINK_STEREO_ID, "Link Mixer Sliders\tCtrl+L") self.Bind(wx.EVT_MENU, self.onLinkSliders, id=LINK_STEREO_ID) menubar.Append(menu3, 'Actions') self.SetMenuBar(menubar) tabId = wx.NewId() self.prevId = KEY_EVENT_FIRST_ID self.nextId = KEY_EVENT_FIRST_ID + 1 self.cueZeroId = KEY_EVENT_FIRST_ID + 2 self.cue1Id = KEY_EVENT_FIRST_ID + 3 self.cue2Id = KEY_EVENT_FIRST_ID + 4 self.cue3Id = KEY_EVENT_FIRST_ID + 5 self.cue4Id = KEY_EVENT_FIRST_ID + 6 self.cue5Id = KEY_EVENT_FIRST_ID + 7 self.cue6Id = KEY_EVENT_FIRST_ID + 8 self.cue7Id = KEY_EVENT_FIRST_ID + 9 self.cue8Id = KEY_EVENT_FIRST_ID + 10 self.cue9Id = KEY_EVENT_FIRST_ID + 11 self.cue10Id = KEY_EVENT_FIRST_ID + 12 accel_tbl = wx.AcceleratorTable( [(wx.ACCEL_NORMAL, wx.WXK_TAB, tabId), (wx.ACCEL_NORMAL, wx.WXK_LEFT, self.prevId), (wx.ACCEL_NORMAL, wx.WXK_RIGHT, self.nextId), (wx.ACCEL_NORMAL, wx.WXK_ESCAPE, self.cueZeroId), (wx.ACCEL_NORMAL, ord("1"), self.cue1Id), (wx.ACCEL_NORMAL, ord("2"), self.cue2Id), (wx.ACCEL_NORMAL, ord("3"), self.cue3Id), (wx.ACCEL_NORMAL, ord("4"), self.cue4Id), (wx.ACCEL_NORMAL, ord("5"), self.cue5Id), (wx.ACCEL_NORMAL, ord("6"), self.cue6Id), (wx.ACCEL_NORMAL, ord("7"), self.cue7Id), (wx.ACCEL_NORMAL, ord("8"), self.cue8Id), (wx.ACCEL_NORMAL, ord("9"), self.cue9Id), (wx.ACCEL_NORMAL, ord("0"), self.cue10Id)]) self.SetAcceleratorTable(accel_tbl) self.Bind(wx.EVT_MENU, self.onTabulate, id=tabId) self.Bind(wx.EVT_MENU, self.onMoveCue, id=KEY_EVENT_FIRST_ID, id2=KEY_EVENT_FIRST_ID+100) self.mainPanel = wx.Panel(self, style=wx.SUNKEN_BORDER) self.audioMixer = AudioMixer() QLiveLib.setVar("AudioMixer", self.audioMixer) self.controlPanel = ControlPanel(self.mainPanel) QLiveLib.setVar("ControlPanel", self.controlPanel) csize = self.controlPanel.GetSize() self.cues = CuesPanel(self.mainPanel, size=(csize[0], 1000)) QLiveLib.setVar("CuesPanel", self.cues) self.currentCueWindow = CurrentCuePanel(self) QLiveLib.setVar("CurrentCueWindow", self.currentCueWindow) self.splitter = wx.SplitterWindow(self.mainPanel, style=wx.SP_LIVE_UPDATE|wx.SP_3DSASH) self.soundfiles = SoundFilePanel(self.splitter) QLiveLib.setVar("Soundfiles", self.soundfiles) self.tracks = FxTracks(self.splitter) QLiveLib.setVar("FxTracks", self.tracks) self.splitter.SetMinimumPaneSize(60) self.splitter.SplitHorizontally(self.tracks, self.soundfiles, 350) self.mixer = MixerPanel(self.mainPanel, self.audioMixer) QLiveLib.setVar("MixerPanel", self.mixer) self.mainSizer = wx.BoxSizer(wx.HORIZONTAL) self.rightSizer = wx.BoxSizer(wx.VERTICAL) self.controlSizer = wx.BoxSizer(wx.VERTICAL) self.controlSizer.Add(self.controlPanel, 0) self.controlSizer.Add(self.cues, 1, wx.EXPAND) self.rightSizer.Add(self.splitter, 1, wx.EXPAND, 5) self.rightSizer.Add(self.mixer, 0, wx.EXPAND, 5) self.mainSizer.Add(self.controlSizer, 0) self.mainSizer.AddSizer(self.rightSizer, 2, wx.EXPAND, 5) self.mainPanel.SetSizer(self.mainSizer) self.setTitle() wx.CallAfter(self.showIntro)
def setFirstPhysicalOutput(self, evt): if QLiveLib.getVar("defaultFirstOutput") != int(evt.GetString()): self.reinit_server = True QLiveLib.setVar("defaultFirstOutput", int(evt.GetString()))
def setAudioDriver(self, evt): if QLiveLib.getVar("audio") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("audio", evt.GetString()) self.EnableDisablePortaudioOpts()
def setSamplingRate(self, evt): if QLiveLib.getVar("sr") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("sr", evt.GetString())
def OnCellEditorHidden(self, evt): QLiveLib.setVar("CanProcessCueKeys", True)
def enableTooltips(self, state): QLiveLib.setVar("useTooltips", state.GetEventObject().GetValue())
def OnCellEditorShown(self, evt): QLiveLib.setVar("CanProcessCueKeys", False)
def envOnInputsInterp(self, value, interp): self.envInputsInterp = value QLiveLib.setVar("CanProcessCueKeys", True) self.callback()
def envOnInputsInterp(self, value, interp): self.envInputsInterp = value QLiveLib.setVar("CanProcessCueKeys", True) self.callback()
def OnCellEditorShown(self, evt): QLiveLib.setVar("CanProcessCueKeys", False)
def setFirstPhysicalOutput(self, evt): if QLiveLib.getVar("defaultFirstOutput") != int(evt.GetString()): self.reinit_server = True QLiveLib.setVar("defaultFirstOutput", int(evt.GetString()))