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 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 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 onClose(self, evt): if self.tabAudio.reinit_server: try: QLiveLib.getVar("AudioServer").reinitServer() except: pass self.Destroy()
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 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 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 __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 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 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 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 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 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 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 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 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 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 askForSaving(self): state = True if self.saveState != self.getCurrentState(): if not QLiveLib.getVar("currentProject"): filename = "Untitled" else: filename = QLiveLib.getVar("currentProject") msg = 'file "%s" has been modified. Do you want to save?' % filename dlg = wx.MessageDialog(None, msg, 'Warning!', wx.YES | wx.NO | wx.CANCEL) but = dlg.ShowModal() if but == wx.ID_YES: self.onSave(None) elif but == wx.ID_CANCEL: state = False dlg.Destroy() return state
def __init__(self, id, filename, loopmode=0, transpo=1, gain=0, playing=0, directout=True, startpoint=0, endpoint=-1, crossfade=5, channel=0): 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 else: self.valid = True self.duration = info[1] 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.playerRef = None self.currentCue = 0 self.cues = {} self.saveCue()
def resetObjectRefs(self): tracks = QLiveLib.getVar("FxTracks").getTracks() for track in tracks: for but in track.getButtonInputs(): but.setAudioRef(None) for but in track.getButtonFxs(): but.setAudioRef(None)
def createBoxObjects(self): tracks = QLiveLib.getVar("FxTracks").getTracks() for track in tracks: chnls = 1 for but in track.getButtonInputs(): 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 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) for but in track.getButtonFxs(): name = but.name if not name: name = "None" ctrls = FX_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)
def onCuePaste(self, evt): cues = QLiveLib.getVar("CuesPanel") current = cues.getCurrentCue() if current == 0: QLiveLib.PRINT("Can't paste on cue number 0.") return cues.onPasteCue()
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 __init__(self): 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] self.server = Server(sr=sr, buffersize=bufferSize, audio=audio, jackname=jackname, nchnls=nchnls, duplex=duplex) if inchnls != None: self.server.setIchnls(inchnls) self.server.deactivateMidi() self.soundfiles = [] self.audioObjects = [] self.recording = False self.server.setOutputDevice(outdev) self.server.setInputOffset(firstin) self.server.setOutputOffset(firstout) if QLiveLib.getVar("duplex"): self.server.setInputDevice(indev) self.server.boot()
def __init__(self, parent, parameters, fxbox): wx.Panel.__init__(self, parent) self.SetBackgroundColour(BACKGROUND_COLOUR) interpTime = QLiveLib.getVar("globalInterpTime") self.fromUser = False self.midiscanning = False self.parameters = parameters self.fxbox = fxbox self.name = parameters[0] self.sizer = wx.BoxSizer(wx.VERTICAL) self.slider = QLiveControlKnob(self, parameters[2], parameters[3], parameters[1], label=parameters[0], log=parameters[5], outFunction=self.outputValue, editFunction=self.onEditFunction) self.sizer.Add(self.slider, 0, wx.ALL, 5) self.interpKnob = QLiveControlKnob(self, INTERPTIME_MIN, INTERPTIME_MAX, interpTime, label=parameters[0], log=True, outFunction=self.outputInterpValue, outOnShiftFunction=self.onChangeAllInterp, backColour=CONTROLSLIDER_BACK_COLOUR_INTERP) self.sizer.Add(self.interpKnob, 0, wx.ALL, 5) self.interpKnob.Hide() self.SetSizer(self.sizer)
def openMenu(self, event): fxTracks = QLiveLib.getVar("FxTracks") menu = wx.Menu() id = BOX_MENU_ITEM_FIRST_ID if self.isInput == False: for fxList in self.choices: id_orig = id subMenu = wx.Menu() for fx in fxList[1:]: id += 1 subMenu.Append(id, fx) menu.AppendMenu(id_orig, fxList[0], subMenu) id = id_orig + self.i if self.isInput == True: for name in self.choices: menu.Append(id, name) id += 1 fxTracks.Bind(wx.EVT_MENU, self.select, id=BOX_MENU_ITEM_FIRST_ID, id2=id) fxTracks.PopupMenu(menu, event.GetPosition()) menu.Destroy()
def keyDown(self, event): if QLiveLib.getVar("MidiLearnMode"): if event.GetKeyCode() in [ wx.WXK_BACK, wx.WXK_DELETE, wx.WXK_NUMPAD_DELETE ]: self.parent.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] 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 __init__(self, parent, parameters, fxbox): wx.Panel.__init__(self, parent) self.SetBackgroundColour(BACKGROUND_COLOUR) interpTime = QLiveLib.getVar("globalInterpTime") self.fromUser = False self.midiscanning = False self.parameters = parameters self.fxbox = fxbox self.name = parameters[0] self.sizer = wx.BoxSizer(wx.VERTICAL) self.slider = QLiveControlKnob(self, parameters[2], parameters[3], parameters[1], label=parameters[0], log=parameters[5], outFunction=self.outputValue, editFunction=self.onEditFunction) self.sizer.Add(self.slider, 0, wx.ALL, 5) self.interpKnob = QLiveControlKnob( self, INTERPTIME_MIN, INTERPTIME_MAX, interpTime, label=parameters[0], log=True, outFunction=self.outputInterpValue, outOnShiftFunction=self.onChangeAllInterp, backColour=CONTROLSLIDER_BACK_COLOUR_INTERP) self.sizer.Add(self.interpKnob, 0, wx.ALL, 5) self.slider.Bind(wx.EVT_RIGHT_DOWN, self.MouseRightDown) self.interpKnob.Hide() self.SetSizer(self.sizer)
def midiLearn(self, evt): obj = evt.GetEventObject() midi = QLiveLib.getVar("MidiServer") # remove current binding if evt.ShiftDown(): num = -1 if obj == self.upButton: search, bitmap = "up", self.upbmp elif obj == self.downButton: search, bitmap = "down", self.downbmp for key, val in self.midiBindings.items(): if val == search: num = key break obj.SetBitmapLabel(bitmap) obj.SetToolTip(QLiveTooltip("")) midi.noteonscan(None) self.learnButton = None if num != -1: midi.unbind("noteon", num, self.midi) # stop midi learn elif self.learnButton == obj: if obj == self.upButton: obj.SetBitmapLabel(self.upbmp) elif obj == self.downButton: obj.SetBitmapLabel(self.downbmp) self.learnButton = None midi.noteonscan(None) # start midi learn else: if obj == self.upButton: obj.SetBitmapLabel(self.upmidbmp) elif obj == self.downButton: obj.SetBitmapLabel(self.downmidbmp) midi.noteonscan(self.getMidiScan) self.learnButton = obj
def __init__(self, parent, callback=None): wx.Frame.__init__(self, parent) self.callback = callback panel = wx.Panel(self) sizer = wx.BoxSizer(wx.VERTICAL) upSizer = wx.BoxSizer(wx.HORIZONTAL) downSizer = wx.BoxSizer(wx.HORIZONTAL) title = wx.StaticText(panel, -1, "GLOBAL INTERPOLATION TIME") sizer.Add(title, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, 5) sampleList = ["Current Cue", "All Cues"] self.cueButton = wx.RadioBox(panel, -1, "", wx.DefaultPosition, wx.DefaultSize, sampleList, 1, wx.RA_SPECIFY_COLS | wx.NO_BORDER) upSizer.Add(self.cueButton, 0, wx.BOTTOM | wx.LEFT | wx.RIGHT, 5) sampleList = ["Current Track", "All Tracks", "Not Applied to Tracks"] self.trackButton = wx.RadioBox(panel, -1, "", wx.DefaultPosition, wx.DefaultSize, sampleList, 1, wx.RA_SPECIFY_COLS | wx.NO_BORDER) upSizer.Add(self.trackButton, 0, wx.BOTTOM | wx.LEFT | wx.RIGHT, 5) sampleList = [ "Current Soundfile", "All Soundfiles", "Not Applied to Soundfiles" ] self.sndButton = wx.RadioBox(panel, -1, "", wx.DefaultPosition, wx.DefaultSize, sampleList, 1, wx.RA_SPECIFY_COLS | wx.NO_BORDER) upSizer.Add(self.sndButton, 0, wx.BOTTOM | wx.LEFT | wx.RIGHT, 5) sizer.Add(upSizer, 0) knobSizer = wx.BoxSizer(wx.HORIZONTAL) self.method = wx.Choice(panel, -1, choices=[ "Overwrite", "Add to Current Values", "Substract to Current Values" ]) self.method.SetSelection(0) self.knob = QLiveControlKnob(panel, INTERPTIME_MIN, INTERPTIME_MAX, init=QLiveLib.getVar("globalInterpTime"), showAutomation=False, label="Time") self.knob.SetFocus() knobSizer.Add(self.method, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 5) knobSizer.Add(self.knob, 1, wx.LEFT | wx.RIGHT, 30) sizer.Add(knobSizer, 0, wx.TOP | wx.BOTTOM, 10) sizer.Add(wx.StaticLine(panel, size=(360, 1)), 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 4) applyButton = wx.Button(panel, -1, label="Apply") applyButton.Bind(wx.EVT_BUTTON, self.onApply) closeButton = wx.Button(panel, -1, label="Close") closeButton.Bind(wx.EVT_BUTTON, self.onClose) downSizer.Add(applyButton, 0, wx.RIGHT, 5) downSizer.Add(closeButton, 0, wx.RIGHT, 5) sizer.Add(downSizer, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT | wx.TOP, 10) panel.SetSizerAndFit(sizer) psize = panel.GetSize() self.SetSize((psize[0] + 5, psize[1] + 40)) self.Show()
def midi(self, pitch, vel): which = self.midiBindings[pitch] if which == "up": wx.CallAfter(QLiveLib.getVar("CuesPanel").onMoveCueUp) elif which == "down": wx.CallAfter(QLiveLib.getVar("CuesPanel").onMoveCueDown)
def onNew(self, evt): if self.askForSaving(): QLiveLib.getVar("Soundfiles").cleanUpSoundsFolder() self.Hide() self.showIntro()
def onTabulate(self, evt): QLiveLib.getVar("FxTracks").setSelectedTrack()
def assignMidiCtl(self, ctlnum): interpTime = QLiveLib.getVar("globalInterpTime") self.slider.setMidiCtl(ctlnum) QLiveLib.getVar("MidiServer").bind("ctls", ctlnum, self.midi) self.setInterpValue(interpTime, True)
def setBufferSize(self, evt): if QLiveLib.getVar("bufferSize") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("bufferSize", evt.GetString())
def revertMidiAssignation(self): self.midiscanning = False QLiveLib.getVar("MidiServer").ctlscan(None) self.revertMidiBackgroundColour() QLiveLib.getVar("MidiServer").unbind("ctls", self.midictl, self.midi) self.setMidiCtl(None)
def setnumOutputChannels(self, evt): if QLiveLib.getVar("nchnls") != int(evt.GetString()): self.reinit_server = True QLiveLib.setVar("nchnls", int(evt.GetString()))
def setFirstPhysicalOutput(self, evt): if QLiveLib.getVar("defaultFirstOutput") != int(evt.GetString()): self.reinit_server = True QLiveLib.setVar("defaultFirstOutput", int(evt.GetString()))
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 assignMidiCtl(self, ctlnum): self.setMidiCtl(ctlnum) QLiveLib.getVar("MidiServer").bind("ctls", ctlnum, self.midi)
def MakeEnvPaneContent(self, panel): interpTime = QLiveLib.getVar("globalInterpTime") mainbox = wx.StaticBox(panel, -1, "") sizer = wx.StaticBoxSizer(mainbox, wx.VERTICAL) sizer.AddSpacer(5) headSizer = wx.BoxSizer(wx.HORIZONTAL) headSizer.AddStretchSpacer(1) self.envActiveCheck = wx.CheckBox(panel, -1, "Active:", style=wx.ALIGN_RIGHT) self.envActiveCheck.Bind(wx.EVT_CHECKBOX, self.envOnActivate) headSizer.Add(self.envActiveCheck, 0, wx.ALIGN_CENTER_HORIZONTAL) self.envChannelChecks = [] statbox = wx.StaticBox(panel, -1, "Input Selections") selectorSizer = wx.StaticBoxSizer(statbox, wx.HORIZONTAL) for i in range(NUM_INPUTS): check = wx.CheckBox(panel, -1, str(i+1)) check.Bind(wx.EVT_CHECKBOX, self.envOnCheckInputs) if i == 0: check.SetValue(1) self.envInputs[0] = 1 self.envChannelChecks.append(check) selectorSizer.Add(check, 1, wx.EXPAND|wx.ALL, 5) interpLabel = wx.StaticText(panel, -1, label="Input Interpolation Time in Seconds: ") self.envInInterpCtrl = NumericCtrl(panel, value=interpTime, interp=0, size=(80, -1), callback=self.envOnInputsInterp) interpSizer = wx.BoxSizer(wx.HORIZONTAL) interpSizer.Add(interpLabel, -1, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 5) interpSizer.Add(self.envInInterpCtrl) sampleList = ["Parameter Values", "Interpolation Times"] interpButton = wx.RadioBox(panel, -1, "", wx.DefaultPosition, wx.DefaultSize, sampleList, 2, wx.RA_SPECIFY_COLS | wx.NO_BORDER) interpButton.Bind(wx.EVT_RADIOBOX, self.envChangeParamMode) params = [["Threshold (dB)", -90, interpTime, self.envOnThresh], ["Cutoff (Hz)", 20, interpTime, self.envOnCutoff], ["Range Min", 0, interpTime, self.envOnMin], ["Range Max", 1, interpTime, self.envOnMax]] self.envWidgets = [] knobSizer = wx.BoxSizer(wx.HORIZONTAL) for param in params: numbox = wx.BoxSizer(wx.VERTICAL) label = wx.StaticText(panel, -1, label=param[0]) ctrl = NumericCtrl(panel, value=param[1], interp=param[2], size=(80, -1), callback=param[3]) self.envWidgets.append(ctrl) numbox.Add(label, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 2) numbox.Add(ctrl, 0, wx.LEFT|wx.RIGHT|wx.EXPAND, 2) knobSizer.Add(numbox, 1, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, 5) sizer.Add(headSizer, 0, wx.EXPAND) sizer.Add(selectorSizer, 0, wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, 5) sizer.Add(interpSizer, 0, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) sizer.Add(interpButton, 0, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) sizer.Add(knobSizer, 0, wx.EXPAND|wx.LEFT|wx.RIGHT, 5) panel.SetSizer(sizer)
def __init__(self, parent, fxbox, parameters): style = wx.DEFAULT_FRAME_STYLE | wx.FRAME_FLOAT_ON_PARENT wx.Frame.__init__(self, parent, style=style) self.parent = parent self.fxbox = fxbox self.parameters = parameters self.last_enable = 1 self.graph_object = None closeId = wx.NewId() 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_CTRL, ord('W'), closeId), (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) mainWin = QLiveLib.getVar("MainWindow") self.Bind(wx.EVT_MENU, mainWin.onTabulate, id=tabId) self.Bind(wx.EVT_MENU, mainWin.onMoveCue, id=KEY_EVENT_FIRST_ID, id2=KEY_EVENT_FIRST_ID + 100) self.Bind(wx.EVT_MENU, self.onClose, id=closeId) self.Bind(wx.EVT_CLOSE, self.onClose) self.SetTitle("%s Parameter Controls" % self.fxbox.name) self.panel = wx.Panel(self) self.panel.SetBackgroundColour(BACKGROUND_COLOUR) self.sizer = wx.BoxSizer(wx.VERTICAL) # Head headSizer = wx.BoxSizer(wx.HORIZONTAL) headSizer.AddStretchSpacer(1) self.enable = wx.CheckBox(self.panel, -1, "Enable FX:", style=wx.ALIGN_RIGHT) self.enable.SetValue(1) self.enable.Bind(wx.EVT_CHECKBOX, self.enableFx) headSizer.Add(self.enable, 0, wx.TOP | wx.RIGHT, 5) self.sizer.Add(headSizer, 0, wx.EXPAND) self.sizer.Add(wx.StaticLine(self.panel, -1), 0, wx.ALL | wx.EXPAND, 5) # Selection boxes if self.parameters.has_key("inselect"): self.inChannelChecks = [] statbox = wx.StaticBox(self.panel, -1, "Input Selections") selectorSizer = wx.StaticBoxSizer(statbox, wx.HORIZONTAL) labels = self.parameters["inselect"] for i in range(len(labels)): check = wx.CheckBox(self.panel, -1, labels[i]) check.Bind(wx.EVT_CHECKBOX, self.onCheckInSelect) if i == 0: check.SetValue(1) self.inChannelChecks.append(check) selectorSizer.Add(check, 1, wx.EXPAND | wx.ALL, 5) self.sizer.Add(selectorSizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 5) sampleList = ["Mono Track", "Multi-Channel Track"] self.chnlsButton = wx.RadioBox(self.panel, -1, "", wx.DefaultPosition, wx.DefaultSize, sampleList, 2, wx.RA_SPECIFY_COLS | wx.NO_BORDER) self.chnlsButton.Bind(wx.EVT_RADIOBOX, self.onChnlsRadioBox) self.sizer.Add(self.chnlsButton, 0, wx.LEFT, 5) self.sizer.Add(wx.StaticLine(self.panel), 0, wx.ALL | wx.EXPAND, 5) if self.parameters.has_key("outselect"): self.outChannelChecks = [] statbox = wx.StaticBox(self.panel, -1, "Output Selections") selectorSizer = wx.StaticBoxSizer(statbox, wx.HORIZONTAL) labels = self.parameters["outselect"] for i in range(len(labels)): check = wx.CheckBox(self.panel, -1, labels[i]) check.Bind(wx.EVT_CHECKBOX, self.onCheckOutSelect) if i == 0: check.SetValue(1) self.outChannelChecks.append(check) selectorSizer.Add(check, 1, wx.EXPAND | wx.ALL, 5) self.sizer.Add(selectorSizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 5) if self.parameters.has_key("select"): self.selectedSoundfile = "None" soundfiles = QLiveLib.getVar("Soundfiles").getSoundFileObjects() choices = ["None"] + [str(snd.getId() + 1) for snd in soundfiles] popupSizer = wx.BoxSizer(wx.HORIZONTAL) popupTitle = wx.StaticText(self.panel, -1, "Choose a Soundfile:") popupSizer.Add(popupTitle, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5) self.soundfilesPopup = wx.Choice(self.panel, -1, choices=choices) self.soundfilesPopup.SetSelection(0) self.soundfilesPopup.Bind(wx.EVT_CHOICE, self.chooseSoundfile) popupSizer.Add(self.soundfilesPopup, 0, wx.ALL, 5) self.sizer.Add(popupSizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 5) # Controller box if self.parameters.has_key("ctrls"): knobSizer = wx.BoxSizer(wx.HORIZONTAL) sampleList = ["Slider Values", "Interpolation Times"] self.interpButton = wx.RadioBox(self.panel, -1, "", wx.DefaultPosition, wx.DefaultSize, sampleList, 2, wx.RA_SPECIFY_COLS | wx.NO_BORDER) self.interpButton.Bind(wx.EVT_RADIOBOX, self.showMorphEvent) self.sizer.Add(self.interpButton, 0, wx.LEFT, 5) self.widgets = [] for param in self.parameters["ctrls"]: slider = SliderWidget(self.panel, param, fxbox) self.widgets.append(slider) knobSizer.Add(slider, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) self.sizer.Add(knobSizer, 0, wx.EXPAND) self.graph = Grapher(self.panel, xlen=256, yrange=(0, 1), init=[(0, 0), (0.5, 0.5), (1, 0)], mode=0, outFunction=None) self.graph.SetSize((500, 200)) self.graph.Hide() self.sizer.Add(self.graph, 1, wx.EXPAND | wx.ALL, 5) self.panel.SetSizer(self.sizer) self.frameSizer = wx.BoxSizer(wx.HORIZONTAL) self.frameSizer.Add(self.panel, 1, wx.EXPAND) self.SetSizerAndFit(self.frameSizer) self.Bind(wx.EVT_ENTER_WINDOW, self.getFocus) self.SetMinSize((500, -1)) self.SetSize((500, -1))
def __init__(self, parent, object=None, paramCallback=None): wx.Panel.__init__(self, parent, -1) cpstyle = wx.CP_DEFAULT_STYLE|wx.CP_NO_TLW_RESIZE self.SetBackgroundColour(BACKGROUND_COLOUR) interpTime = QLiveLib.getVar("globalInterpTime") # parameter object reference self.object = object self.paramCallback = paramCallback # global attributes self.mixingMethod = 0 self.active = 0 # envelope follower attributes self.envActive = 0 self.envInputs = [0] * NUM_INPUTS self.envInputsInterp = interpTime self.envThreshold, self.envThresholdInterp = -90, interpTime self.envCutoff, self.envCutoffInterp = 20, interpTime self.envMin, self.envMinInterp = 0.0, interpTime self.envMax, self.envMaxInterp = 1.0, interpTime # breakpoint-function attributes self.bpfActive = 0 self.bpfMode = 0 self.bpfDur, self.bpfDurInterp = 1.0, interpTime self.bpfMin, self.bpfMinInterp = 0.0, interpTime self.bpfMax, self.bpfMaxInterp = 1.0, interpTime self.bpfFunction = [(0, 0.0), (512, 1.0)] title = wx.StaticText(self, label="Automation Controls") title.SetFont(wx.Font(12, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)) methodChoices = ["Added to the main value", "Multiplying the main value", "Added and replace main value", "Times and replace main value"] headSizer = wx.BoxSizer(wx.HORIZONTAL) headSizer.AddStretchSpacer(1) methodLabel = wx.StaticText(self, -1, label="Multiple Automations Mixing Method:") self.method = wx.Choice(self, -1, choices=methodChoices) self.method.SetSelection(0) self.method.Bind(wx.EVT_CHOICE, self.changeMixingMethod) headSizer.Add(methodLabel, 0, wx.RIGHT|wx.TOP, 5) headSizer.Add(self.method, 0, wx.ALIGN_CENTER_HORIZONTAL) # Collapsible Panes - TODO: remove those we won't use in the prototype? id = AUTOMATION_PANEL_FIRST_ID self.bpfCp = wx.CollapsiblePane(self, id, label="BPF", style=cpstyle) self.MakeBpfPaneContent(self.bpfCp.GetPane()) self.envCp = wx.CollapsiblePane(self, id+1, label="Envelope Follower", style=cpstyle) self.MakeEnvPaneContent(self.envCp.GetPane()) # self.lfoCp = wx.CollapsiblePane(self, id+2, label="LFO", style=cpstyle) # self.randCp = wx.CollapsiblePane(self, id+3, label="Random", # style=cpstyle) # self.pitCp = wx.CollapsiblePane(self, id+4, label="Pitch Follower", # style=cpstyle) # self.zeroCp = wx.CollapsiblePane(self, id+5, label="Zero-Crossing", # style=cpstyle) # self.centCp = wx.CollapsiblePane(self, id+6, label="Centroid", # style=cpstyle) self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnPaneChanged, id=id, id2=id+1) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(title, 0, wx.ALL|wx.CENTER, 5) sizer.Add(headSizer, 0, wx.ALL|wx.EXPAND, 5) sizer.Add(self.bpfCp, 0, wx.ALL|wx.EXPAND, 5) sizer.Add(self.envCp, 0, wx.ALL|wx.EXPAND, 5) #sizer.Add(self.lfoCp, 0, wx.ALL|wx.EXPAND, 5) #sizer.Add(self.randCp, 0, wx.ALL|wx.EXPAND, 5) #sizer.Add(self.pitCp, 0, wx.ALL|wx.EXPAND, 5) #sizer.Add(self.zeroCp, 0, wx.ALL|wx.EXPAND, 5) #sizer.Add(self.centCp, 0, wx.ALL|wx.EXPAND, 5) self.SetSizer(sizer)
def enableFx(self, evt): self.fxbox.setEnable(evt.GetInt(), fromUser=True) QLiveLib.getVar("FxTracks").drawAndRefresh()
def setSamplingRate(self, evt): if QLiveLib.getVar("sr") != evt.GetString(): self.reinit_server = True QLiveLib.setVar("sr", evt.GetString())
def setTitle(self, filename=""): if QLiveLib.getVar("locked"): state = "PLAY MODE" else: state = "EDIT MODE" self.SetTitle("QLive Session - " + filename + " - " + state)
def getFocus(self, evt): if self.parameters.has_key("select"): soundfiles = QLiveLib.getVar("Soundfiles").getSoundFileObjects() choices = ["None"] + [str(snd.getId() + 1) for snd in soundfiles] self.soundfilesPopup.SetItems(choices) self.soundfilesPopup.SetStringSelection(self.selectedSoundfile)
def __init__(self, parent): wx.Panel.__init__(self, parent) self.reinit_server = False # Setting audio driver audioDriverDefault = QLiveLib.getVar("audio") audioDriverLabel = wx.StaticText(self, -1, "Audio driver:") self.audioDriverCB = wx.ComboBox(self, -1, audioDriverDefault, wx.DefaultPosition, wx.DefaultSize, AUDIO_DRIVERS, wx.CB_READONLY|wx.TE_PROCESS_ENTER) self.audioDriverCB.Bind(wx.EVT_COMBOBOX, self.setAudioDriver, self.audioDriverCB) # Portaudio: Audio Input devices self.inputDeviceLabel = wx.StaticText(self, -1, "Audio Input (portaudio):") availableAudioIns = [] for d in QLiveLib.getVar("availableAudioInputs"): availableAudioIns.append(QLiveLib.ensureNFD(d)) initInput = QLiveLib.ensureNFD(QLiveLib.getVar("audioInput")) self.inputDeviceCB = wx.ComboBox(self, -1, initInput, wx.DefaultPosition, wx.DefaultSize, availableAudioIns, wx.CB_READONLY|wx.TE_PROCESS_ENTER) self.inputDeviceCB.Bind(wx.EVT_COMBOBOX, self.setInputDevice, self.inputDeviceCB) # Portaudio: Audio Output devices self.outputDeviceLabel = wx.StaticText(self, -1, "Audio Output (portaudio):") availableAudioOuts = [] for d in QLiveLib.getVar("availableAudioOutputs"): availableAudioOuts.append(QLiveLib.ensureNFD(d)) initOutput = QLiveLib.ensureNFD(QLiveLib.getVar("audioOutput")) self.outputDeviceCB = wx.ComboBox(self, -1, initOutput, wx.DefaultPosition, wx.DefaultSize, availableAudioOuts, wx.CB_READONLY|wx.TE_PROCESS_ENTER) self.outputDeviceCB.Bind(wx.EVT_COMBOBOX, self.setOutputDevice, self.outputDeviceCB) # Number of input channels self.numInputChannelsLabel = wx.StaticText(self, -1, "Number of Input Channels:") initInputChannels = str(QLiveLib.getVar("inchnls")) self.numInputChannelsCB = wx.ComboBox(self, -1, initInputChannels, wx.DefaultPosition, wx.DefaultSize, [str(x) for x in range(9)], wx.CB_READONLY|wx.TE_PROCESS_ENTER) self.numInputChannelsCB.Bind(wx.EVT_COMBOBOX, self.setnumInputChannels, self.numInputChannelsCB) # Number of output channels self.numOutputChannelsLabel = wx.StaticText(self, -1, "Number of Output Channels:") initOutputChannels = str(QLiveLib.getVar("nchnls")) self.numOutputChannelsCB = wx.ComboBox(self, -1, initOutputChannels, wx.DefaultPosition, wx.DefaultSize, [str(x) for x in range(9)], wx.CB_READONLY|wx.TE_PROCESS_ENTER) self.numOutputChannelsCB.Bind(wx.EVT_COMBOBOX, self.setnumOutputChannels, self.numOutputChannelsCB) # First physical input device self.firstPhysicalInputLabel = wx.StaticText(self, -1, "First Physical Input:") initPysicalInput = str(QLiveLib.getVar("defaultFirstInput")) self.firstPhysicalInputCB = wx.ComboBox(self, -1, initPysicalInput, wx.DefaultPosition, wx.DefaultSize, [str(x) for x in range(36)], wx.CB_READONLY|wx.TE_PROCESS_ENTER) self.firstPhysicalInputCB.Bind(wx.EVT_COMBOBOX, self.setFirstPhysicalInput, self.firstPhysicalInputCB) # First physical output device self.firstPhysicalOutputLabel = wx.StaticText(self, -1, "First Physical Output:") initPysicalOutput = str(QLiveLib.getVar("defaultFirstOutput")) self.firstPhysicalOutputCB = wx.ComboBox(self, -1, initPysicalOutput, wx.DefaultPosition, wx.DefaultSize, [str(x) for x in range(36)], wx.CB_READONLY|wx.TE_PROCESS_ENTER) self.firstPhysicalOutputCB.Bind(wx.EVT_COMBOBOX, self.setFirstPhysicalOutput, self.firstPhysicalOutputCB) # Setting buffer size bufferSizeDefault = QLiveLib.getVar("bufferSize") bufferSizeLabel = wx.StaticText(self, -1, "Buffer size:") self.bufferSizeCB = wx.ComboBox(self, -1, bufferSizeDefault, wx.DefaultPosition, wx.DefaultSize, BUFFER_SIZES, wx.CB_READONLY|wx.TE_PROCESS_ENTER) self.bufferSizeCB.Bind(wx.EVT_COMBOBOX, self.setBufferSize, self.bufferSizeCB) # Setting sampling rate samplingRateDefault = QLiveLib.getVar("sr") samplingRateLabel = wx.StaticText(self, -1, "Sampling rate:") self.samplingRateCB = wx.ComboBox(self, -1, samplingRateDefault, wx.DefaultPosition, wx.DefaultSize, SAMPLE_RATES, wx.CB_READONLY|wx.TE_PROCESS_ENTER) self.samplingRateCB.Bind(wx.EVT_COMBOBOX, self.setSamplingRate, self.samplingRateCB) # Setting duplex True/False duplexDefault = QLiveLib.getVar("duplex") duplexLabel = wx.StaticText(self, -1, "Duplex:") self.duplexCB = wx.CheckBox(self, -1, "", style=wx.ALIGN_LEFT) self.duplexCB.SetValue(bool(int(QLiveLib.getVar("duplex")))) self.duplexCB.Bind(wx.EVT_CHECKBOX, self.setDuplex, self.duplexCB) # Main box box = wx.StaticBox(self, -1, "Audio settings") # Sizers vsizer = wx.StaticBoxSizer(box, wx.VERTICAL) hsizerAudioDriver = wx.BoxSizer(wx.HORIZONTAL) hsizerInputDevice = wx.BoxSizer(wx.HORIZONTAL) hsizerOutputDevice = wx.BoxSizer(wx.HORIZONTAL) hsizerNumInputChannels = wx.BoxSizer(wx.HORIZONTAL) hsizerNumOutputChannels = wx.BoxSizer(wx.HORIZONTAL) hsizerFirstPhysicalInput = wx.BoxSizer(wx.HORIZONTAL) hsizerFirstPhysicalOutput = wx.BoxSizer(wx.HORIZONTAL) hsizerBufferSize = wx.BoxSizer(wx.HORIZONTAL) hsizerSamplingRate = wx.BoxSizer(wx.HORIZONTAL) hsizerDuplex = wx.BoxSizer(wx.HORIZONTAL) hsizerAudioDriver.Add(audioDriverLabel, -1, wx.ALL|wx.ALIGN_CENTER, 3) hsizerAudioDriver.Add(self.audioDriverCB, -1, wx.ALL, 3) hsizerInputDevice.Add(self.inputDeviceLabel, -1, wx.ALL|wx.ALIGN_CENTER, 3) hsizerInputDevice.Add(self.inputDeviceCB, -1, wx.ALL, 3) hsizerOutputDevice.Add(self.outputDeviceLabel, -1, wx.ALL|wx.ALIGN_CENTER, 3) hsizerOutputDevice.Add(self.outputDeviceCB, -1, wx.ALL, 3) hsizerNumInputChannels.Add(self.numInputChannelsLabel, -1, wx.ALL|wx.ALIGN_CENTER, 3) hsizerNumInputChannels.Add(self.numInputChannelsCB, -1, wx.ALL, 3) hsizerNumOutputChannels.Add(self.numOutputChannelsLabel, -1, wx.ALL|wx.ALIGN_CENTER, 3) hsizerNumOutputChannels.Add(self.numOutputChannelsCB, -1, wx.ALL, 3) hsizerFirstPhysicalInput.Add(self.firstPhysicalInputLabel, -1, wx.ALL|wx.ALIGN_CENTER, 3) hsizerFirstPhysicalInput.Add(self.firstPhysicalInputCB, -1, wx.ALL, 3) hsizerFirstPhysicalOutput.Add(self.firstPhysicalOutputLabel, -1, wx.ALL|wx.ALIGN_CENTER, 3) hsizerFirstPhysicalOutput.Add(self.firstPhysicalOutputCB, -1, wx.ALL, 3) hsizerBufferSize.Add(bufferSizeLabel, -1, wx.ALL|wx.ALIGN_CENTER , 3) hsizerBufferSize.Add(self.bufferSizeCB, -1, wx.ALL, 3) hsizerSamplingRate.Add(samplingRateLabel, -1, wx.ALL|wx.ALIGN_CENTER , 3) hsizerSamplingRate.Add(self.samplingRateCB, -1, wx.ALL, 3) hsizerDuplex.Add(duplexLabel, -1, wx.ALL|wx.ALIGN_CENTER , 3) hsizerDuplex.Add(self.duplexCB, -1, wx.ALL, 3) vsizer.AddSpacer(5) m = "The changes will be effective when the preferences will be closed." vsizer.Add(wx.StaticText(self, -1, m), 0, wx.ALIGN_CENTER_HORIZONTAL) vsizer.AddSpacer(5) vsizer.Add(hsizerAudioDriver, 0, wx.ALL|wx.EXPAND, 0) vsizer.Add(hsizerInputDevice, 0, wx.ALL|wx.EXPAND, 0) vsizer.Add(hsizerOutputDevice, 0, wx.ALL|wx.EXPAND, 0) vsizer.Add(hsizerNumInputChannels, 0, wx.ALL|wx.EXPAND, 0) vsizer.Add(hsizerNumOutputChannels, 0, wx.ALL|wx.EXPAND, 0) vsizer.Add(hsizerFirstPhysicalInput, 0, wx.ALL|wx.EXPAND, 0) vsizer.Add(hsizerFirstPhysicalOutput, 0, wx.ALL|wx.EXPAND, 0) vsizer.Add(hsizerBufferSize, 0, wx.ALL|wx.EXPAND, 0) vsizer.Add(hsizerSamplingRate, 0, wx.ALL|wx.EXPAND, 0) vsizer.Add(hsizerDuplex, 0, wx.ALL|wx.EXPAND, 0) border = wx.BoxSizer() border.Add(vsizer, -1, wx.EXPAND|wx.ALL, 5) self.SetSizerAndFit(border) self.EnableDisablePortaudioOpts()
def setEnableState(self, x): self.enable.SetValue(x) if x != self.last_enable: self.last_enable = x QLiveLib.getVar("FxTracks").drawAndRefresh()
def onAudioButton(self, evt): server = QLiveLib.getVar("AudioServer") server.start(evt.GetInt()) QLiveLib.getVar("CuesPanel").loadCurrentCue() self.audioButton.SetLabel(["Start Audio", "Stop Audio"][evt.GetInt()])
def onNewCue(self, evt): QLiveLib.getVar("CuesPanel").onNewCue()
def onMoveCueDown(self, evt): if QLiveLib.getVar("MidiLearnMode"): self.midiLearn(evt) return QLiveLib.getVar("CuesPanel").onMoveCueDown()
def onSave(self, evt): self.saveFile(QLiveLib.getVar("currentProject"))
def onLinkSliders(self, evt): QLiveLib.getVar("MixerPanel").linkInputs(evt.GetInt()) QLiveLib.getVar("MixerPanel").linkOutputs(evt.GetInt())