class MidiSettings(wx.Frame): def __init__(self, parent, surface, sg_audio, miDriver): wx.Frame.__init__(self, parent, -1, "Midi Settings") menuBar = wx.MenuBar() self.menu = wx.Menu() self.menu.Append(2010, 'Close\tCtrl+W', "") self.menu.AppendSeparator() self.menu.Append(2011, "Run\tCtrl+R", "", wx.ITEM_CHECK) menuBar.Append(self.menu, "&File") self.SetMenuBar(menuBar) self.Bind(wx.EVT_CLOSE, self.handleClose) self.Bind(wx.EVT_MENU, self.handleClose, id=2010) self.parent = parent self.surface = surface self.sg_audio = sg_audio self.panel = wx.Panel(self, -1) self.panel.SetBackgroundColour(BACKGROUND_COLOUR) mainBox = wx.BoxSizer(wx.VERTICAL) box = wx.BoxSizer(wx.VERTICAL) box.Add(wx.StaticText(self.panel, id=-1, label="Midi Interface"), 0, wx.CENTER | wx.ALL, 2) self.interfaceList, self.interfaceIndexes, selected = checkForMidiDrivers( ) self.interfaceList = [ ensureNFD(driver) for driver in self.interfaceList ] if self.interfaceList != []: self.interfaceList.append("All") self.interfaceIndexes.append(99) if miDriver == None: self.selectedInterface = selected else: if miDriver in self.interfaceList: self.selectedInterface = self.interfaceIndexes[ self.interfaceList.index(miDriver)] else: self.selectedInterface = selected self.popupInterface = wx.Choice(self.panel, id=-1, size=(200, -1), choices=self.interfaceList) if self.selectedInterface: self.popupInterface.SetSelection( self.interfaceIndexes.index(self.selectedInterface)) self.popupInterface.Bind(wx.EVT_CHOICE, self.changeInterface) self.parent.controls.midiInterface = self.selectedInterface else: self.selectedInterface = None self.popupInterface = wx.Choice(self.panel, id=-1, size=(200, -1), choices=["No interface"]) self.popupInterface.SetSelection(0) box.Add(self.popupInterface, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) box.Add(wx.StaticText(self.panel, id=-1, label="Add / Remove Method"), 0, wx.CENTER | wx.ALL, 2) self.popupMethod = wx.Choice( self.panel, id=-1, size=(200, -1), choices=["Noteon / Noteoff", "Noteon / Noteon"]) self.popupMethod.SetSelection(0) self.popupMethod.Bind(wx.EVT_CHOICE, self.handleMethod) box.Add(self.popupMethod, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) box.Add(wx.StaticLine(self.panel, size=(200, 1)), 0, wx.ALL, 5) box.Add(wx.StaticText(self.panel, id=-1, label="Pitch Mapping"), 0, wx.CENTER | wx.ALL, 5) self.xTranspo = wx.CheckBox(self.panel, label="Transposition") self.xTranspo.SetValue(True) self.xTranspo.Bind(wx.EVT_CHECKBOX, self.handleTranspo) box.Add(self.xTranspo, 0, wx.ALL, 5) self.xPosition = wx.CheckBox(self.panel, label="X Axis Position") self.xPosition.Bind(wx.EVT_CHECKBOX, self.handlePosition) box.Add(self.xPosition, 0, wx.ALL, 5) box.Add( wx.StaticText(self.panel, id=-1, label="X Position Octave Spread"), 0, wx.CENTER | wx.ALL, 2) self.octaveSpread = ControlSlider(self.panel, 1, 4, 2, size=(200, 16), outFunction=self.handleSpread) self.enableOctaveSpread(self.xPosition.GetValue()) box.Add(self.octaveSpread, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) mainBox.Add(box, 0, wx.ALL, 10) self.panel.SetSizerAndFit(mainBox) size = (230, 300) self.SetMinSize(size) self.SetMaxSize(size) self.SetPosition( (self.parent.GetPosition()[0] + self.parent.GetSize()[0], self.parent.GetPosition()[1])) self.Show(False) wx.CallAfter(self.SetSize, size) def show(self): self.Show() def handleClose(self, event): self.Show(False) def getInterface(self): if self.selectedInterface == None: return None else: return self.interfaceList[self.interfaceIndexes.index( self.selectedInterface)] def changeInterface(self, evt): status, path = self.parent.checkForMixedSound() if not status: for i, driver in enumerate(self.interfaceList): if driver == self.interfaceList[self.interfaceIndexes.index( self.selectedInterface)]: self.popupInterface.SetSelection(i) return if "Mixed sound" in self.parent.controls.sndPath: self.parent.controls.sndPath = path if path == "": self.parent.panel.sndBitmap = None self.parent.panel.needBitmap = True wx.CallAfter(self.parent.panel.Refresh) selectedInterface = self.popupInterface.GetStringSelection() self.selectedInterface = self.interfaceIndexes[ self.interfaceList.index(selectedInterface)] self.parent.controls.midiInterface = self.selectedInterface self.parent.controls.shutdownServer() self.parent.controls.bootServer() # TODO: replace handle, set and get method with events def handleMethod(self, evt): self.sg_audio.setMidiMethod(self.popupMethod.GetSelection()) def setMethod(self, met): self.popupMethod.SetSelection(met) self.sg_audio.setMidiMethod(met) def getMethod(self): return self.popupMethod.GetSelection() def handleTranspo(self, evt): self.surface.setMidiTranspose(self.xTranspo.GetValue()) def setTranspo(self, value): self.xTranspo.SetValue(value) self.surface.setMidiTranspose(value) def getTranspo(self): return self.xTranspo.GetValue() def handlePosition(self, evt): state = self.xPosition.GetValue() self.surface.setMidiXposition(state) self.enableOctaveSpread(state) def setPosition(self, value): self.xPosition.SetValue(value) self.surface.setMidiXposition(value) self.enableOctaveSpread(value) def getPosition(self): return self.xPosition.GetValue() def enableOctaveSpread(self, state): if state: self.octaveSpread.Enable() else: self.octaveSpread.Disable() def handleSpread(self, value): self.surface.setMidiOctaveSpread(value) def setSpread(self, value): self.octaveSpread.SetValue(value) def getSpread(self): return self.octaveSpread.GetValue() def save(self): return { "method": self.getMethod(), "transpo": self.getTranspo(), "position": self.getPosition(), "spread": self.getSpread() } def load(self, dict): if dict != None: self.setMethod(dict["method"]) self.setTranspo(dict["transpo"]) self.setPosition(dict["position"]) self.setSpread(dict["spread"])
class FxBallControls(wx.Frame): def __init__(self, parent, fxball, sg_audio, size=(270, 200)): title = "%s Controls" % FX_BALL_TITLES[fxball.getFx()] wx.Frame.__init__(self, parent, -1, title, size=size) self.parent = parent self.fxball = fxball self.sg_audio = sg_audio menuBar = wx.MenuBar() self.menu = wx.Menu() self.menu.Append(200, 'Close\tCtrl+W', "") menuBar.Append(self.menu, "&File") self.SetMenuBar(menuBar) self.Bind(wx.EVT_CLOSE, self.handleClose) self.Bind(wx.EVT_MENU, self.handleClose, id=200) self.panel = wx.Panel(self, -1) self.panel.SetBackgroundColour(BACKGROUND_COLOUR) self.box = wx.BoxSizer(wx.VERTICAL) sl1values = FX_BALL_SLIDER_1_INIT[fxball.getFx()] sl2values = FX_BALL_SLIDER_2_INIT[fxball.getFx()] text = wx.StaticText(self.panel, -1, sl1values[0]) font, psize = text.GetFont(), text.GetFont().GetPointSize() font.SetPointSize(psize - 1) text.SetFont(font) self.box.Add(text, 0, wx.LEFT | wx.RIGHT | wx.TOP, 10) self.box.AddSpacer(2) self.slider1 = ControlSlider(self.panel, sl1values[1], sl1values[2], sl1values[3], log=sl1values[4], size=(250, 16), outFunction=self.handleSlider1) self.box.Add(self.slider1, 0, wx.LEFT | wx.RIGHT, 10) text = wx.StaticText(self.panel, -1, sl2values[0]) text.SetFont(font) self.box.Add(text, 0, wx.LEFT | wx.RIGHT | wx.TOP, 10) self.box.AddSpacer(2) self.slider2 = ControlSlider(self.panel, sl2values[1], sl2values[2], sl2values[3], log=sl2values[4], size=(250, 16), outFunction=self.handleSlider2) self.box.Add(self.slider2, 0, wx.LEFT | wx.RIGHT, 10) text = wx.StaticText(self.panel, -1, "Amplitude") text.SetFont(font) self.box.Add(text, 0, wx.LEFT | wx.RIGHT | wx.TOP, 10) self.box.AddSpacer(2) self.slider3 = ControlSlider(self.panel, 0, 2, 1, size=(250, 16), outFunction=self.handleMul) self.box.Add(self.slider3, 0, wx.LEFT | wx.RIGHT, 10) text = wx.StaticText(self.panel, -1, "Pan") text.SetFont(font) self.box.Add(text, 0, wx.LEFT | wx.RIGHT | wx.TOP, 10) self.box.AddSpacer(2) self.slider4 = ControlSlider(self.panel, 0, 1, 0.5, size=(250, 16), outFunction=self.handlePan) self.box.Add(self.slider4, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 10) self.panel.SetSizerAndFit(self.box) if PLATFORM == "win32": X, Y = self.GetSize()[0], self.GetSize()[1] + 50 elif PLATFORM.startswith("linux"): X, Y = self.GetSize()[0], self.GetSize()[1] + 30 else: X, Y = self.GetSize()[0], self.GetSize()[1] + 20 self.SetMinSize((X, Y)) self.SetMaxSize((X, Y)) wx.CallAfter(self.SetSize, (X, Y)) def handleClose(self, event): self.Show(False) def handleSlider1(self, val): self.sg_audio.handleFxSlider1(self.fxball.getFx(), self.fxball.getId(), val) def handleSlider2(self, val): self.sg_audio.handleFxSlider2(self.fxball.getFx(), self.fxball.getId(), val) def handleMul(self, val): self.sg_audio.handleFxMul(self.fxball.getId(), val) def handlePan(self, val): self.sg_audio.handleFxPan(self.fxball.getId(), val) def save(self): return { "slider1": self.slider1.GetValue(), "slider2": self.slider2.GetValue(), "slider3": self.slider3.GetValue(), "slider4": self.slider4.GetValue() } def load(self, dict): self.slider1.SetValue(dict["slider1"]) self.handleSlider1(self.slider1.GetValue()) self.slider2.SetValue(dict["slider2"]) self.handleSlider2(self.slider2.GetValue()) self.slider3.SetValue(dict["slider3"]) self.handleMul(self.slider3.GetValue()) self.slider4.SetValue(dict["slider4"]) self.handlePan(self.slider4.GetValue())
class InsertDialog(wx.Dialog): def __init__(self, parent, id, title, actual_dur, snd_dur): wx.Dialog.__init__(self, parent, id, title) self.SetBackgroundColour(BACKGROUND_COLOUR) vbox = wx.BoxSizer(wx.VERTICAL) stline = wx.StaticText(self, -1, 'Starting point in seconds:') vbox.Add(stline, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, 10) self.startSlider = ControlSlider(self, 0, snd_dur, 0, outFunction=self.handleStart) vbox.Add(self.startSlider, 0, wx.ALL, 5) stline = wx.StaticText(self, -1, 'Ending point in seconds:') vbox.Add(stline, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, 10) self.endSlider = ControlSlider(self, 0, snd_dur, snd_dur, outFunction=self.handleEnd) vbox.Add(self.endSlider, 0, wx.ALL, 5) stline = wx.StaticText(self, -1, 'Insertion point in seconds:') vbox.Add(stline, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, 10) self.insertSlider = ControlSlider(self, 0, actual_dur, 0) vbox.Add(self.insertSlider, 0, wx.ALL, 5) stline = wx.StaticText(self, -1, 'Crossfade time in seconds:') vbox.Add(stline, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, 10) self.crossfadeSlider = ControlSlider(self, 0.001, snd_dur * 0.5, 0, outFunction=self.handleCross) vbox.Add(self.crossfadeSlider, 0, wx.ALL, 5) sizer = self.CreateButtonSizer(wx.CANCEL | wx.OK) vbox.Add(sizer, 0, wx.ALL, 10) self.SetSizerAndFit(vbox) def handleStart(self, val): start = self.startSlider.GetValue() end = self.endSlider.GetValue() cross = self.crossfadeSlider.GetValue() if start >= (end - .1): self.endSlider.SetValue(start + .1, False) rng = (end - start) * 0.5 if cross > rng: self.crossfadeSlider.SetValue(rng, False) def handleEnd(self, val): start = self.startSlider.GetValue() end = self.endSlider.GetValue() cross = self.crossfadeSlider.GetValue() if end <= (start + .1): self.startSlider.SetValue(end - .1, False) rng = (end - start) * 0.5 if cross > rng: self.crossfadeSlider.SetValue(rng, False) def handleCross(self, val): start = self.startSlider.GetValue() end = self.endSlider.GetValue() cross = self.crossfadeSlider.GetValue() rng = (end - start) * 0.5 if cross > rng: self.crossfadeSlider.SetValue(rng, False) def getValues(self): return (self.startSlider.GetValue(), self.endSlider.GetValue(), self.insertSlider.GetValue(), self.crossfadeSlider.GetValue())