Sampler in ChucK
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
7.6KB

  1. from libs.simpleosc import *
  2. import wx
  3. class OSCSlider(wx.Panel):
  4. ''' A GUI slider '''
  5. def __init__(self, parent, label, min_value=0, max_value=1, default_value=0, align=True):
  6. ''' Constructor '''
  7. wx.Panel.__init__(self, parent)
  8. sizer=wx.BoxSizer(wx.HORIZONTAL)
  9. label=wx.StaticText(self, label=label, size=(100,15) if align else None)
  10. sizer.Add(label, 0, wx.RIGHT, 10)
  11. self.slider=wx.Slider(self, value=default_value*100, minValue=min_value*100, maxValue=max_value*100)
  12. sizer.Add(self.slider, 1, wx.EXPAND)
  13. self.SetSizerAndFit(sizer)
  14. class InputPanel(wx.Panel):
  15. ''' Handle the ADC input settings '''
  16. def __init__(self, parent):
  17. ''' Constructor '''
  18. wx.Panel.__init__(self, parent)
  19. sizer = wx.BoxSizer(wx.HORIZONTAL)
  20. label = wx.StaticText(self, label="Line In:")
  21. font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font)
  22. sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5)
  23. self.gain = OSCSlider(self, "Gain", default_value=.5, align=False)
  24. sizer.Add(self.gain, 1, wx.ALL, 5)
  25. self.thru = OSCSlider(self, "Thru", default_value=.5, align=False)
  26. sizer.Add(self.thru, 1, wx.ALL, 5)
  27. self.mute = wx.ToggleButton(self, 1, "Mute")
  28. sizer.Add(self.mute, 0)
  29. self.SetSizerAndFit(sizer)
  30. self.gain.slider.Bind(wx.EVT_SCROLL, self.update)
  31. self.thru.slider.Bind(wx.EVT_SCROLL, self.update)
  32. self.mute.Bind(wx.EVT_TOGGLEBUTTON, self.update)
  33. self.update()
  34. def update(self, evt=None):
  35. """ Send OSC messages """
  36. gain=self.gain.slider.GetValue()/100.
  37. thru=self.thru.slider.GetValue()/100.
  38. if self.mute.GetValue(): gain, thru = 0.,0.
  39. try:
  40. sendOSCMsg("/input", [gain, thru])
  41. except OSCClientError:
  42. pass
  43. class DelayPanel(wx.Panel):
  44. ''' Handle the ADC input settings '''
  45. def __init__(self, parent):
  46. ''' Constructor '''
  47. wx.Panel.__init__(self, parent)
  48. sizer = wx.BoxSizer(wx.VERTICAL)
  49. label = wx.StaticText(self, label="Delay line:")
  50. font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font)
  51. sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5)
  52. self.delayTime=OSCSlider(self, "Delay time (s)", default_value=1, max_value=10)
  53. sizer.Add(self.delayTime, 0, wx.EXPAND|wx.ALL, 5)
  54. self.feedback=OSCSlider(self, "Feedback", default_value=.95)
  55. sizer.Add(self.feedback, 0, wx.EXPAND|wx.ALL, 5)
  56. self.SetSizerAndFit(sizer)
  57. self.delayTime.slider.Bind(wx.EVT_SCROLL, self.update)
  58. self.feedback.slider.Bind(wx.EVT_SCROLL, self.update)
  59. self.update(None)
  60. def update(self, evt):
  61. """ Send OSC messages """
  62. a=self.delayTime.slider.GetValue()/100.
  63. b=self.feedback.slider.GetValue()/100.
  64. try:
  65. sendOSCMsg("/delay", [a, b])
  66. except OSCClientError:
  67. pass
  68. class Channel(wx.Panel):
  69. """ A single channel """
  70. def __init__(self, parent, index):
  71. self.index=index
  72. wx.Panel.__init__(self, parent)
  73. sizer = wx.BoxSizer(wx.VERTICAL)
  74. label = wx.StaticText(self, label="CH%d" % self.index)
  75. font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font)
  76. sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5)
  77. self.gain = OSCSlider(self, "Gain", default_value=0, align=False)
  78. sizer.Add(self.gain, 0, wx.ALL|wx.EXPAND, 3)
  79. self.pan = OSCSlider(self, "Pan", min_value=-1, max_value=1, default_value=0, align=False)
  80. sizer.Add(self.pan, 0, wx.ALL|wx.EXPAND, 3)
  81. self.record = wx.ToggleButton(self, 1, "Arm")
  82. sizer.Add(self.record, 0, wx.ALL|wx.EXPAND, 3)
  83. self.mute = wx.ToggleButton(self, 1, "Mute")
  84. sizer.Add(self.mute, 0, wx.ALL|wx.EXPAND, 3)
  85. self.fx = wx.ToggleButton(self, 1, "FX")
  86. sizer.Add(self.fx, 0, wx.ALL|wx.EXPAND, 3)
  87. self.clear = wx.Button(self, 1, "Clear")
  88. sizer.Add(self.clear, 0, wx.ALL|wx.EXPAND, 3)
  89. #self.gain.slider.Bind(wx.EVT_SCROLL, self.update)
  90. self.gain.slider.Bind(wx.EVT_SCROLL, self.update)
  91. self.pan.slider.Bind(wx.EVT_SCROLL, self.update)
  92. self.SetSizerAndFit(sizer)
  93. def update(self, evt=None):
  94. data = [self.index,
  95. self.gain.slider.GetValue()/100.,
  96. self.pan.slider.GetValue()/100.]
  97. #self.record.GetValue(),
  98. #self.mute.GetValue(),
  99. #self.fx.GetValue()]
  100. try:
  101. sendOSCMsg("/channel", data)
  102. except OSCClientError:
  103. pass
  104. class CommsPanel(wx.Panel):
  105. """ OSC comms """
  106. def __init__(self, parent):
  107. wx.Panel.__init__(self, parent)
  108. sizer = wx.BoxSizer(wx.HORIZONTAL)
  109. label = wx.StaticText(self, label="Sync:")
  110. font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font)
  111. sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT|wx.EXPAND, 5)
  112. self.master = wx.ToggleButton(self, 1, "Master/Minion")
  113. sizer.Add(self.master, 0, wx.ALL, 3)
  114. self.ip=wx.TextCtrl(self, value="127.0.0.1")
  115. self.ip.SetFont(wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
  116. sizer.Add(self.ip, 0, wx.ALL, 3)
  117. self.port=wx.TextCtrl(self, value="9000")
  118. self.port.SetFont(wx.Font(9, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
  119. sizer.Add(self.port, 0, wx.ALL, 3)
  120. self.SetSizerAndFit(sizer)
  121. class ChannelPanel(wx.Panel):
  122. ''' All the channels '''
  123. def __init__(self, parent):
  124. ''' Constructor '''
  125. wx.Panel.__init__(self, parent)
  126. sizer = wx.BoxSizer(wx.HORIZONTAL)
  127. self.channels=[]
  128. for i in range(4):
  129. c=Channel(self, index=i)
  130. #self.feedback.slider.Bind(wx.EVT_SCROLL, self.update)
  131. self.channels.append(c)
  132. sizer.Add(c, 1, wx.EXPAND)
  133. self.SetSizerAndFit(sizer)
  134. self.update(None)
  135. def update(self, evt):
  136. """ Send OSC messages """
  137. pass
  138. class MainGUI(wx.Frame):
  139. """ A simple GUI to talk to Chuck """
  140. def __init__(self):
  141. """ Constructor """
  142. # Build the interface
  143. self.app = wx.App(False)
  144. self.build()
  145. self.app.MainLoop()
  146. def build(self):
  147. """ Builds the various pieces of the GUI """
  148. wx.Frame.__init__(self, None, title="DELAY LORD")
  149. self.Bind(wx.EVT_CLOSE, self.quit)
  150. # The main sizer
  151. self.mainsizer = wx.BoxSizer(wx.VERTICAL)
  152. self.commsPanel = CommsPanel(self)
  153. self.mainsizer.Add(self.commsPanel, 0, wx.EXPAND|wx.ALL, 5)
  154. line=wx.StaticLine(self); self.mainsizer.Add(line, 0, wx.EXPAND|wx.ALL, 1)
  155. self.inputPanel = InputPanel(self)
  156. self.mainsizer.Add(self.inputPanel, 0, wx.EXPAND|wx.ALL, 5)
  157. line=wx.StaticLine(self); self.mainsizer.Add(line, 0, wx.EXPAND|wx.ALL, 1)
  158. self.delayPanel = DelayPanel(self)
  159. self.mainsizer.Add(self.delayPanel, 0, wx.EXPAND|wx.ALL, 5)
  160. line=wx.StaticLine(self); self.mainsizer.Add(line, 0, wx.EXPAND|wx.ALL, 1)
  161. self.channelPanel = ChannelPanel(self)
  162. self.mainsizer.Add(self.channelPanel, 1, wx.EXPAND|wx.ALL, 5)
  163. # Put things together
  164. self.SetSizerAndFit(self.mainsizer)
  165. self.Show()
  166. def populate_left_panel(self):
  167. """ Populate the left panel """
  168. # Status boxes
  169. def quit(self, *args):
  170. """ Close down gracefully, and then destroy the window """
  171. self.Destroy()
  172. if __name__ == "__main__":
  173. initOSCClient(ip="127.0.0.1", port=9000)
  174. g=MainGUI()
  175. closeOSC()