Exemplo n.º 1
0
 def __init__(self, parent, name, label, mouseUpFunction, colour):
     ControlSlider.__init__(self, parent, 0.0001, 0.5, .001, log=True, 
                            size=(100, 15), backColour=BACKGROUND_COLOUR)
     self.name = name + 'spread'
     self.rate = "k"
     self.label = Label(parent, label, colour=colour[0])
     self.mouseUpFunction = mouseUpFunction
Exemplo n.º 2
0
    def __init__(self, parent, minvalue, maxvalue, init=None, pos=(0,0), size=(200,16), log=False,
                 integer=False, powoftwo=False, backColour=None, signal_id=None):

        ControlSlider.__init__(self, parent=parent, minvalue=minvalue, maxvalue=maxvalue, init=init,
                               pos=pos, size=size, log=log, outFunction=self.setMapper, integer=integer,
                               powoftwo=powoftwo, backColour=backColour)

        self.signal_id = signal_id
        self.mon = mapper.monitor()
        self.dev = self.GetParent().dev
        self.output = self.dev.add_output("/"+str(self.signal_id), 1, 'f', None, -1000, 1000)

        while not self.dev.ready():
            self.dev.poll(10)
            self.mon.poll()
Exemplo n.º 3
0
 def __init__(self,
              parent,
              minvalue,
              maxvalue,
              init=None,
              pos=(0, 0),
              size=(200, 16),
              log=False,
              outFunction=None,
              integer=False,
              powoftwo=False,
              backColour=None,
              orient=wx.HORIZONTAL,
              ctrllabel=""):
     ControlSlider.__init__(self, parent, minvalue, maxvalue, init, pos,
                            size, log, outFunction, integer, powoftwo,
                            backColour, orient, ctrllabel)
     self.sg_audio = self.GetParent().GetParent().GetParent().GetParent(
     ).sg_audio
     self.output_callback = outFunction
     self.midilearn = False
     self.normal_colour = self.backgroundColour
     self.Bind(wx.EVT_RIGHT_DOWN, self.MouseRightDown)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
 def makeSliderBox(self, box, label, minval, maxval, val, integer, log,
                   callback):
     staticLabel = wx.StaticText(self.panel1, -1, label)
     font, psize = staticLabel.GetFont(), staticLabel.GetFont(
     ).GetPointSize()
     if PLATFORM == "win32":
         font.SetPointSize(psize - 1)
     else:
         font.SetPointSize(psize - 2)
     staticLabel.SetFont(font)
     box.Add(staticLabel, 0, wx.LEFT, 10)
     sliderBox = wx.BoxSizer(wx.HORIZONTAL)
     slider = ControlSlider(self.panel1,
                            minval,
                            maxval,
                            val,
                            size=(250, 16),
                            log=log,
                            integer=integer,
                            outFunction=callback)
     sliderBox.Add(slider, 1, wx.LEFT | wx.RIGHT, 5)
     box.Add(sliderBox, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
     return slider
Exemplo n.º 6
0
    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))
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
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"])
Exemplo n.º 9
0
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())
Exemplo n.º 10
0
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        self.SetBackgroundColour(BACKGROUND_COLOUR)
        self.parent = parent
        box = wx.BoxSizer(wx.VERTICAL)

        trajBox = wx.BoxSizer(wx.HORIZONTAL)
        seltrajText = wx.StaticText(self, -1, "Selected Traj:")
        font, psize = seltrajText.GetFont(), seltrajText.GetFont(
        ).GetPointSize()
        if sys.platform == "win32":
            font.SetPointSize(psize - 1)
        else:
            font.SetPointSize(psize - 2)
        trajBox.Add(seltrajText, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, 5)

        trajChoices = [str(i + 1) for i in range(MAX_STREAMS)]
        trajChoices.append("all")
        self.tog_traj = wx.Choice(self, -1, choices=trajChoices)
        self.tog_traj.SetSelection(0)
        self.tog_traj.Bind(wx.EVT_CHOICE,
                           self.parent.GetParent().handleSelected)
        self.tog_traj.Bind(wx.EVT_LEFT_DOWN,
                           self.parent.GetParent().handlePopupFocus)
        trajBox.Add(self.tog_traj, 0, wx.LEFT, 5)
        box.Add(trajBox, 0, wx.TOP, 2)
        box.AddSpacer(5)

        spdText = wx.StaticText(self, -1, "Timer speed", size=(195, 15))
        box.Add(spdText, 0, wx.LEFT, 5)
        timespeedBox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_timespeed = ControlSlider(
            self,
            5,
            1000,
            25,
            size=(195, 16),
            log=True,
            outFunction=self.parent.GetParent().handleTimerSpeed)
        timespeedBox.Add(self.sl_timespeed)
        box.Add(timespeedBox, 0, wx.LEFT | wx.RIGHT, 5)
        box.AddSpacer(5)

        ptstepText = wx.StaticText(self, -1, "Point step", size=(195, 15))
        box.Add(ptstepText, 0, wx.LEFT, 5)
        stepBox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_step = ControlSlider(
            self,
            1,
            100,
            1,
            size=(195, 16),
            integer=True,
            outFunction=self.parent.GetParent().handleStep)
        stepBox.Add(self.sl_step)
        box.Add(stepBox, 0, wx.LEFT | wx.RIGHT, 5)
        box.AddSpacer(5)

        ampText = wx.StaticText(self, -1, "Amplitude (dB)", size=(195, 15))
        box.Add(ampText, 0, wx.LEFT, 5)
        ampBox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_amp = ControlSlider(
            self,
            -60,
            18,
            0,
            size=(195, 16),
            integer=False,
            outFunction=self.parent.GetParent().handleTrajAmp)
        ampBox.Add(self.sl_amp)
        box.Add(ampBox, 0, wx.LEFT | wx.RIGHT, 5)

        for obj in [seltrajText, self.tog_traj, spdText, ptstepText, ampText]:
            obj.SetFont(font)

        self.SetAutoLayout(True)
        self.SetSizer(box)
Exemplo n.º 11
0
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        self.SetBackgroundColour(BACKGROUND_COLOUR)
        self.parent = parent
        box = wx.BoxSizer(wx.VERTICAL)

        lpcutText = wx.StaticText(self, -1, "Lowpass cutoff", size=(195, 15))
        font, psize = lpcutText.GetFont(), lpcutText.GetFont().GetPointSize()
        if sys.platform == "win32":
            font.SetPointSize(psize - 1)
        else:
            font.SetPointSize(psize - 2)
        box.Add(lpcutText, 0, wx.LEFT | wx.TOP, 5)
        cutoffBox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_cutoff = ControlSlider(
            self,
            100,
            15000,
            5000,
            size=(195, 16),
            integer=True,
            log=True,
            outFunction=self.parent.GetParent().handleCutoff)
        cutoffBox.Add(self.sl_cutoff)
        box.Add(cutoffBox, 0, wx.LEFT | wx.RIGHT, 5)
        box.AddSpacer(5)

        lpqText = wx.StaticText(self, -1, "Lowpass Q", size=(195, 15))
        box.Add(lpqText, 0, wx.LEFT, 5)
        qBox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_q = ControlSlider(self,
                                  0.5,
                                  1000,
                                  0.5,
                                  size=(195, 16),
                                  outFunction=self.parent.GetParent().handleQ)
        qBox.Add(self.sl_q)
        box.Add(qBox, 0, wx.LEFT | wx.RIGHT, 5)
        box.AddSpacer(5)

        oscpText = wx.StaticText(self, -1, "Oscil period", size=(195, 15))
        box.Add(oscpText, 0, wx.LEFT, 5)
        periodBox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_period = ControlSlider(
            self,
            0,
            5,
            2,
            size=(195, 16),
            outFunction=self.parent.GetParent().handlePeriod)
        periodBox.Add(self.sl_period)
        self.sl_period.Disable()
        box.Add(periodBox, 0, wx.LEFT | wx.RIGHT, 5)
        box.AddSpacer(5)

        oscsclText = wx.StaticText(self, -1, "Oscil scaling", size=(195, 15))
        box.Add(oscsclText, 0, wx.LEFT, 5)
        scalingBox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_scaling = ControlSlider(
            self,
            0,
            4,
            1,
            size=(195, 16),
            outFunction=self.parent.GetParent().handleScaling)
        scalingBox.Add(self.sl_scaling)
        self.sl_scaling.Disable()
        box.Add(scalingBox, 0, wx.LEFT | wx.RIGHT, 5)
        box.AddSpacer(5)

        for obj in [lpcutText, lpqText, oscpText, oscsclText]:
            obj.SetFont(font)

        self.SetAutoLayout(True)
        self.SetSizer(box)
Exemplo n.º 12
0
    def __init__(self, parent, surface):
        scrolled.ScrolledPanel.__init__(self, parent, -1)
        self.SetBackgroundColour(BACKGROUND_COLOUR)
        self.parent = parent
        self.surface = surface
        self.type = 0
        self.selected = 0
        self.selectedOkToChange = True
        self.sndPath = ""
        self.sndDur = 0.0
        self.amplitude = 1
        self.nchnls = 2
        self.samplingRate = 44100
        self.fileformat = 0
        self.sampletype = 0
        self.tempState = None

        box = wx.BoxSizer(wx.VERTICAL)

        box.Add(wx.StaticText(self, -1, "Trajectories"), 0, wx.CENTER | wx.TOP,
                3)

        typeBox = wx.BoxSizer(wx.HORIZONTAL)
        popupBox = wx.BoxSizer(wx.VERTICAL)
        self.trajType = wx.Choice(self,
                                  -1,
                                  choices=['Free', 'Circle', 'Oscil', 'Line'])
        self.trajType.SetSelection(0)
        popupBox.Add(self.trajType)
        typeBox.Add(popupBox, 0, wx.CENTER | wx.RIGHT, 5)

        # TODO: Check the size of this button on Windows and OSX
        self.closedToggle = wx.ToggleButton(self,
                                            -1,
                                            'Closed',
                                            size=self.trajType.GetSize())
        font = self.closedToggle.GetFont()
        if PLATFORM.startswith('linux') or PLATFORM == 'win32':
            font = wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL,
                           wx.FONTWEIGHT_NORMAL)
        self.closedToggle.SetFont(font)
        typeBox.Add(self.closedToggle, wx.CENTER | wx.RIGHT, 5)
        box.Add(typeBox, 0, wx.CENTER | wx.ALL, 5)

        self.notebook = wx.Notebook(self, -1, style=wx.BK_DEFAULT | wx.EXPAND)
        self.notebook.SetBackgroundColour(BACKGROUND_COLOUR)
        self.drawing = DrawingParameters(self.notebook)
        self.playback = PlaybackParameters(self.notebook)
        self.notebook.AddPage(self.drawing, "Drawing")
        self.notebook.AddPage(self.playback, "Playback")
        box.Add(self.notebook, 0, wx.ALL, 5)

        # EQ
        eqTitle = wx.StaticText(self, id=-1, label="4 Bands Equalizer")
        box.Add(eqTitle, 0, wx.CENTER)

        eqFreqBox = wx.BoxSizer(wx.HORIZONTAL)
        self.knobEqF1 = ControlKnob(self,
                                    40,
                                    250,
                                    100,
                                    label='Freq 1',
                                    outFunction=self.changeEqF1)
        eqFreqBox.Add(self.knobEqF1, 0, wx.LEFT | wx.RIGHT, 20)
        self.knobEqF1.setFloatPrecision(2)
        self.knobEqF2 = ControlKnob(self,
                                    300,
                                    1000,
                                    500,
                                    label='Freq 2',
                                    outFunction=self.changeEqF2)
        eqFreqBox.Add(self.knobEqF2, 0, wx.LEFT | wx.RIGHT, 4)
        self.knobEqF2.setFloatPrecision(2)
        self.knobEqF3 = ControlKnob(self,
                                    1200,
                                    5000,
                                    2000,
                                    label='Freq 3',
                                    outFunction=self.changeEqF3)
        eqFreqBox.Add(self.knobEqF3, 0, wx.LEFT | wx.RIGHT, 20)
        self.knobEqF3.setFloatPrecision(2)

        box.Add(eqFreqBox)

        eqGainBox = wx.BoxSizer(wx.HORIZONTAL)
        self.knobEqA1 = ControlKnob(self,
                                    -40,
                                    18,
                                    0,
                                    label='B1 gain',
                                    outFunction=self.changeEqA1)
        eqGainBox.Add(self.knobEqA1, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobEqA2 = ControlKnob(self,
                                    -40,
                                    18,
                                    0,
                                    label='B2 gain',
                                    outFunction=self.changeEqA2)
        eqGainBox.Add(self.knobEqA2, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobEqA3 = ControlKnob(self,
                                    -40,
                                    18,
                                    0,
                                    label='B3 gain',
                                    outFunction=self.changeEqA3)
        eqGainBox.Add(self.knobEqA3, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobEqA4 = ControlKnob(self,
                                    -40,
                                    18,
                                    0,
                                    label='B4 gain',
                                    outFunction=self.changeEqA4)
        eqGainBox.Add(self.knobEqA4, 0, wx.LEFT | wx.RIGHT, 5)

        box.Add(eqGainBox)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        #Compress
        compTitle = wx.StaticText(self, id=-1, label="Dynamic Compressor")
        box.Add(compTitle, 0, wx.CENTER)

        cpKnobBox = wx.BoxSizer(wx.HORIZONTAL)
        self.knobComp1 = ControlKnob(self,
                                     -60,
                                     0,
                                     -3,
                                     label='Thresh',
                                     outFunction=self.changeComp1)
        cpKnobBox.Add(self.knobComp1, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobComp2 = ControlKnob(self,
                                     1,
                                     10,
                                     2,
                                     label='Ratio',
                                     outFunction=self.changeComp2)
        cpKnobBox.Add(self.knobComp2, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobComp3 = ControlKnob(self,
                                     0.001,
                                     0.5,
                                     0.05,
                                     label='Rise',
                                     outFunction=self.changeComp3)
        cpKnobBox.Add(self.knobComp3, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobComp4 = ControlKnob(self,
                                     0.01,
                                     1,
                                     .2,
                                     label='Fall',
                                     outFunction=self.changeComp4)
        cpKnobBox.Add(self.knobComp4, 0, wx.LEFT | wx.RIGHT, 5)

        box.Add(cpKnobBox)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        box.Add(wx.StaticText(self, -1, "Global amplitude (dB)"), 0,
                wx.LEFT | wx.TOP, 10)
        ampBox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_amp = ControlSlider(self,
                                    -60,
                                    18,
                                    0,
                                    size=(200, 16),
                                    outFunction=self.handleAmp)
        ampBox.Add(self.sl_amp, 0, wx.LEFT | wx.RIGHT, 5)
        box.Add(ampBox, 0, wx.LEFT | wx.RIGHT, 5)
        box.AddSpacer(10)
        self.meter = VuMeter(self, size=(200, 11))
        self.meter.setNumSliders(self.nchnls)
        box.Add(self.meter, 0, wx.LEFT, 10)
        box.AddSpacer(5)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        box.Add(wx.StaticText(self, -1, "Project Settings"), 0,
                wx.CENTER | wx.ALL, 5)

        projSettingsBox = wx.BoxSizer(wx.HORIZONTAL)
        srBox = wx.BoxSizer(wx.VERTICAL)
        srText = wx.StaticText(self, -1, "Rate")
        srBox.Add(srText, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        self.pop_sr = wx.Choice(self,
                                -1,
                                choices=['44100', '48000', '96000'],
                                size=(80, -1))
        self.pop_sr.SetSelection(0)
        self.pop_sr.Bind(wx.EVT_CHOICE, self.handleSamplingRate)
        srBox.Add(self.pop_sr, 0, wx.LEFT | wx.RIGHT, 5)
        chnlsBox = wx.BoxSizer(wx.VERTICAL)
        chnlsText = wx.StaticText(self, -1, "Chnls")
        chnlsBox.Add(chnlsText, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        self.tx_chnls = wx.TextCtrl(self,
                                    -1,
                                    "2",
                                    size=(60, -1),
                                    style=wx.TE_PROCESS_ENTER)
        self.tx_chnls.Bind(wx.EVT_TEXT_ENTER, self.handleNchnls)
        chnlsBox.Add(self.tx_chnls, 0, wx.LEFT | wx.RIGHT, 5)
        projSettingsBox.Add(srBox, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
        projSettingsBox.Add(chnlsBox, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
        box.Add(projSettingsBox, 0, wx.ALIGN_CENTER, 5)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        soundBox = wx.BoxSizer(wx.HORIZONTAL)
        self.tog_audio = wx.ToggleButton(self, -1, "Start", size=(80, -1))
        self.tog_audio.SetFont(font)
        self.tog_audio.Disable()
        soundBox.Add(self.tog_audio, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        box.Add(soundBox, 0, wx.CENTER | wx.ALL, 5)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        box.Add(wx.StaticText(self, -1, "Record Settings"), 0,
                wx.CENTER | wx.ALL, 5)

        recSettingsBox = wx.BoxSizer(wx.HORIZONTAL)
        fileformatBox = wx.BoxSizer(wx.VERTICAL)
        fileformatText = wx.StaticText(self, -1, "Format")
        fileformatBox.Add(fileformatText, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        self.pop_fileformat = wx.Choice(self,
                                        -1,
                                        choices=EXPORT_FORMATS,
                                        size=(80, -1))
        self.pop_fileformat.SetSelection(0)
        self.pop_fileformat.Bind(wx.EVT_CHOICE, self.handleFileFormat)
        fileformatBox.Add(self.pop_fileformat, 0, wx.LEFT | wx.RIGHT, 5)
        sampletypeBox = wx.BoxSizer(wx.VERTICAL)
        sampletypeText = wx.StaticText(self, -1, "Type")
        sampletypeBox.Add(sampletypeText, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        self.pop_sampletype = wx.Choice(self, -1, choices=EXPORT_TYPES)
        self.pop_sampletype.SetSelection(0)
        self.pop_sampletype.Bind(wx.EVT_CHOICE, self.handleSampleType)
        sampletypeBox.Add(self.pop_sampletype, 0, wx.LEFT | wx.RIGHT, 5)
        recSettingsBox.Add(fileformatBox, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
        recSettingsBox.Add(sampletypeBox, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
        box.Add(recSettingsBox, 0, wx.ALIGN_CENTER | wx.BOTTOM, 5)

        rec1Box = wx.BoxSizer(wx.HORIZONTAL)

        self.tx_rec_folder = wx.TextCtrl(self, -1, "~/Desktop", size=(120, -1))
        rec1Box.Add(self.tx_rec_folder, 0, wx.LEFT | wx.RIGHT, 10)
        self.but_folder = wx.ToggleButton(self, -1, "Choose", size=(65, -1))
        self.but_folder.SetFont(font)
        rec1Box.Add(self.but_folder, 1,
                    wx.ALIGN_CENTER_VERTICAL | wx.EXPAND | wx.RIGHT, 10)

        rec2Box = wx.BoxSizer(wx.HORIZONTAL)

        self.tx_output = wx.TextCtrl(self, -1, "snd", size=(120, -1))
        rec2Box.Add(self.tx_output, 0, wx.LEFT | wx.RIGHT, 10)
        self.tog_record = wx.ToggleButton(self, -1, "Start Rec", size=(65, -1))
        self.tog_record.SetFont(font)
        rec2Box.Add(self.tog_record, 1,
                    wx.ALIGN_CENTER_VERTICAL | wx.EXPAND | wx.RIGHT, 10)

        box.Add(wx.StaticText(self, -1, "Destination"), 0, wx.LEFT | wx.RIGHT,
                17)
        box.Add(rec1Box, 0, wx.EXPAND | wx.BOTTOM | wx.LEFT | wx.RIGHT, 5)
        box.Add(wx.StaticText(self, -1, "Filename"), 0, wx.LEFT | wx.RIGHT, 17)
        box.Add(rec2Box, 0, wx.EXPAND | wx.BOTTOM | wx.LEFT | wx.RIGHT, 5)

        self.Bind(wx.EVT_CHOICE, self.handleType, self.trajType)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.handleClosed, self.closedToggle)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.handleAudio, self.tog_audio)
        self.tx_output.Bind(wx.EVT_CHAR, self.handleOutput)
        self.tx_rec_folder.Bind(wx.EVT_CHAR, self.handleOutput)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.handleRecord, self.tog_record)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.chooseRecFolder, self.but_folder)

        self.SetAutoLayout(True)
        self.SetSizerAndFit(box)
        self.SetupScrolling(scroll_x=False)
Exemplo n.º 13
0
class ControlPanel(scrolled.ScrolledPanel):
    def __init__(self, parent, surface):
        scrolled.ScrolledPanel.__init__(self, parent, -1)
        self.SetBackgroundColour(BACKGROUND_COLOUR)
        self.parent = parent
        self.surface = surface
        self.type = 0
        self.selected = 0
        self.selectedOkToChange = True
        self.sndPath = ""
        self.sndDur = 0.0
        self.amplitude = 1
        self.nchnls = 2
        self.samplingRate = 44100
        self.fileformat = 0
        self.sampletype = 0
        self.tempState = None

        box = wx.BoxSizer(wx.VERTICAL)

        box.Add(wx.StaticText(self, -1, "Trajectories"), 0, wx.CENTER | wx.TOP,
                3)

        typeBox = wx.BoxSizer(wx.HORIZONTAL)
        popupBox = wx.BoxSizer(wx.VERTICAL)
        self.trajType = wx.Choice(self,
                                  -1,
                                  choices=['Free', 'Circle', 'Oscil', 'Line'])
        self.trajType.SetSelection(0)
        popupBox.Add(self.trajType)
        typeBox.Add(popupBox, 0, wx.CENTER | wx.RIGHT, 5)

        # TODO: Check the size of this button on Windows and OSX
        self.closedToggle = wx.ToggleButton(self,
                                            -1,
                                            'Closed',
                                            size=self.trajType.GetSize())
        font = self.closedToggle.GetFont()
        if PLATFORM.startswith('linux') or PLATFORM == 'win32':
            font = wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL,
                           wx.FONTWEIGHT_NORMAL)
        self.closedToggle.SetFont(font)
        typeBox.Add(self.closedToggle, wx.CENTER | wx.RIGHT, 5)
        box.Add(typeBox, 0, wx.CENTER | wx.ALL, 5)

        self.notebook = wx.Notebook(self, -1, style=wx.BK_DEFAULT | wx.EXPAND)
        self.notebook.SetBackgroundColour(BACKGROUND_COLOUR)
        self.drawing = DrawingParameters(self.notebook)
        self.playback = PlaybackParameters(self.notebook)
        self.notebook.AddPage(self.drawing, "Drawing")
        self.notebook.AddPage(self.playback, "Playback")
        box.Add(self.notebook, 0, wx.ALL, 5)

        # EQ
        eqTitle = wx.StaticText(self, id=-1, label="4 Bands Equalizer")
        box.Add(eqTitle, 0, wx.CENTER)

        eqFreqBox = wx.BoxSizer(wx.HORIZONTAL)
        self.knobEqF1 = ControlKnob(self,
                                    40,
                                    250,
                                    100,
                                    label='Freq 1',
                                    outFunction=self.changeEqF1)
        eqFreqBox.Add(self.knobEqF1, 0, wx.LEFT | wx.RIGHT, 20)
        self.knobEqF1.setFloatPrecision(2)
        self.knobEqF2 = ControlKnob(self,
                                    300,
                                    1000,
                                    500,
                                    label='Freq 2',
                                    outFunction=self.changeEqF2)
        eqFreqBox.Add(self.knobEqF2, 0, wx.LEFT | wx.RIGHT, 4)
        self.knobEqF2.setFloatPrecision(2)
        self.knobEqF3 = ControlKnob(self,
                                    1200,
                                    5000,
                                    2000,
                                    label='Freq 3',
                                    outFunction=self.changeEqF3)
        eqFreqBox.Add(self.knobEqF3, 0, wx.LEFT | wx.RIGHT, 20)
        self.knobEqF3.setFloatPrecision(2)

        box.Add(eqFreqBox)

        eqGainBox = wx.BoxSizer(wx.HORIZONTAL)
        self.knobEqA1 = ControlKnob(self,
                                    -40,
                                    18,
                                    0,
                                    label='B1 gain',
                                    outFunction=self.changeEqA1)
        eqGainBox.Add(self.knobEqA1, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobEqA2 = ControlKnob(self,
                                    -40,
                                    18,
                                    0,
                                    label='B2 gain',
                                    outFunction=self.changeEqA2)
        eqGainBox.Add(self.knobEqA2, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobEqA3 = ControlKnob(self,
                                    -40,
                                    18,
                                    0,
                                    label='B3 gain',
                                    outFunction=self.changeEqA3)
        eqGainBox.Add(self.knobEqA3, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobEqA4 = ControlKnob(self,
                                    -40,
                                    18,
                                    0,
                                    label='B4 gain',
                                    outFunction=self.changeEqA4)
        eqGainBox.Add(self.knobEqA4, 0, wx.LEFT | wx.RIGHT, 5)

        box.Add(eqGainBox)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        #Compress
        compTitle = wx.StaticText(self, id=-1, label="Dynamic Compressor")
        box.Add(compTitle, 0, wx.CENTER)

        cpKnobBox = wx.BoxSizer(wx.HORIZONTAL)
        self.knobComp1 = ControlKnob(self,
                                     -60,
                                     0,
                                     -3,
                                     label='Thresh',
                                     outFunction=self.changeComp1)
        cpKnobBox.Add(self.knobComp1, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobComp2 = ControlKnob(self,
                                     1,
                                     10,
                                     2,
                                     label='Ratio',
                                     outFunction=self.changeComp2)
        cpKnobBox.Add(self.knobComp2, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobComp3 = ControlKnob(self,
                                     0.001,
                                     0.5,
                                     0.05,
                                     label='Rise',
                                     outFunction=self.changeComp3)
        cpKnobBox.Add(self.knobComp3, 0, wx.LEFT | wx.RIGHT, 5)
        self.knobComp4 = ControlKnob(self,
                                     0.01,
                                     1,
                                     .2,
                                     label='Fall',
                                     outFunction=self.changeComp4)
        cpKnobBox.Add(self.knobComp4, 0, wx.LEFT | wx.RIGHT, 5)

        box.Add(cpKnobBox)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        box.Add(wx.StaticText(self, -1, "Global amplitude (dB)"), 0,
                wx.LEFT | wx.TOP, 10)
        ampBox = wx.BoxSizer(wx.HORIZONTAL)
        self.sl_amp = ControlSlider(self,
                                    -60,
                                    18,
                                    0,
                                    size=(200, 16),
                                    outFunction=self.handleAmp)
        ampBox.Add(self.sl_amp, 0, wx.LEFT | wx.RIGHT, 5)
        box.Add(ampBox, 0, wx.LEFT | wx.RIGHT, 5)
        box.AddSpacer(10)
        self.meter = VuMeter(self, size=(200, 11))
        self.meter.setNumSliders(self.nchnls)
        box.Add(self.meter, 0, wx.LEFT, 10)
        box.AddSpacer(5)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        box.Add(wx.StaticText(self, -1, "Project Settings"), 0,
                wx.CENTER | wx.ALL, 5)

        projSettingsBox = wx.BoxSizer(wx.HORIZONTAL)
        srBox = wx.BoxSizer(wx.VERTICAL)
        srText = wx.StaticText(self, -1, "Rate")
        srBox.Add(srText, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        self.pop_sr = wx.Choice(self,
                                -1,
                                choices=['44100', '48000', '96000'],
                                size=(80, -1))
        self.pop_sr.SetSelection(0)
        self.pop_sr.Bind(wx.EVT_CHOICE, self.handleSamplingRate)
        srBox.Add(self.pop_sr, 0, wx.LEFT | wx.RIGHT, 5)
        chnlsBox = wx.BoxSizer(wx.VERTICAL)
        chnlsText = wx.StaticText(self, -1, "Chnls")
        chnlsBox.Add(chnlsText, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        self.tx_chnls = wx.TextCtrl(self,
                                    -1,
                                    "2",
                                    size=(60, -1),
                                    style=wx.TE_PROCESS_ENTER)
        self.tx_chnls.Bind(wx.EVT_TEXT_ENTER, self.handleNchnls)
        chnlsBox.Add(self.tx_chnls, 0, wx.LEFT | wx.RIGHT, 5)
        projSettingsBox.Add(srBox, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
        projSettingsBox.Add(chnlsBox, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
        box.Add(projSettingsBox, 0, wx.ALIGN_CENTER, 5)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        soundBox = wx.BoxSizer(wx.HORIZONTAL)
        self.tog_audio = wx.ToggleButton(self, -1, "Start", size=(80, -1))
        self.tog_audio.SetFont(font)
        self.tog_audio.Disable()
        soundBox.Add(self.tog_audio, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        box.Add(soundBox, 0, wx.CENTER | wx.ALL, 5)

        box.Add(wx.StaticLine(self, size=(210, 1)), 0, wx.ALL, 5)

        box.Add(wx.StaticText(self, -1, "Record Settings"), 0,
                wx.CENTER | wx.ALL, 5)

        recSettingsBox = wx.BoxSizer(wx.HORIZONTAL)
        fileformatBox = wx.BoxSizer(wx.VERTICAL)
        fileformatText = wx.StaticText(self, -1, "Format")
        fileformatBox.Add(fileformatText, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        self.pop_fileformat = wx.Choice(self,
                                        -1,
                                        choices=EXPORT_FORMATS,
                                        size=(80, -1))
        self.pop_fileformat.SetSelection(0)
        self.pop_fileformat.Bind(wx.EVT_CHOICE, self.handleFileFormat)
        fileformatBox.Add(self.pop_fileformat, 0, wx.LEFT | wx.RIGHT, 5)
        sampletypeBox = wx.BoxSizer(wx.VERTICAL)
        sampletypeText = wx.StaticText(self, -1, "Type")
        sampletypeBox.Add(sampletypeText, 0, wx.CENTER | wx.LEFT | wx.RIGHT, 5)
        self.pop_sampletype = wx.Choice(self, -1, choices=EXPORT_TYPES)
        self.pop_sampletype.SetSelection(0)
        self.pop_sampletype.Bind(wx.EVT_CHOICE, self.handleSampleType)
        sampletypeBox.Add(self.pop_sampletype, 0, wx.LEFT | wx.RIGHT, 5)
        recSettingsBox.Add(fileformatBox, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
        recSettingsBox.Add(sampletypeBox, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
        box.Add(recSettingsBox, 0, wx.ALIGN_CENTER | wx.BOTTOM, 5)

        rec1Box = wx.BoxSizer(wx.HORIZONTAL)

        self.tx_rec_folder = wx.TextCtrl(self, -1, "~/Desktop", size=(120, -1))
        rec1Box.Add(self.tx_rec_folder, 0, wx.LEFT | wx.RIGHT, 10)
        self.but_folder = wx.ToggleButton(self, -1, "Choose", size=(65, -1))
        self.but_folder.SetFont(font)
        rec1Box.Add(self.but_folder, 1,
                    wx.ALIGN_CENTER_VERTICAL | wx.EXPAND | wx.RIGHT, 10)

        rec2Box = wx.BoxSizer(wx.HORIZONTAL)

        self.tx_output = wx.TextCtrl(self, -1, "snd", size=(120, -1))
        rec2Box.Add(self.tx_output, 0, wx.LEFT | wx.RIGHT, 10)
        self.tog_record = wx.ToggleButton(self, -1, "Start Rec", size=(65, -1))
        self.tog_record.SetFont(font)
        rec2Box.Add(self.tog_record, 1,
                    wx.ALIGN_CENTER_VERTICAL | wx.EXPAND | wx.RIGHT, 10)

        box.Add(wx.StaticText(self, -1, "Destination"), 0, wx.LEFT | wx.RIGHT,
                17)
        box.Add(rec1Box, 0, wx.EXPAND | wx.BOTTOM | wx.LEFT | wx.RIGHT, 5)
        box.Add(wx.StaticText(self, -1, "Filename"), 0, wx.LEFT | wx.RIGHT, 17)
        box.Add(rec2Box, 0, wx.EXPAND | wx.BOTTOM | wx.LEFT | wx.RIGHT, 5)

        self.Bind(wx.EVT_CHOICE, self.handleType, self.trajType)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.handleClosed, self.closedToggle)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.handleAudio, self.tog_audio)
        self.tx_output.Bind(wx.EVT_CHAR, self.handleOutput)
        self.tx_rec_folder.Bind(wx.EVT_CHAR, self.handleOutput)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.handleRecord, self.tog_record)
        self.Bind(wx.EVT_TOGGLEBUTTON, self.chooseRecFolder, self.but_folder)

        self.SetAutoLayout(True)
        self.SetSizerAndFit(box)
        self.SetupScrolling(scroll_x=False)

    def changeEqF1(self, x):
        self.parent.sg_audio.setEqFreq(0, x)

    def changeEqF2(self, x):
        self.parent.sg_audio.setEqFreq(1, x)

    def changeEqF3(self, x):
        self.parent.sg_audio.setEqFreq(2, x)

    def getEqFreqs(self):
        return [
            self.knobEqF1.GetValue(),
            self.knobEqF2.GetValue(),
            self.knobEqF3.GetValue()
        ]

    def setEqFreqs(self, freqs):
        self.knobEqF1.SetValue(freqs[0])
        self.knobEqF2.SetValue(freqs[1])
        self.knobEqF3.SetValue(freqs[2])

    def changeEqA1(self, x):
        self.parent.sg_audio.setEqGain(0, math.pow(10.0, x * 0.05))

    def changeEqA2(self, x):
        self.parent.sg_audio.setEqGain(1, math.pow(10.0, x * 0.05))

    def changeEqA3(self, x):
        self.parent.sg_audio.setEqGain(2, math.pow(10.0, x * 0.05))

    def changeEqA4(self, x):
        self.parent.sg_audio.setEqGain(3, math.pow(10.0, x * 0.05))

    def getEqAmps(self):
        return [
            self.knobEqA1.GetValue(),
            self.knobEqA2.GetValue(),
            self.knobEqA3.GetValue(),
            self.knobEqA4.GetValue()
        ]

    def setEqAmps(self, amps):
        self.knobEqA1.SetValue(amps[0])
        self.knobEqA2.SetValue(amps[1])
        self.knobEqA3.SetValue(amps[2])
        self.knobEqA4.SetValue(amps[3])

    def changeComp1(self, x):
        self.parent.sg_audio.setCompParam("thresh", x)

    def changeComp2(self, x):
        self.parent.sg_audio.setCompParam("ratio", x)

    def changeComp3(self, x):
        self.parent.sg_audio.setCompParam("risetime", x)

    def changeComp4(self, x):
        self.parent.sg_audio.setCompParam("falltime", x)

    def getCompValues(self):
        return [
            self.knobComp1.GetValue(),
            self.knobComp2.GetValue(),
            self.knobComp3.GetValue(),
            self.knobComp4.GetValue()
        ]

    def setCompValues(self, vals):
        self.knobComp1.SetValue(vals[0])
        self.knobComp2.SetValue(vals[1])
        self.knobComp3.SetValue(vals[2])
        self.knobComp4.SetValue(vals[3])

    def checkEnableWidgets(self):
        if self.type == 0:
            self.closedToggle.Enable()
        else:
            self.closedToggle.Disable()
        if self.type == 2:
            self.drawing.sl_period.Enable()
            self.drawing.sl_scaling.Enable()
        else:
            self.drawing.sl_period.Disable()
            self.drawing.sl_scaling.Disable()

    # TODO: replace all these handle, get, set, with single event
    def handleType(self, event):
        self.processType(event.GetInt())

    def getType(self):
        return self.type

    def setType(self, type):
        self.trajType.SetSelection(type)
        self.processType(type)

    def processType(self, type):
        self.type = type
        self.surface.setMode(type)
        self.checkEnableWidgets()

    def handleClosed(self, event):
        self.surface.setClosed(event.GetInt())

    def getClosed(self):
        return self.closedToggle.GetValue()

    def setClosed(self, closed):
        self.closedToggle.SetValue(closed)
        self.surface.setClosed(closed)

    def handleCutoff(self, val):
        for traj in self.surface.getAllTrajectories():
            traj.setFilterFreq(val)

    def getCutoff(self):
        return self.drawing.sl_cutoff.GetValue()

    def setCutoff(self, cutoff):
        self.drawing.sl_cutoff.SetValue(cutoff)
        for traj in self.surface.getAllTrajectories():
            traj.setFilterFreq(cutoff)

    def handleQ(self, val):
        for traj in self.surface.getAllTrajectories():
            traj.setFilterQ(val)

    def getQ(self):
        return self.drawing.sl_q.GetValue()

    def setQ(self, q):
        self.drawing.sl_q.SetValue(q)
        for traj in self.surface.getAllTrajectories():
            traj.setFilterQ(q)

    def handlePeriod(self, val):
        self.surface.setOscilPeriod(val)

    def getPeriod(self):
        return self.surface.getOscilPeriod()

    def setPeriod(self, period):
        self.drawing.sl_period.SetValue(period)
        self.surface.setOscilPeriod(period)

    def handleScaling(self, val):
        self.surface.setOscilScaling(val)

    def getScaling(self):
        return self.surface.getOscilScaling()

    def setScaling(self, scaling):
        self.drawing.sl_scaling.SetValue(scaling)
        self.surface.setOscilScaling(scaling)

    def resetPlaybackSliders(self):
        selToMax = False
        if self.selected == MAX_STREAMS:
            self.selected = 0
            selToMax = True
        timeSpeed = self.surface.getTrajectory(self.selected).getTimeSpeed()
        self.setTimerSpeed(timeSpeed)
        step = self.surface.getTrajectory(self.selected).getStep()
        self.setStep(step)
        amp = self.surface.getTrajectory(self.selected).getAmplitude()
        self.setTrajAmp(amp)
        if selToMax:
            self.selected = MAX_STREAMS
        self.surface.needBitmap = True

    def handleSelected(self, event):
        if event.GetInt() != self.selected:
            self.selected = event.GetInt()
            self.selectedOkToChange = False
            if self.selected == MAX_STREAMS:
                self.selectedOkToChange = False
            self.resetPlaybackSliders()

    def setSelected(self, selected):
        self.playback.tog_traj.SetSelection(selected)
        self.selected = selected
        self.surface.setSelectedById(selected)
        self.resetPlaybackSliders()

    def getSelected(self):
        return self.selected

    def handlePopupFocus(self, evt):
        self.selectedOkToChange = False
        evt.Skip()

    def handleTimerSpeed(self, val):
        if self.selectedOkToChange:
            if self.selected == MAX_STREAMS:
                for t in self.surface.getActiveTrajectories():
                    t.setTimeSpeed(val)
            else:
                self.surface.getTrajectory(self.selected).setTimeSpeed(val)
        else:
            self.selectedOkToChange = True

    def setTimerSpeed(self, timeSpeed):
        self.playback.sl_timespeed.SetValue(timeSpeed, self.selectedOkToChange)

    def sendTrajSpeed(self, which, speed):
        self.parent.sg_audio.setMetroTime(which, speed * 0.001)

    def handleStep(self, val):
        if self.selectedOkToChange:
            if self.selected == MAX_STREAMS:
                for t in self.surface.getActiveTrajectories():
                    t.setStep(val)
            else:
                self.surface.getTrajectory(self.selected).setStep(val)
        else:
            self.selectedOkToChange = True

    def setStep(self, step):
        self.playback.sl_step.SetValue(step, self.selectedOkToChange)

    def handleTrajAmp(self, val):
        val = pow(10.0, float(val) * 0.05)
        if self.selectedOkToChange:
            if self.selected == MAX_STREAMS:
                for t in self.surface.getActiveTrajectories():
                    t.setAmplitude(val)
                    self.parent.sg_audio.setTrajAmplitude(t.label - 1, val)
            else:
                self.surface.getTrajectory(self.selected).setAmplitude(val)
                self.parent.sg_audio.setTrajAmplitude(self.selected, val)
        else:
            self.selectedOkToChange = True

    def setTrajAmp(self, val):
        if val <= 0.0:
            val = 0.0001
        self.playback.sl_amp.SetValue(20.0 * math.log10(val),
                                      self.selectedOkToChange)

    def handleAmp(self, val):
        self.amplitude = pow(10.0, float(val) * 0.05)
        self.sendAmp()

    def getAmp(self):
        return self.amplitude

    def setAmp(self, amp):
        if amp <= 0.0:
            amp = 0.0001
        self.sl_amp.SetValue(20.0 * math.log10(amp))
        self.amplitude = amp

    def sendAmp(self):
        self.parent.sg_audio.setGlobalAmp(self.amplitude)

    def handleLoad(self):
        dlg = wx.FileDialog(self,
                            message="Choose a sound file",
                            defaultDir=self.parent.lastAudioPath,
                            wildcard=AUDIO_WILDCARD,
                            style=wx.FD_OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            sndPath = dlg.GetPath()
            self.loadSound(ensureNFD(sndPath))
            self.parent.lastAudioPath = os.path.split(sndPath)[0]
        dlg.Destroy()

    def handleInsert(self):
        ok = False
        dlg = wx.FileDialog(self,
                            message="Choose a sound file to insert",
                            defaultDir=self.parent.lastAudioPath,
                            wildcard=AUDIO_WILDCARD,
                            style=wx.FD_OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            ok = True
            sndPath = dlg.GetPath()
            self.parent.lastAudioPath = os.path.split(sndPath)[0]
        dlg.Destroy()
        if ok:
            self.insertSound(ensureNFD(sndPath), True)

    def loadSound(self, sndPath, force=False):
        if sndPath:
            if os.path.isfile(sndPath):
                self.sndPath = sndPath
                self.parent.sg_audio.loadSnd(self.sndPath)
                chnls, samprate, dur = soundInfo(self.sndPath)
                self.sndDur = dur
                self.chnls = chnls
                self.sndInfoStr = u'Loaded sound: %s,  Sr: %i Hz,  Channels: %s,  Duration: %.3f sec' % (
                    self.sndPath, int(samprate), chnls, dur)
                if self.parent.draw:
                    if not self.sndPath in self.surface.bitmapDict.keys(
                    ) or force:
                        self.parent.log("Drawing waveform...")
                        self.surface.analyse(self.sndPath)
                    else:
                        self.surface.list = self.surface.bitmapDict[
                            self.sndPath]
                        self.surface.create_bitmap()
                self.logSndInfo()
            elif os.path.isfile(
                    os.path.join(self.parent.currentPath,
                                 os.path.split(sndPath)[1])):
                self.loadSound(
                    os.path.join(self.parent.currentPath,
                                 os.path.split(sndPath)[1]), force)
            elif ":\\" in sndPath:
                # Handle windows path...
                self.loadSound(
                    os.path.join(self.parent.currentPath,
                                 sndPath.split("\\")[-1]), force)
            else:
                self.parent.log('Sound file "%s" does not exist!' % sndPath)
        else:
            self.parent.log("")

    def insertSound(self, sndPath, force=False):
        if not self.sndPath:
            self.loadSound(sndPath)
            return
        if sndPath:
            if os.path.isfile(sndPath):
                self.sndPath = "Mixed sound " + str(random.randint(0, 10000))
                chnls, samprate, dur = soundInfo(sndPath)
                dlg = InsertDialog(self,
                                   -1,
                                   'Insert sound settings',
                                   actual_dur=self.sndDur,
                                   snd_dur=dur)
                refpos = self.surface.GetPosition()
                refsize = self.surface.GetSize()
                dlgsize = dlg.GetSize()
                X = refpos[0] + (refsize[0] / 2 - dlgsize[0] / 2)
                Y = refpos[1] + (refsize[1] / 2 - dlgsize[1] / 2)
                dlg.SetPosition((X, Y))
                if dlg.ShowModal() == wx.ID_OK:
                    start, end, point, cross = dlg.getValues()
                    ok = True
                else:
                    ok = False
                dlg.Destroy()
                if not ok:
                    return
                self.parent.sg_audio.insertSnd(sndPath, start, end, point,
                                               cross)
                self.sndDur = self.parent.sg_audio.getTableDuration()
                self.sndInfoStr = u'Loaded sound: %s,    Sr: %s Hz,    Channels: %s,    Duration: %s sec' % (
                    self.sndPath, samprate, self.chnls, self.sndDur)
                if self.parent.draw:
                    if not self.sndPath in self.surface.bitmapDict.keys(
                    ) or force:
                        self.parent.log("Drawing waveform...")
                        self.surface.analyse(self.sndPath)
                    else:
                        self.surface.list = self.surface.bitmapDict[
                            self.sndPath]
                        self.surface.create_bitmap()
                self.logSndInfo()
            elif os.path.isfile(
                    os.path.join(self.parent.currentPath,
                                 os.path.split(sndPath)[1])):
                self.insertSound(
                    os.path.join(self.parent.currentPath,
                                 os.path.split(sndPath)[1]), force)
            elif ":\\" in sndPath:
                # Handle windows path...
                self.insertSound(
                    os.path.join(self.parent.currentPath,
                                 sndPath.split("\\")[-1]), force)
            else:
                self.parent.log('Sound file "%s" does not exist!' % sndPath)

    def drawWaveform(self):
        if self.surface.sndBitmap and self.parent.draw:
            self.surface.analyse(self.sndPath)

    def getNchnls(self):
        return self.nchnls

    def setNchnls(self, x):
        if x != self.nchnls:
            self.nchnls = x
            self.tx_chnls.SetValue(str(x))
            self.meter.setNumSliders(self.nchnls)
            self.shutdownServer()
            self.bootServer()

    def handleNchnls(self, event):
        x = int(self.tx_chnls.GetValue())
        if x != self.nchnls:
            status, path = self.parent.checkForMixedSound()
            if not status:
                self.tx_chnls.SetValue(str(self.nchnls))
                return
            if "Mixed sound" in self.sndPath:
                self.sndPath = path
            self.nchnls = x
            self.meter.setNumSliders(self.nchnls)
            self.shutdownServer()
            self.bootServer()

    def getSamplingRate(self):
        return self.samplingRate

    def setSamplingRate(self, x):
        SR = {44100: 0, 48000: 1, 96000: 2}
        if x != self.samplingRate:
            self.samplingRate = x
            self.pop_sr.SetSelection(SR[self.samplingRate])
            self.shutdownServer()
            self.bootServer()

    def handleSamplingRate(self, event):
        SR = {0: 44100, 1: 48000, 2: 96000}
        x = SR[event.GetInt()]
        if x != self.samplingRate:
            status, path = self.parent.checkForMixedSound()
            if not status:
                SR = {44100: 0, 48000: 1, 96000: 2}
                self.pop_sr.SetSelection(SR[self.samplingRate])
                return
            if "Mixed sound" in self.sndPath:
                self.sndPath = path
            self.samplingRate = x
            self.shutdownServer()
            self.bootServer()

    def getFileFormat(self):
        return self.fileformat

    def setFileFormat(self, x):
        self.fileformat = x
        self.pop_fileformat.SetSelection(self.fileformat)

    def handleFileFormat(self, event):
        self.fileformat = event.GetInt()

    def getSampleType(self):
        return self.sampletype

    def setSampleType(self, x):
        self.sampletype = x
        self.pop_sampletype.SetSelection(self.sampletype)

    def handleSampleType(self, event):
        self.sampletype = event.GetInt()

    def bootServer(self):
        self.parent.sg_audio.boot(self.parent.audioDriver, self.nchnls,
                                  self.samplingRate)
        self.tog_audio.Enable()
        if self.sndPath != "" and self.tempState == None:
            self.loadSound(self.sndPath)
        if self.tempState != None:
            self.parent.setState(self.tempState)
            self.tempState = None

    def shutdownServer(self):
        self.tempState = self.parent.getState()
        self.parent.sg_audio.shutdown()
        self.tog_audio.Disable()
        self.surface.Refresh()

    def handleAudio(self, event):
        if event.GetInt() == 1:
            if self.sndPath == "":
                self.parent.log('*** No sound loaded! ***')
                self.tog_audio.SetValue(0)
                self.parent.menu.Check(7, False)
            else:
                self.tx_chnls.Disable()
                self.tx_chnls.SetBackgroundColour("#EEEEEE")
                self.pop_sr.Disable()
                self.parent.enableDrivers(False)
                self.tog_audio.SetLabel('Stop')
                self.tog_audio.SetValue(1)
                self.parent.menu.Check(7, True)

                for t in self.surface.getAllTrajectories():
                    t.initCounter()
                self.parent.sg_audio.start()
        else:
            self.tx_chnls.Enable()
            self.tx_chnls.SetBackgroundColour("#FFFFFF")
            self.pop_sr.Enable()
            self.parent.enableDrivers(True)
            self.tog_audio.SetLabel('Start')
            self.tog_audio.SetValue(0)
            self.parent.menu.Check(7, False)
            self.tog_record.SetValue(0)
            self.tog_record.SetLabel('Start Rec')
            self.parent.sg_audio.stop()

    def handleOutput(self, event):
        key = event.GetKeyCode()
        if key == wx.WXK_TAB or key == wx.WXK_RETURN:
            self.surface.SetFocus()
        event.Skip()

    def setRecordFolder(self, str):
        self.tx_rec_folder.SetValue(str)

    def setRecordFilename(self, str):
        self.tx_output.SetValue(str)

    def handleRecord(self, event):
        if event.GetInt() == 1:
            folder = self.tx_rec_folder.GetValue()
            if folder.startswith("~"):
                folder = folder.replace("~", os.path.expanduser("~"), 1)
            if os.path.isdir(folder):
                filename = os.path.join(folder, self.tx_output.GetValue())
            else:
                filename = os.path.join(os.path.expanduser('~'), "Desktop",
                                        self.tx_output.GetValue())
            self.parent.sg_audio.recStart(filename, self.fileformat,
                                          self.sampletype)
            self.tog_record.SetLabel('Stop Rec')
        else:
            self.tog_record.SetLabel('Start Rec')
            self.parent.sg_audio.recStop()

    def chooseRecFolder(self, evt):
        dlg = wx.DirDialog(
            self,
            message="Choose a folder to save Soundgrain's output sounds...",
            defaultPath=os.path.expanduser("~"))
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            self.tx_rec_folder.SetValue(ensureNFD(path))
        dlg.Destroy()
        self.but_folder.SetValue(0)

    def logSndInfo(self):
        self.parent.log(self.sndInfoStr)