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.

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