from libs.simpleosc import * import wx class OSCSlider(wx.Panel): ''' A GUI slider ''' def __init__(self, parent, label, min_value=0, max_value=1, default_value=0, show_value=True, align=True): ''' Constructor ''' self.show_value=show_value wx.Panel.__init__(self, parent) sizer=wx.BoxSizer(wx.HORIZONTAL) label=wx.StaticText(self, label=label, size=(100,15) if align else None) sizer.Add(label, 0, wx.RIGHT, 10) self.slider=wx.Slider(self, value=default_value*100, minValue=min_value*100, maxValue=max_value*100) sizer.Add(self.slider, 1, wx.EXPAND) if show_value: self.indicator=wx.StaticText(self, label="--", size=(50,15)) sizer.Add(self.indicator, 0, wx.LEFT, 10) self.SetSizerAndFit(sizer) self.slider.Bind(wx.EVT_SCROLL, self.update) self.update(None) def update(self, evt): value=self.slider.GetValue()/100. if self.show_value: self.indicator.SetLabel("%s" % value) class InputPanel(wx.Panel): ''' Handle the ADC input settings ''' def __init__(self, parent): ''' Constructor ''' wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.HORIZONTAL) label = wx.StaticText(self, label="Line In:") font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font) sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5) self.gain = OSCSlider(self, "Gain", default_value=.5, show_value=False, align=False) sizer.Add(self.gain, 1, wx.ALL, 5) self.thru = OSCSlider(self, "Thru", default_value=.5, show_value=False, align=False) sizer.Add(self.thru, 1, wx.ALL, 5) self.button = wx.Button(self, 1, "Kill input") sizer.Add(self.button, 0) self.SetSizerAndFit(sizer) self.gain.slider.Bind(wx.EVT_SCROLL, self.update) self.thru.slider.Bind(wx.EVT_SCROLL, self.update) self.update(None) def update(self, evt): """ Send OSC messages """ a=self.gain.slider.GetValue()/100. b=self.thru.slider.GetValue()/100. try: sendOSCMsg("/input", [a, b]) except OSCClientError: pass class DelayPanel(wx.Panel): ''' Handle the ADC input settings ''' def __init__(self, parent): ''' Constructor ''' wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.VERTICAL) label = wx.StaticText(self, label="Delay line:") font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font) sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5) self.delayTime=OSCSlider(self, "Delay time (s)", default_value=5, max_value=10) sizer.Add(self.delayTime, 0, wx.EXPAND|wx.ALL, 5) self.feedback=OSCSlider(self, "Feedback", default_value=.95) sizer.Add(self.feedback, 0, wx.EXPAND|wx.ALL, 5) self.SetSizerAndFit(sizer) self.delayTime.slider.Bind(wx.EVT_SCROLL, self.update) self.feedback.slider.Bind(wx.EVT_SCROLL, self.update) self.update(None) def update(self, evt): """ Send OSC messages """ a=self.delayTime.slider.GetValue()/100. b=self.feedback.slider.GetValue()/100. try: sendOSCMsg("/delay", [a, b]) except OSCClientError: pass class Channel(wx.Panel): """ A single channel """ def __init__(self, parent, index): self.index=index wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.VERTICAL) self.SetBackgroundColour((255,0,0)) label = wx.StaticText(self, label="CH%d" % self.index) font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font) sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5) self.SetSizerAndFit(sizer) class ChannelPanel(wx.Panel): ''' All the channels ''' def __init__(self, parent): ''' Constructor ''' wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.HORIZONTAL) self.channels=[] for i in range(4): c=Channel(self, index=i) #self.feedback.slider.Bind(wx.EVT_SCROLL, self.update) self.channels.append(c) sizer.Add(c, 1, wx.EXPAND) self.SetSizerAndFit(sizer) self.update(None) def update(self, evt): """ Send OSC messages """ pass class MainGUI(wx.Frame): """ A simple GUI to talk to Chuck """ def __init__(self): """ Constructor """ # Build the interface self.app = wx.App(False) self.build() self.app.MainLoop() def build(self): """ Builds the various pieces of the GUI """ wx.Frame.__init__(self, None, title="DELAY LORD") self.Bind(wx.EVT_CLOSE, self.quit) # The main sizer self.mainsizer = wx.BoxSizer(wx.VERTICAL) self.inputPanel = InputPanel(self) self.mainsizer.Add(self.inputPanel, 0, wx.EXPAND|wx.ALL, 5) line=wx.StaticLine(self); self.mainsizer.Add(line, 0, wx.EXPAND|wx.ALL, 5) self.delayPanel = DelayPanel(self) self.mainsizer.Add(self.delayPanel, 0, wx.EXPAND|wx.ALL, 5) line=wx.StaticLine(self); self.mainsizer.Add(line, 0, wx.EXPAND|wx.ALL, 5) self.channelPanel = ChannelPanel(self) self.mainsizer.Add(self.channelPanel, 1, wx.EXPAND|wx.ALL, 5) # Put things together self.SetSizerAndFit(self.mainsizer) self.Show() self.SetSize((400,500)) def populate_left_panel(self): """ Populate the left panel """ # Status boxes def quit(self, *args): """ Close down gracefully, and then destroy the window """ self.Destroy() if __name__ == "__main__": initOSCClient(ip="127.0.0.1", port=9000) g=MainGUI() closeOSC()