From 5362ca41e24cdb92b449a9fb727cea243f8508a0 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Wed, 7 Jan 2015 11:55:09 +0000 Subject: [PATCH 1/6] Merge --- main.ck | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.ck b/main.ck index 8615755..b522fec 100644 --- a/main.ck +++ b/main.ck @@ -2,8 +2,8 @@ // Effects chain adc => Dyno limitIn => Gain adcThru => dac; // Monitor input through a mixer // Global effects break panning for some unknown reason -/*Dyno limitOut => JCRev rev => dac;*/ -/*Dyno limitOut => JCRev rev => dac;*/ +Dyno limitOut => PRCRev rev => dac; +.3 => rev.mix; limitIn.limit(); limitOut.limit(); SampleChan channels[4]; @@ -24,7 +24,7 @@ OscMsg msg; // Start the metronome 0 => int metronomeLevel; -//spork ~plip(); +//spork ~metronome(); //spork ~vu_meter(); // Event loop @@ -115,7 +115,7 @@ fun void vu_meter() // TODO timing here should be done using events -fun void plip() +fun void metronome() { SinOsc s => dac; 0.01::second => dur plipTime; From c10db5c91b912a6dfe6a1ec24e2e46de30f45ae9 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Wed, 7 Jan 2015 12:17:57 +0000 Subject: [PATCH 2/6] Various improvements. Master gain done --- main.ck | 21 ++++++++++++++------- main.py | 29 +++++++++++++++-------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/main.ck b/main.ck index 0833722..f43d901 100644 --- a/main.ck +++ b/main.ck @@ -1,16 +1,19 @@ // TODO: turn off adcThru when recording // TODO: Effects break panning for some unknown reason - -// Capture mic/line in and monitor through DAC. Limit -adc => Dyno inputLimiter => Gain adcThru => dac; // Monitor input -inputLimiter.limit(); -inputLimiter @=> UGen @ mainInput; +// TODO: currently I don't turn ADC thru back on after recording // Effects chain with limiters, reverb, filters -PRCRev reverb => LPF lpf => Dyno outputLimiter => dac; +NRev reverb => LPF lpf => Dyno outputLimiter => dac; outputLimiter.limit(); reverb @=> UGen @ outputWet; // Reference to wet output outputLimiter @=> UGen @ outputDry; // Reference to dry output +outputLimiter @=> UGen @ mainOutput; // Reference to main output + +// Capture mic/line in and monitor through DAC. Limit +adc => Dyno inputLimiter => Gain adcThru => mainOutput; // Monitor input +inputLimiter.limit(); +inputLimiter @=> UGen @ mainInput; + // Default parameters .5 => adcThru.gain; @@ -64,7 +67,10 @@ while (true) { } else if(msg.address=="/fx") { (100+msg.getFloat(0)*10000) => lpf.freq; - msg.getFloat(0) => reverb.mix; + msg.getFloat(1) => reverb.mix; + } + else if(msg.address=="/master") { + msg.getFloat(0) => mainOutput.gain; } } } @@ -99,6 +105,7 @@ public class LoopPedal } public void arm(int value) { + 0 => adcThru.gain; sample.playPos() => sample.recPos; value => sample.record; } diff --git a/main.py b/main.py index 371cd01..bf49d18 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,9 @@ from libs.simpleosc import * import wx +#TODO: standardize methods for adding/removing arrays of widgets +#TODO: fix the *100 / /100 stuff + def sendOSCSafe(channel, data): try: sendOSCMsg(channel, data) @@ -91,13 +94,13 @@ class DelayPanel(wx.Panel): sizer.Add(label, 0, wx.TOP|wx.BOTTOM|wx.RIGHT, 5) self.delayTime=OSCSlider(self, "Time", default_value=1, max_value=10, align=False) - sizer.Add(self.delayTime, 1, wx.EXPAND|wx.ALL, 5) + sizer.Add(self.delayTime, 1, wx.ALL, 5) self.feedback=OSCSlider(self, "Hold", default_value=.99, align=False) - sizer.Add(self.feedback, 1, wx.EXPAND|wx.ALL, 5) + sizer.Add(self.feedback, 1, wx.ALL, 5) - self.metronome=wx.ToggleButton(self, 0, "Click") - sizer.Add(self.metronome, 0, wx.EXPAND|wx.ALL, 5) + self.metronome=wx.ToggleButton(self, 0, "Metronome") + sizer.Add(self.metronome, 0) self.SetSizerAndFit(sizer) self.delayTime.Bind(wx.EVT_SCROLL, self.update) @@ -215,7 +218,7 @@ class FXPanel(wx.Panel): wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.HORIZONTAL) - label = wx.StaticText(self, label="Filter:") + 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) @@ -224,11 +227,11 @@ class FXPanel(wx.Panel): #sizer.Add(self.fxtype, 1, wx.ALL|wx.EXPAND, 5) #self.fxtype.SetValue(choices[0]) - self.lpf=OSCSlider(self, "Lowpass", default_value=0) + self.lpf=OSCSlider(self, "Lowpass", default_value=.5, align=False) sizer.Add(self.lpf, 2, wx.EXPAND|wx.ALL, 5) self.lpf.Bind(wx.EVT_SCROLL, self.update) - self.reverb=OSCSlider(self, "Reverb", default_value=0) + 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) @@ -253,18 +256,16 @@ class OutputPanel(wx.Panel): 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.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) - """ def update(self, evt): - a=self.delayTime.slider.GetValue()/100. - b=self.feedback.slider.GetValue()/100. - sendOSCSafe("/delay", [a, b]) - """ + a=self.level.slider.GetValue()/100. + sendOSCSafe("/master", [a]) class MainGUI(wx.Frame): From 1fb5a6613e13f24f05707d6174e71d5e31875d08 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Fri, 9 Jan 2015 17:14:52 +0000 Subject: [PATCH 3/6] FX --- main.ck | 6 ++++-- main.py | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/main.ck b/main.ck index f43d901..5c9ffa0 100644 --- a/main.ck +++ b/main.ck @@ -3,7 +3,7 @@ // TODO: currently I don't turn ADC thru back on after recording // Effects chain with limiters, reverb, filters -NRev reverb => LPF lpf => Dyno outputLimiter => dac; +NRev reverb => LPF lpf => HPF hpf => Dyno outputLimiter => dac; outputLimiter.limit(); reverb @=> UGen @ outputWet; // Reference to wet output outputLimiter @=> UGen @ outputDry; // Reference to dry output @@ -18,6 +18,7 @@ inputLimiter @=> UGen @ mainInput; // Default parameters .5 => adcThru.gain; 10000 => lpf.freq; +10 => hpf.freq; 1::second => dur loopTime; // Plug in the pedals @@ -67,7 +68,8 @@ while (true) { } else if(msg.address=="/fx") { (100+msg.getFloat(0)*10000) => lpf.freq; - msg.getFloat(1) => reverb.mix; + (100+msg.getFloat(1)*10000) => hpf.freq; + msg.getFloat(2) => reverb.mix; } else if(msg.address=="/master") { msg.getFloat(0) => mainOutput.gain; diff --git a/main.py b/main.py index bf49d18..1926e0a 100644 --- a/main.py +++ b/main.py @@ -227,10 +227,14 @@ class FXPanel(wx.Panel): #sizer.Add(self.fxtype, 1, wx.ALL|wx.EXPAND, 5) #self.fxtype.SetValue(choices[0]) - self.lpf=OSCSlider(self, "Lowpass", default_value=.5, align=False) + 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.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.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) @@ -240,8 +244,9 @@ class FXPanel(wx.Panel): 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,b]) + sendOSCSafe("/fx", [a,a2,b]) class OutputPanel(wx.Panel): ''' Handle the ADC input settings ''' From 9f517022ca6a437580ebf4bf49d77736a5e5b448 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Sat, 10 Jan 2015 15:13:37 +0000 Subject: [PATCH 4/6] Small changes --- main.ck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.ck b/main.ck index 5c9ffa0..3fb8747 100644 --- a/main.ck +++ b/main.ck @@ -45,7 +45,7 @@ while (true) { msg.getFloat(0)::second => loopTime; msg.getFloat(1) => float feedback; for( 0 => int i; i < pedals.cap(); i++ ) { - pedals[i].setLoopPoint(loopTime); + pedals[i].setLoopPoint(loopTime + (i*.1)::second); pedals[i].setFeedback(feedback); } } From 83bf40d039d7923b5ca3cdf7c832e02c25efa525 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Sat, 10 Jan 2015 15:26:38 +0000 Subject: [PATCH 5/6] Trying out autopep8 --- main.ck | 24 ------------------------ main.py | 24 +++++++++++++----------- 2 files changed, 13 insertions(+), 35 deletions(-) diff --git a/main.ck b/main.ck index 3fb8747..bba98dc 100644 --- a/main.ck +++ b/main.ck @@ -131,30 +131,6 @@ public class LoopPedal //spork ~plip(); //spork ~vu_meter(); -fun void vu_meter() -{ - // Analysis stuff - adc => FFT fft =^ RMS rms => blackhole; - 1<<12 => int fftsize; - fftsize => fft.size; - Windowing.hann(fftsize) => fft.window; - - // Comms - OscOut xmit; xmit.dest( "localhost", 6649 ); - - // Infinite loop: get RMS and send to GUI - while(true) - { - rms.upchuck() @=> UAnaBlob blob; - xmit.start("/vu"); - blob.fval(0) => xmit.add; - xmit.send(); - fft.size()::samp => now; - } -} - - - // TODO timing here should be done using events fun void metronome() { diff --git a/main.py b/main.py index 1926e0a..91e5847 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,3 @@ -from libs.simpleosc import * import wx #TODO: standardize methods for adding/removing arrays of widgets @@ -11,18 +10,25 @@ def sendOSCSafe(channel, data): print "OSC comms error" class OSCSlider(wx.Panel): - ''' A GUI slider ''' - def __init__(self, parent, label, min_value=0, max_value=1, default_value=0, align=True): - ''' Constructor ''' + """ A GUI slider """ + def __init__(self, parent, label, min_value=0, max_value=1, default_value=0, align=True, rescale=100.): + """ Constructor """ + self.rescale=rescale wx.Panel.__init__(self, parent) sizer=wx.BoxSizer(wx.HORIZONTAL) - label=wx.StaticText(self, label=label, size=(100,15) if align else None) + 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) + 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) + self.SetSizerAndFit(sizer) self.Bind=self.slider.Bind - self.GetValue=self.slider.GetValue + + def GetValue(self): + """ Make sure that we rescale """ + return self.slider.GetValue()/self.rescale class CommsPanel(wx.Panel): """ OSC comms """ @@ -283,10 +289,6 @@ class MainGUI(wx.Frame): def run(self): self.app.MainLoop() - def update_vu(self, a,b,c,d): - level=int(1000000*c[0]) - self.output.gauge.SetValue(level) - def build(self): """ Builds the various pieces of the GUI """ wx.Frame.__init__(self, None, title="DELAY LORD") From d720c9afeb098f22d64e056fbcbea816c043fa3d Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Sat, 10 Jan 2015 15:37:34 +0000 Subject: [PATCH 6/6] PEP8 --- main.py | 267 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 142 insertions(+), 125 deletions(-) diff --git a/main.py b/main.py index 91e5847..b27dd49 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,6 @@ 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): try: @@ -9,61 +8,73 @@ def sendOSCSafe(channel, data): except OSCClientError: print "OSC comms error" + class OSCSlider(wx.Panel): + """ A GUI slider """ + def __init__(self, parent, label, min_value=0, max_value=1, default_value=0, align=True, rescale=100.): """ Constructor """ - self.rescale=rescale + self.rescale = rescale 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) - 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) self.SetSizerAndFit(sizer) - self.Bind=self.slider.Bind + self.Bind = self.slider.Bind def GetValue(self): """ Make sure that we rescale """ - return self.slider.GetValue()/self.rescale + return self.slider.GetValue() / self.rescale + class CommsPanel(wx.Panel): + """ OSC comms """ + def __init__(self, parent): wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.HORIZONTAL) 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) 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) - self.port=wx.TextCtrl(self, value="9000") + self.port = wx.TextCtrl(self, value="9000") sizer.Add(self.port, 0, wx.ALL, 3) self.SetSizerAndFit(sizer) + class InputPanel(wx.Panel): - ''' Handle the ADC input settings ''' + + """ Handle the ADC input settings """ + def __init__(self, parent): - ''' Constructor ''' + """ Constructor """ wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.HORIZONTAL) 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) sizer.Add(self.gain, 1, wx.ALL, 5) @@ -71,10 +82,10 @@ class InputPanel(wx.Panel): sizer.Add(self.thru, 1, wx.ALL, 5) self.mute = wx.ToggleButton(self, 0, "Mute") - #self.mute.SetValue(1) + # self.mute.SetValue(1) sizer.Add(self.mute, 0) self.SetSizerAndFit(sizer) - + self.gain.Bind(wx.EVT_SCROLL, self.update) self.thru.Bind(wx.EVT_SCROLL, self.update) self.mute.Bind(wx.EVT_TOGGLEBUTTON, self.update) @@ -83,29 +94,35 @@ class InputPanel(wx.Panel): def update(self, evt=None): """ 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]) + class DelayPanel(wx.Panel): - ''' Handle the ADC input settings ''' + + """ Handle the ADC input settings """ + def __init__(self, parent): - ''' Constructor ''' + """ Constructor """ wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.HORIZONTAL) 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) - 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) - self.metronome=wx.ToggleButton(self, 0, "Metronome") + self.metronome = wx.ToggleButton(self, 0, "Metronome") sizer.Add(self.metronome, 0) self.SetSizerAndFit(sizer) @@ -116,57 +133,63 @@ class DelayPanel(wx.Panel): def update(self, evt): """ 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]) def switchMetronome(self, evt): """ Send OSC messages """ sendOSCSafe("/metronome", [int(self.metronome.GetValue())]) + class ButtonArray(wx.Panel): - ''' Handle the ADC input settings ''' + + """ Handle the ADC input settings """ + def __init__(self, parent, index): wx.Panel.__init__(self, parent) - w=40 + w = 40 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) - 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) - 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) - self.buttons=(self.record, self.mute, self.clear) + self.buttons = (self.record, self.mute, self.clear) self.SetSizerAndFit(sizer) + class Channel(wx.Panel): + """ A single channel """ + def __init__(self, parent, index): - self.index=index + self.index = index wx.Panel.__init__(self, parent) 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) - 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) - 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) - 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 - 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") - sizer.Add(self.speed, 0, wx.ALL|wx.EXPAND, 3) + sizer.Add(self.speed, 0, wx.ALL | wx.EXPAND, 3) self.SetSizerAndFit(sizer) @@ -177,27 +200,30 @@ class Channel(wx.Panel): self.update() 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]) class Mixer(wx.Panel): - ''' All the channels ''' + + """ All the channels """ + def __init__(self, parent): - ''' Constructor ''' + """ Constructor """ wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.HORIZONTAL) - self.channels=[] + self.channels = [] 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.index=i + c.record.index = i c.clear.Bind(wx.EVT_BUTTON, self.clear_channel) - c.clear.index=i + c.clear.index = i self.channels.append(c) sizer.Add(c, 1, wx.EXPAND) @@ -217,77 +243,90 @@ class Mixer(wx.Panel): index = evt.GetEventObject().index sendOSCSafe("/clear", [index]) + class FXPanel(wx.Panel): - ''' Effects chain ''' + + """ Effects chain """ + def __init__(self, parent): - ''' Constructor ''' + """ Constructor """ wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.HORIZONTAL) 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.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.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.SetSizerAndFit(sizer) self.update(None) 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): - ''' Handle the ADC input settings ''' + + """ Handle the ADC input settings """ + def __init__(self, parent): - ''' Constructor ''' + """ Constructor """ wx.Panel.__init__(self, parent) sizer = wx.BoxSizer(wx.HORIZONTAL) 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.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) def update(self, evt): - a=self.level.slider.GetValue()/100. + a = self.level.slider.GetValue() sendOSCSafe("/master", [a]) 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() - def run(self): self.app.MainLoop() + def run(self): + self.app.MainLoop() def build(self): """ Builds the various pieces of the GUI """ @@ -296,40 +335,18 @@ class MainGUI(wx.Frame): # The main sizer 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.Show() - def populate_left_panel(self): """ Populate the left panel """ # Status boxes @@ -341,8 +358,8 @@ class MainGUI(wx.Frame): if __name__ == "__main__": 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() closeOSC()