Browse Source

PEP8

master
Pete Shadbolt 9 years ago
parent
commit
d720c9afeb
1 changed files with 142 additions and 125 deletions
  1. +142
    -125
      main.py

+ 142
- 125
main.py View File

@@ -1,7 +1,6 @@
import wx import wx


#TODO: standardize methods for adding/removing arrays of widgets
#TODO: fix the *100 / /100 stuff
# TODO: standardize methods for adding/removing arrays of widgets


def sendOSCSafe(channel, data): def sendOSCSafe(channel, data):
try: try:
@@ -9,61 +8,73 @@ def sendOSCSafe(channel, data):
except OSCClientError: except OSCClientError:
print "OSC comms error" print "OSC comms error"



class OSCSlider(wx.Panel): class OSCSlider(wx.Panel):

""" A GUI slider """ """ A GUI slider """

def __init__(self, parent, label, min_value=0, max_value=1, default_value=0, align=True, rescale=100.): def __init__(self, parent, label, min_value=0, max_value=1, default_value=0, align=True, rescale=100.):
""" Constructor """ """ Constructor """
self.rescale=rescale
self.rescale = rescale
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
sizer=wx.BoxSizer(wx.HORIZONTAL)
label=wx.StaticText(self, label=label, \
size=(100,15) if align else None)
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) sizer.Add(label, 0, wx.RIGHT, 10)
self.slider=wx.Slider(self, value=default_value*self.rescale, \
minValue=min_value*self.rescale, maxValue=max_value*self.rescale)
self.slider = wx.Slider(self, value=default_value * self.rescale,
minValue=min_value * self.rescale, maxValue=max_value * self.rescale)
sizer.Add(self.slider, 1, wx.EXPAND) sizer.Add(self.slider, 1, wx.EXPAND)


self.SetSizerAndFit(sizer) self.SetSizerAndFit(sizer)
self.Bind=self.slider.Bind
self.Bind = self.slider.Bind


def GetValue(self): def GetValue(self):
""" Make sure that we rescale """ """ Make sure that we rescale """
return self.slider.GetValue()/self.rescale
return self.slider.GetValue() / self.rescale



class CommsPanel(wx.Panel): class CommsPanel(wx.Panel):

""" OSC comms """ """ OSC comms """

def __init__(self, parent): def __init__(self, parent):
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.HORIZONTAL) sizer = wx.BoxSizer(wx.HORIZONTAL)


label = wx.StaticText(self, label="Sync:") label = wx.StaticText(self, label="Sync:")
font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font)
sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT|wx.EXPAND, 5)
font = label.GetFont()
font.SetWeight(wx.BOLD)
label.SetFont(font)
sizer.Add(label, 0, wx.TOP | wx.BOTTOM | wx.RIGHT | wx.EXPAND, 5)



choices=["Master", "Minion"]
self.master= wx.ComboBox(self, choices=choices, style=wx.CB_READONLY, size=(25,25))
choices = ["Master", "Minion"]
self.master = wx.ComboBox(self, choices=choices, style=wx.CB_READONLY, size=(25, 25))
sizer.Add(self.master, 1, wx.ALL, 3) sizer.Add(self.master, 1, wx.ALL, 3)
self.master.SetValue(choices[0]) self.master.SetValue(choices[0])


self.ip=wx.TextCtrl(self, value="127.0.0.1")
self.ip = wx.TextCtrl(self, value="127.0.0.1")
sizer.Add(self.ip, 0, wx.ALL, 3) sizer.Add(self.ip, 0, wx.ALL, 3)


self.port=wx.TextCtrl(self, value="9000")
self.port = wx.TextCtrl(self, value="9000")
sizer.Add(self.port, 0, wx.ALL, 3) sizer.Add(self.port, 0, wx.ALL, 3)


self.SetSizerAndFit(sizer) self.SetSizerAndFit(sizer)



class InputPanel(wx.Panel): class InputPanel(wx.Panel):
''' Handle the ADC input settings '''

""" Handle the ADC input settings """

def __init__(self, parent): def __init__(self, parent):
''' Constructor '''
""" Constructor """
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.HORIZONTAL) sizer = wx.BoxSizer(wx.HORIZONTAL)


label = wx.StaticText(self, label="Input:") label = wx.StaticText(self, label="Input:")
font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font)
sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5)
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, align=False) self.gain = OSCSlider(self, "Gain", default_value=.5, align=False)
sizer.Add(self.gain, 1, wx.ALL, 5) sizer.Add(self.gain, 1, wx.ALL, 5)
@@ -71,10 +82,10 @@ class InputPanel(wx.Panel):
sizer.Add(self.thru, 1, wx.ALL, 5) sizer.Add(self.thru, 1, wx.ALL, 5)


self.mute = wx.ToggleButton(self, 0, "Mute") self.mute = wx.ToggleButton(self, 0, "Mute")
#self.mute.SetValue(1)
# self.mute.SetValue(1)
sizer.Add(self.mute, 0) sizer.Add(self.mute, 0)
self.SetSizerAndFit(sizer) self.SetSizerAndFit(sizer)
self.gain.Bind(wx.EVT_SCROLL, self.update) self.gain.Bind(wx.EVT_SCROLL, self.update)
self.thru.Bind(wx.EVT_SCROLL, self.update) self.thru.Bind(wx.EVT_SCROLL, self.update)
self.mute.Bind(wx.EVT_TOGGLEBUTTON, self.update) self.mute.Bind(wx.EVT_TOGGLEBUTTON, self.update)
@@ -83,29 +94,35 @@ class InputPanel(wx.Panel):


def update(self, evt=None): def update(self, evt=None):
""" Send OSC messages """ """ Send OSC messages """
gain=self.gain.slider.GetValue()/100.
thru=self.thru.slider.GetValue()/100.
if self.mute.GetValue(): gain, thru = 0.,0.
gain = self.gain.slider.GetValue()
thru = self.thru.slider.GetValue()
if self.mute.GetValue():
gain, thru = 0., 0.
sendOSCSafe("/input", [gain, thru]) sendOSCSafe("/input", [gain, thru])



class DelayPanel(wx.Panel): class DelayPanel(wx.Panel):
''' Handle the ADC input settings '''

""" Handle the ADC input settings """

def __init__(self, parent): def __init__(self, parent):
''' Constructor '''
""" Constructor """
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.HORIZONTAL) sizer = wx.BoxSizer(wx.HORIZONTAL)


label = wx.StaticText(self, label="Loop:") label = wx.StaticText(self, label="Loop:")
font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font)
sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5)
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, "Time", default_value=1, max_value=10, align=False)
self.delayTime = OSCSlider(self, "Time", default_value=1, max_value=10, align=False)
sizer.Add(self.delayTime, 1, wx.ALL, 5) sizer.Add(self.delayTime, 1, wx.ALL, 5)


self.feedback=OSCSlider(self, "Hold", default_value=.99, align=False)
self.feedback = OSCSlider(self, "Hold", default_value=.99, align=False)
sizer.Add(self.feedback, 1, wx.ALL, 5) sizer.Add(self.feedback, 1, wx.ALL, 5)


self.metronome=wx.ToggleButton(self, 0, "Metronome")
self.metronome = wx.ToggleButton(self, 0, "Metronome")
sizer.Add(self.metronome, 0) sizer.Add(self.metronome, 0)


self.SetSizerAndFit(sizer) self.SetSizerAndFit(sizer)
@@ -116,57 +133,63 @@ class DelayPanel(wx.Panel):


def update(self, evt): def update(self, evt):
""" Send OSC messages """ """ Send OSC messages """
a=self.delayTime.slider.GetValue()/100.
b=self.feedback.slider.GetValue()/100.
a = self.delayTime.slider.GetValue()
b = self.feedback.slider.GetValue()
sendOSCSafe("/delay", [a, b]) sendOSCSafe("/delay", [a, b])


def switchMetronome(self, evt): def switchMetronome(self, evt):
""" Send OSC messages """ """ Send OSC messages """
sendOSCSafe("/metronome", [int(self.metronome.GetValue())]) sendOSCSafe("/metronome", [int(self.metronome.GetValue())])



class ButtonArray(wx.Panel): class ButtonArray(wx.Panel):
''' Handle the ADC input settings '''

""" Handle the ADC input settings """

def __init__(self, parent, index): def __init__(self, parent, index):
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
w=40
w = 40
sizer = wx.BoxSizer(wx.HORIZONTAL) sizer = wx.BoxSizer(wx.HORIZONTAL)
self.record = wx.ToggleButton(self, 0, "Arm", size=(w,25))
self.record = wx.ToggleButton(self, 0, "Arm", size=(w, 25))
sizer.Add(self.record, 1, wx.ALL, 0) sizer.Add(self.record, 1, wx.ALL, 0)
self.mute = wx.ToggleButton(self, 0, "Mute", size=(w,25))
self.mute = wx.ToggleButton(self, 0, "Mute", size=(w, 25))
sizer.Add(self.mute, 1, wx.ALL, 0) sizer.Add(self.mute, 1, wx.ALL, 0)
self.clear = wx.Button(self, 0, "Clear", size=(w,25))
self.clear = wx.Button(self, 0, "Clear", size=(w, 25))
sizer.Add(self.clear, 1, wx.ALL, 0) sizer.Add(self.clear, 1, wx.ALL, 0)
self.buttons=(self.record, self.mute, self.clear)
self.buttons = (self.record, self.mute, self.clear)
self.SetSizerAndFit(sizer) self.SetSizerAndFit(sizer)



class Channel(wx.Panel): class Channel(wx.Panel):

""" A single channel """ """ A single channel """

def __init__(self, parent, index): def __init__(self, parent, index):
self.index=index
self.index = index
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.VERTICAL) sizer = wx.BoxSizer(wx.VERTICAL)


#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)
# 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.gain = OSCSlider(self, "Gain", default_value=1, max_value=1.3, align=False) self.gain = OSCSlider(self, "Gain", default_value=1, max_value=1.3, align=False)
sizer.Add(self.gain, 0, wx.ALL|wx.EXPAND, 3)
sizer.Add(self.gain, 0, wx.ALL | wx.EXPAND, 3)


self.pan = OSCSlider(self, "Pan", default_value=0, min_value=-1, max_value=1, align=False) self.pan = OSCSlider(self, "Pan", default_value=0, min_value=-1, max_value=1, align=False)
sizer.Add(self.pan, 0, wx.ALL|wx.EXPAND, 3)
sizer.Add(self.pan, 0, wx.ALL | wx.EXPAND, 3)


self.fxsend = OSCSlider(self, "Dry/Wet", default_value=0, min_value=0, max_value=1, align=False) self.fxsend = OSCSlider(self, "Dry/Wet", default_value=0, min_value=0, max_value=1, align=False)
sizer.Add(self.fxsend, 0, wx.ALL|wx.EXPAND, 3)
sizer.Add(self.fxsend, 0, wx.ALL | wx.EXPAND, 3)


self.buttons=ButtonArray(self, index)
self.buttons = ButtonArray(self, index)
self.record, self.mute, self.clear = self.buttons.buttons self.record, self.mute, self.clear = self.buttons.buttons
sizer.Add(self.buttons, 0, wx.ALL|wx.EXPAND, 3)
sizer.Add(self.buttons, 0, wx.ALL | wx.EXPAND, 3)


choices=["1 bar", "2 bars", "4 bars", "Dephase", "1/2 rate"]
self.speed= wx.ComboBox(self, choices=choices, style=wx.CB_READONLY, size=(25,25))
choices = ["1 bar", "2 bars", "4 bars", "Dephase", "1/2 rate"]
self.speed = wx.ComboBox(self, choices=choices, style=wx.CB_READONLY, size=(25, 25))
self.speed.SetValue("1 bar") self.speed.SetValue("1 bar")
sizer.Add(self.speed, 0, wx.ALL|wx.EXPAND, 3)
sizer.Add(self.speed, 0, wx.ALL | wx.EXPAND, 3)


self.SetSizerAndFit(sizer) self.SetSizerAndFit(sizer)


@@ -177,27 +200,30 @@ class Channel(wx.Panel):
self.update() self.update()


def update(self, evt=None): def update(self, evt=None):
gain=self.gain.GetValue()/100.
pan=self.pan.GetValue()/100.
fxsend=self.fxsend.GetValue()/100.
if self.mute.GetValue(): gain=0.0;
gain = self.gain.GetValue()
pan = self.pan.GetValue()
fxsend = self.fxsend.GetValue()
if self.mute.GetValue():
gain = 0.0
sendOSCSafe("/channel", [self.index, gain, pan, fxsend]) sendOSCSafe("/channel", [self.index, gain, pan, fxsend])




class Mixer(wx.Panel): class Mixer(wx.Panel):
''' All the channels '''

""" All the channels """

def __init__(self, parent): def __init__(self, parent):
''' Constructor '''
""" Constructor """
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.HORIZONTAL) sizer = wx.BoxSizer(wx.HORIZONTAL)


self.channels=[]
self.channels = []
for i in range(4): for i in range(4):
c=Channel(self, index=i)
c = Channel(self, index=i)
c.record.Bind(wx.EVT_TOGGLEBUTTON, self.switch_record) c.record.Bind(wx.EVT_TOGGLEBUTTON, self.switch_record)
c.record.index=i
c.record.index = i
c.clear.Bind(wx.EVT_BUTTON, self.clear_channel) c.clear.Bind(wx.EVT_BUTTON, self.clear_channel)
c.clear.index=i
c.clear.index = i
self.channels.append(c) self.channels.append(c)
sizer.Add(c, 1, wx.EXPAND) sizer.Add(c, 1, wx.EXPAND)


@@ -217,77 +243,90 @@ class Mixer(wx.Panel):
index = evt.GetEventObject().index index = evt.GetEventObject().index
sendOSCSafe("/clear", [index]) sendOSCSafe("/clear", [index])



class FXPanel(wx.Panel): class FXPanel(wx.Panel):
''' Effects chain '''

""" Effects chain """

def __init__(self, parent): def __init__(self, parent):
''' Constructor '''
""" Constructor """
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.HORIZONTAL) sizer = wx.BoxSizer(wx.HORIZONTAL)


label = wx.StaticText(self, label="FX:") label = wx.StaticText(self, label="FX:")
font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font)
sizer.Add(label, 0, wx.EXPAND|wx.TOP|wx.BOTTOM|wx.RIGHT, 5)

#choices=["Low pass filter", "High pass filter", "Reverb"]
#self.fxtype= wx.ComboBox(self, choices=choices, style=wx.CB_READONLY, size=(25,25))
#sizer.Add(self.fxtype, 1, wx.ALL|wx.EXPAND, 5)
#self.fxtype.SetValue(choices[0])

self.lpf=OSCSlider(self, "Lo-pass", default_value=.5, align=False)
sizer.Add(self.lpf, 2, wx.EXPAND|wx.ALL, 5)
font = label.GetFont()
font.SetWeight(wx.BOLD)
label.SetFont(font)
sizer.Add(label, 0, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.RIGHT, 5)

# choices=["Low pass filter", "High pass filter", "Reverb"]
# self.fxtype= wx.ComboBox(self, choices=choices, style=wx.CB_READONLY, size=(25,25))
# sizer.Add(self.fxtype, 1, wx.ALL|wx.EXPAND, 5)
# self.fxtype.SetValue(choices[0])

self.lpf = OSCSlider(self, "Lo-pass", default_value=.5, align=False)
sizer.Add(self.lpf, 2, wx.EXPAND | wx.ALL, 5)
self.lpf.Bind(wx.EVT_SCROLL, self.update) self.lpf.Bind(wx.EVT_SCROLL, self.update)


self.hpf=OSCSlider(self, "Hi-pass", min_value=0.1, default_value=.5, align=False)
sizer.Add(self.hpf, 2, wx.EXPAND|wx.ALL, 5)
self.hpf = OSCSlider(self, "Hi-pass", min_value=0.1, default_value=.5, align=False)
sizer.Add(self.hpf, 2, wx.EXPAND | wx.ALL, 5)
self.hpf.Bind(wx.EVT_SCROLL, self.update) self.hpf.Bind(wx.EVT_SCROLL, self.update)


self.reverb=OSCSlider(self, "Reverb", default_value=.5, align=False)
sizer.Add(self.reverb, 2, wx.EXPAND|wx.ALL, 5)
self.reverb = OSCSlider(self, "Reverb", default_value=.5, align=False)
sizer.Add(self.reverb, 2, wx.EXPAND | wx.ALL, 5)
self.reverb.Bind(wx.EVT_SCROLL, self.update) self.reverb.Bind(wx.EVT_SCROLL, self.update)


self.SetSizerAndFit(sizer) self.SetSizerAndFit(sizer)
self.update(None) self.update(None)


def update(self, evt): def update(self, evt):
a=self.lpf.slider.GetValue()/100.
a2=self.hpf.slider.GetValue()/100.
b=self.reverb.slider.GetValue()/100.
sendOSCSafe("/fx", [a,a2,b])
a = self.lpf.slider.GetValue()
a2 = self.hpf.slider.GetValue()
b = self.reverb.slider.GetValue()
sendOSCSafe("/fx", [a, a2, b])



class OutputPanel(wx.Panel): class OutputPanel(wx.Panel):
''' Handle the ADC input settings '''

""" Handle the ADC input settings """

def __init__(self, parent): def __init__(self, parent):
''' Constructor '''
""" Constructor """
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
sizer = wx.BoxSizer(wx.HORIZONTAL) sizer = wx.BoxSizer(wx.HORIZONTAL)


label = wx.StaticText(self, label="Output:") label = wx.StaticText(self, label="Output:")
font = label.GetFont(); font.SetWeight(wx.BOLD); label.SetFont(font)
sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5)
font = label.GetFont()
font.SetWeight(wx.BOLD)
label.SetFont(font)
sizer.Add(label, 0, wx.TOP | wx.BOTTOM | wx.RIGHT, 5)


self.level=OSCSlider(self, "Level", default_value=.8, align=False)
sizer.Add(self.level, 2, wx.EXPAND|wx.ALL, 5)
self.level = OSCSlider(self, "Level", default_value=.8, align=False)
sizer.Add(self.level, 2, wx.EXPAND | wx.ALL, 5)
self.level.Bind(wx.EVT_SCROLL, self.update) self.level.Bind(wx.EVT_SCROLL, self.update)


#self.gauge = wx.Gauge(self, size=(40,10))
#sizer.Add(self.gauge, 1, wx.EXPAND|wx.ALL, 5)
# self.gauge = wx.Gauge(self, size=(40,10))
# sizer.Add(self.gauge, 1, wx.EXPAND|wx.ALL, 5)


self.SetSizerAndFit(sizer) self.SetSizerAndFit(sizer)


def update(self, evt): def update(self, evt):
a=self.level.slider.GetValue()/100.
a = self.level.slider.GetValue()
sendOSCSafe("/master", [a]) sendOSCSafe("/master", [a])




class MainGUI(wx.Frame): class MainGUI(wx.Frame):

""" A simple GUI to talk to Chuck """ """ A simple GUI to talk to Chuck """

def __init__(self): def __init__(self):
""" Constructor """ """ Constructor """
# Build the interface # Build the interface
self.app = wx.App(False) self.app = wx.App(False)
self.build() self.build()


def run(self): self.app.MainLoop()
def run(self):
self.app.MainLoop()


def build(self): def build(self):
""" Builds the various pieces of the GUI """ """ Builds the various pieces of the GUI """
@@ -296,40 +335,18 @@ class MainGUI(wx.Frame):


# The main sizer # The main sizer
self.mainsizer = wx.BoxSizer(wx.VERTICAL) self.mainsizer = wx.BoxSizer(wx.VERTICAL)
self.components = []
components = (CommsPanel, InputPanel, DelayPanel, Mixer, FXPanel, OutputPanel)


self.commsPanel = CommsPanel(self)
self.mainsizer.Add(self.commsPanel, 0, wx.EXPAND|wx.ALL, 5)

line=wx.StaticLine(self); self.mainsizer.Add(line, 0, wx.EXPAND|wx.ALL, 1)

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, 1)

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, 1)
for index, ctype in enumerate(components):
if index>0: self.mainsizer.Add(wx.StaticLine(self), 0, wx.EXPAND | wx.ALL, 1)
c = ctype(self)
self.components.append(c)
self.mainsizer.Add(self.c, 0, wx.EXPAND | wx.ALL, 5)


self.mixer = Mixer(self)
self.mainsizer.Add(self.mixer, 0, wx.EXPAND|wx.ALL, 5)

line=wx.StaticLine(self); self.mainsizer.Add(line, 0, wx.EXPAND|wx.ALL, 1)

self.fx = FXPanel(self)
self.mainsizer.Add(self.fx, 0, wx.EXPAND|wx.ALL, 5)

line=wx.StaticLine(self); self.mainsizer.Add(line, 0, wx.EXPAND|wx.ALL, 1)

self.output = OutputPanel(self)
self.mainsizer.Add(self.output, 0, wx.EXPAND|wx.ALL, 5)

# Put things together
self.SetSizerAndFit(self.mainsizer) self.SetSizerAndFit(self.mainsizer)
self.Show() self.Show()



def populate_left_panel(self): def populate_left_panel(self):
""" Populate the left panel """ """ Populate the left panel """
# Status boxes # Status boxes
@@ -341,8 +358,8 @@ class MainGUI(wx.Frame):


if __name__ == "__main__": if __name__ == "__main__":
initOSCClient(ip="127.0.0.1", port=9000) initOSCClient(ip="127.0.0.1", port=9000)
g=MainGUI()
#initOSCServer(ip="127.0.0.1", port=6649, mode=0)
#setOSCHandler("/vu", g.update_vu)
g = MainGUI()
# initOSCServer(ip="127.0.0.1", port=6649, mode=0)
# setOSCHandler("/vu", g.update_vu)
g.run() g.run()
closeOSC() closeOSC()

Loading…
Cancel
Save