Exemple #1
0
    def __init__(self, editor):
        frame = editor.create_tab(self.NAME,self.TAB_FILE)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame,735,510,self.IMAGE_FILE)
        canvas.pack()
        TkSubEditor.__init__(self, canvas, editor, self.NAME)
        editor.add_child_editor(self.NAME, self)

        def linear_slider(param, range_, x, y):
            s = cf.linear_slider(canvas,param,editor,range_=range_)
            self.add_control(param,s)
            s.widget().place(x=x,y=y)

        def norm_slider(param,x,y):
            s = cf.normalized_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y)

        def eq_slider(param,x,y):
            s = cf.third_octave_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y)

        def amp_slider(param,x,y):
            s = cf.volume_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y)

        def pan_slider(param,x,y):
            s = cf.bipolar_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y)

        y0 = 50
        x0 = 75
        x1 = x0 + 60
        x2 = x1 + 60
        x3 = x2 + 60
        xeq = x3 + 75
        xlp = xeq
        xhp = xlp+60
        xdry = xhp+75
        xwet = xdry+120
        
        linear_slider("preDelay",(0.0,0.333),x0,y0)
        norm_slider("roomSize",x1,y0)
        norm_slider("damp",x2,y0)
        norm_slider("modDepth",x3,y0)
        eq_slider("lpcutoff",xlp,y0)
        eq_slider("hpcutoff",xhp,y0)
        amp_slider("dryAmp", xdry,y0)
        pan_slider("dryPan", xdry+60,y0)
        amp_slider("wetAmp", xwet,y0)
        pan_slider("wetPan", xwet+60,y0)
        
        msb_gate = ToggleButton(canvas,"gatted",editor,)
        self.add_control("gatted", msb_gate)
        msb_gate.layout((x0+157,y0+200))
        msb_gate.update_aspect()
Exemple #2
0
 def _init_gate_button(self):
     msb = ToggleButton(self.canvas, self.params['gate-mode'],
                        self.parent,
                        text=["Gate", "Trig"],
                        values=[0,1])
     x, y = self.xi0, self.y1-50
     msb.layout((x,y))
     msb.update_aspect()
     self.msb_gate_mode = msb
Exemple #3
0
 def msb_enable(self,param,x,y):
     msb = ToggleButton(self.canvas,param,self.editor,
                        text = ["Off","On"],
                        fill=acon.CFILL,
                        foreground=acon.CFOREGROUND,
                        outline=acon.COUTLINE)
     self.add_control(param,msb)
     msb.layout((x,y))
     msb.update_aspect()
     return msb
Exemple #4
0
    def __init__(self,canvas,param,editor,
                 sign=False,digits=4,scale=1.0,
                 range_ = None,
                 fill = 'black',
                 foreground = 'white',
                 outline = 'white',
                 active_color = 'yellow',
                 font = ('Times',10)):
        '''
        Tumbler combines several MSB buttons into a single compost control
        for numeric values.
        '''
        self.canvas = canvas
        self.param=param
        self.editor = editor
        #self._range = range_ or (0,10**digits-1)
        if not range_:
            mag = 10**digits-1
            if sign:
                range_ = (-mag,mag)
            else:
                range_ = (0,mag)
        self._range = range_
        self._common_aspect = {"fill" : fill,
                               "foreground" : foreground,
                               "outline" : outline,
                               "active-fill" : fill,
                               "active-foreground" : active_color,
                               "active-outline" : active_color,
                               "font" : font}
        self.scale = float(scale)
        self.has_sign = sign
        self._msb_sign = ToggleButton(canvas,"",None,
                                      text=["-","+"],
                                      values=[-1,1])
        self._msb_sign.tag_bind("<Button-1>", self._callback)
        self._msb_sign.tag_bind("<Button-3>", self._callback)

      
        acc = []
        for i in range(digits):
            msb = MSB.digit_msb(canvas,"",None,
                                font = self._common_aspect['font'],
                                fill = self._common_aspect['fill'],
                                foreground = self._common_aspect['foreground'],
                                outline = self._common_aspect['outline'],
                                active_fill = self._common_aspect['fill'],
                                active_foreground = self._common_aspect['active-foreground'],
                                active_outline = self._common_aspect['active-outline'])
            msb.tag_bind("<Button-1>", self._callback)
            msb.tag_bind("<Button-3>", self._callback)
            msb.weight = (10**i)
            acc.append(msb)
        acc.reverse()
        self._digits = acc
Exemple #5
0
 def toggle(param,x,y):
     b = ToggleButton(canvas,param,editor,
                      fill=cfill,
                      foreground=cforeground,
                      outline=cforeground,
                      selected_fill = cfill,
                      selected_foreground = cselected)
     self.add_control(param,b)
     b.layout((x,y))
     b.update_aspect()
     return b
Exemple #6
0
    def __init__(self, editor):
        frame = editor.create_tab(self.NAME, self.TAB_FILE)
        frame.config(background=factory.bg())
        canvas=factory.canvas(frame,696,361,self.IMAGE_FILE)
        canvas.pack()
        TkSubEditor.__init__(self, canvas, editor, self.NAME)
        editor.add_child_editor(self.NAME, self)

        y0 = 75
        x0 = 100
        xmix = x0 + 150
        xsaw = xmix
        xnoise = xsaw+64
        xexternal = xnoise + 60
        xlag = xexternal+90
        
        def tumbler(param,x,y):
            t = Tumbler(canvas,param,editor,digits=5,scale=0.001,
                        outline='#a5a08a',
                        foreground='#a5a08a',
                        fill='black')
            self.add_control(param,t)
            t.layout((x,y))
            return y

        def norm(param,x):
            s = cf.normalized_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y0)
            return s

        def linear_slider(param,x,range_):
            s = cf.linear_slider(canvas,param,editor,range_=range_)
            self.add_control(param,s)
            s.widget().place(x=x,y=y0)
        
        tumbler("clockRate",x0,y0)
        tumbler("sawFreq",xsaw-30,y0+160)

        tog = ToggleButton(canvas,"clockSource",editor,
                           text=["Internal","External"],
                           fill='black',foreground='#007d47',
                           selected_fill='black',selected_foreground='#007d47')
        self.add_control("clockSource", tog)
        tog.layout((x0+8,y0+36))
        tog.update_aspect()
        norm("sawMix",xsaw)
        norm("noiseMix",xnoise)
        norm("externalMix",xexternal)
        norm("lag",xlag)
        norm("scale",xlag+60)
        linear_slider("bias",xlag+120,(-4,4))
Exemple #7
0
    def __init__(self, editor):
        frame = editor.create_tab(self.NAME, self.TAB_FILE)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame, 696, 361, self.IMAGE_FILE)
        canvas.pack()
        TkSubEditor.__init__(self, canvas, editor, self.NAME)
        editor.add_child_editor(self.NAME, self)

        y0 = 75
        x0 = 100
        xmix = x0 + 150
        xsaw = xmix
        xnoise = xsaw + 64
        xexternal = xnoise + 60
        xlag = xexternal + 90

        def tumbler(param, x, y):
            t = Tumbler(canvas,
                        param,
                        editor,
                        digits=5,
                        scale=0.001,
                        outline='#a5a08a',
                        foreground='#a5a08a',
                        fill='black')
            self.add_control(param, t)
            t.layout((x, y))
            return y

        def norm(param, x):
            s = cf.normalized_slider(canvas, param, editor)
            self.add_control(param, s)
            s.widget().place(x=x, y=y0)
            return s

        def linear_slider(param, x, range_):
            s = cf.linear_slider(canvas, param, editor, range_=range_)
            self.add_control(param, s)
            s.widget().place(x=x, y=y0)

        tumbler("clockRate", x0, y0)
        tumbler("sawFreq", xsaw - 30, y0 + 160)

        tog = ToggleButton(canvas,
                           "clockSource",
                           editor,
                           text=["Internal", "External"],
                           fill='black',
                           foreground='#007d47',
                           selected_fill='black',
                           selected_foreground='#007d47')
        self.add_control("clockSource", tog)
        tog.layout((x0 + 8, y0 + 36))
        tog.update_aspect()
        norm("sawMix", xsaw)
        norm("noiseMix", xnoise)
        norm("externalMix", xexternal)
        norm("lag", xlag)
        norm("scale", xlag + 60)
        linear_slider("bias", xlag + 120, (-4, 4))
Exemple #8
0
    def __init__(self, editor):
        frame = editor.create_tab(self.NAME, self.TAB_FILE)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame, 1000, 700, self.IMAGE_FILE)
        canvas.pack()
        self.canvas = canvas
        self.editor = editor
        TkSubEditor.__init__(self, canvas, editor, self.NAME)
        editor.add_child_editor(self.NAME, self)

        w = 900
        h = 300
        
        y0 = 50
        x0 = 50
        xmsb = w/2
        ymsb = h-50
        
        for i,prefix in enumerate("ab"):
            x = x0
            y = y0 + i*(300+25)
            paramlist = []
            for s in ("Attack","Decay1","Decay2","Release","Breakpoint",
                      "Sustain","Envmode"):
                paramlist.append("%s%s" % (prefix,s))
            env = ADDSREditor(canvas,i,(x,y),(w,h),paramlist,editor,12)
            self.add_child_editor("ENV%s" % prefix, env)
            env.sync()
            param = "%sInvert" % prefix
            msb = ToggleButton(canvas,param,editor,["+Pos","-Inv"])
            self.add_control(param,msb)
            msb.layout((x+xmsb,y+ymsb))
            msb.update_aspect()
Exemple #9
0
    def __init__(self, editor):
        frame = editor.create_tab(self.NAME, self.TAB_FILE)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame, 1000, 700, self.IMAGE_FILE)
        canvas.pack()
        self.canvas = canvas
        self.editor = editor
        TkSubEditor.__init__(self, canvas, editor, self.NAME)
        editor.add_child_editor(self.NAME, self)
        y0 = 75
        yfreq = y0
        ygain = yfreq + 50
        yq = ygain + 180
        y_enable = yq + 180
        x0 = 75
        x_shelf = x0

        def tumbler(param, x, y=yfreq):
            t = Tumbler(canvas, param, editor, digits=5, scale=1)
            self.add_control(param, t)
            t.layout((x, y))
            return t

        def q_slider(param, x, y=yq):
            s = cf.linear_slider(canvas, param, editor, range_=(1.0, 0.0))
            self.add_control(param, s)
            s.widget().place(x=x, y=y)
            return s

        def gain_slider(param, x, y=ygain):
            s = cf.linear_slider(canvas, param, editor, range_=(-36, 36))
            self.add_control(param, s)
            s.widget().place(x=x, y=y)
            return s

        tumbler("hp", x_shelf, y=y0)
        tumbler("lp", x_shelf, y=y0 + 60)
        for i in (1, 2, 3, 4):
            x = x_shelf + i * 100
            tumbler("f%d" % i, x + 6)
            gain_slider("gain%d" % i, x + 37)
            q_slider("q%d" % i, x + 37)
            p_enable = "enable%d" % i
            m_enable = ToggleButton(canvas,
                                    p_enable,
                                    editor,
                                    text=("Mute", "On"))
            self.add_control(p_enable, m_enable)
            m_enable.layout((x + 14, y_enable))
            m_enable.update_aspect()
        x_bleed = x + 150
        s = cf.normalized_slider(canvas, "bleed", editor)
        self.add_control("bleed", s)
        s.widget().place(x=x_bleed, y=ygain, height=150)
        x_amp = x_bleed + 60
        gs = cf.linear_slider(canvas, "amp", editor, range_=(-12, 12))
        self.add_control("amp", gs)
        gs.widget().place(x=x_amp, y=ygain)
Exemple #10
0
 def _init_gate_button(self):
     msb = ToggleButton(self.canvas,
                        self.params['gate-mode'],
                        self.parent,
                        text=["Gate", "Trig"],
                        values=[0, 1])
     x, y = self.xi0, self.y1 - 50
     msb.layout((x, y))
     msb.update_aspect()
     self.msb_gate_mode = msb
Exemple #11
0
 def msb_enable(self, param, x, y):
     msb = ToggleButton(self.canvas,
                        param,
                        self.editor,
                        text=["Off", "On"],
                        fill=acon.CFILL,
                        foreground=acon.CFOREGROUND,
                        outline=acon.COUTLINE)
     self.add_control(param, msb)
     msb.layout((x, y))
     msb.update_aspect()
     return msb
Exemple #12
0
 def toggle(param, x, y):
     b = ToggleButton(canvas,
                      param,
                      editor,
                      fill=cfill,
                      foreground=cforeground,
                      outline=cforeground,
                      selected_fill=cfill,
                      selected_foreground=cselected)
     self.add_control(param, b)
     b.layout((x, y))
     b.update_aspect()
     return b
Exemple #13
0
    def __init__(self, editor):
        frame = editor.create_tab(self.NAME, self.TAB_FILE)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame, 735, 510, self.IMAGE_FILE)
        canvas.pack()
        TkSubEditor.__init__(self, canvas, editor, self.NAME)
        editor.add_child_editor(self.NAME, self)

        def linear_slider(param, range_, x, y):
            s = cf.linear_slider(canvas, param, editor, range_=range_)
            self.add_control(param, s)
            s.widget().place(x=x, y=y)

        def norm_slider(param, x, y):
            s = cf.normalized_slider(canvas, param, editor)
            self.add_control(param, s)
            s.widget().place(x=x, y=y)

        def eq_slider(param, x, y):
            s = cf.third_octave_slider(canvas, param, editor)
            self.add_control(param, s)
            s.widget().place(x=x, y=y)

        def amp_slider(param, x, y):
            s = cf.volume_slider(canvas, param, editor)
            self.add_control(param, s)
            s.widget().place(x=x, y=y)

        def pan_slider(param, x, y):
            s = cf.bipolar_slider(canvas, param, editor)
            self.add_control(param, s)
            s.widget().place(x=x, y=y)

        y0 = 50
        x0 = 75
        x1 = x0 + 60
        x2 = x1 + 60
        x3 = x2 + 60
        xeq = x3 + 75
        xlp = xeq
        xhp = xlp + 60
        xdry = xhp + 75
        xwet = xdry + 120

        linear_slider("preDelay", (0.0, 0.333), x0, y0)
        norm_slider("roomSize", x1, y0)
        norm_slider("damp", x2, y0)
        norm_slider("modDepth", x3, y0)
        eq_slider("lpcutoff", xlp, y0)
        eq_slider("hpcutoff", xhp, y0)
        amp_slider("dryAmp", xdry, y0)
        pan_slider("dryPan", xdry + 60, y0)
        amp_slider("wetAmp", xwet, y0)
        pan_slider("wetPan", xwet + 60, y0)

        msb_gate = ToggleButton(
            canvas,
            "gatted",
            editor,
        )
        self.add_control("gatted", msb_gate)
        msb_gate.layout((x0 + 157, y0 + 200))
        msb_gate.update_aspect()
Exemple #14
0
    def __init__(self, n, editor):
        name = "OP%d" % n
        image_file = "resources/Corvus/editor_%d.png" % n
        tab_file =   "resources/Corvus/tab_%d.png" % n
        frame = editor.create_tab(name,tab_file)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame, 1053, 663, image_file)
        canvas.pack()
        self.canvas = canvas
        self.editor = editor
        TkSubEditor.__init__(self, canvas, editor, name)
        editor.add_child_editor(name, self)
        self.op = n
        
        y0 = 50
        y_carrier = y0
        y_mod = y_carrier
        y_env = y0 + 250
        
        x0 = 50
        x_fm = x0
        x_mod_lfo1 = x_fm + 100
        x_mod_lfo2 = x_mod_lfo1 + 60
        x_mod_external = x_mod_lfo2 + 60
        x_mod_keyscale = x_mod_lfo2 + 100
        x_mod_amp = x_mod_keyscale + 87

        x_carrier = x_mod_amp + 100
        x_ratio = x_carrier
        x_velocity = x_ratio+120
        x_lfo1 = x_velocity+60
        x_lfo2 = x_lfo1+60
        x_external = x_lfo2+60
        x_keyscale = x_external + 60
        x_enable = x_keyscale + 90

        x_env = x0-22
       
        
        
        def norm_slider(param,x,y,height=150):
            s = cf.normalized_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y,height=height)
            return s

        def volume_slider(param,x,y,height=150):
            s = cf.volume_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y,height=height)
            return s

        def linear_slider(param,range_,x,y):
            s = cf.linear_slider(canvas,param,editor,range_=range_)
            self.add_control(param,s)
            s.widget().place(x=x,y=y)
            return s
        
        def tumbler(param,digits,scale,x,y):
            t = Tumbler(canvas,param,editor,digits=digits,scale=scale)
            self.add_control(param,t)
            t.layout((x,y))
            t.update_aspect()
            return t

        def msb_keyscale(param,x,y):
            count = len(KEYSCALES)
            msb = MSB(canvas,param,editor,count)
            for i,s in enumerate(KEYSCALES):
                d = {"fill" : CFILL,
                     "foreground" : CFOREGROUND,
                     "outline" : COUTLINE,
                     "value" : s,
                     "text" : "%+d" % s}
                msb.define_aspect(i,s,d)
            self.add_control(param,msb)
            msb.layout((x,y))
            msb.update_aspect()
            return msb

        def msb_keybreak(param,x,y):
            count = len(KEYBREAK)
            msb = MSB(canvas,param,editor,count)
            for i,s in enumerate(KEYBREAK):
                d = {"fill" : CFILL,
                     "foreground" : CFOREGROUND,
                     "outline" : COUTLINE,
                     "value" : s,
                     "text" : "%d" % s}
                msb.define_aspect(i,s,d)
            self.add_control(param,msb)
            msb.layout((x,y))
            msb.update_aspect()
            return msb

        def msb_modscale(param,x,y):
            count = len(MODSCALES)
            msb = MSB(canvas,param,editor,count)
            for i in MODSCALES:
                j = i+1
                value = 10**i
                d = {"fill" : CFILL,
                     "foreground" : CFOREGROUND,
                     "outline" : COUTLINE,
                     "value" : value,
                     "text" : "x%d" % j}
                msb.define_aspect(i,value,d)
            self.add_control(param,msb)
            msb.layout((x,y))
            msb.update_aspect()
      

        tumbler("fm%d_ratio" % n,5,0.001,x_fm,y_mod)
        norm_slider("fm%d_lfo1" % n,x_mod_lfo1,y_mod)
        norm_slider("fm%d_lfo2" % n,x_mod_lfo2,y_mod)
        norm_slider("fm%d_external" % n, x_mod_external, y_mod)
        msb_keyscale("fm%d_left" % n, x_mod_keyscale, y_mod)
        msb_keyscale("fm%d_right" % n, x_mod_keyscale, y_mod+70)
        msb_modscale("fm%d_modscale" % n, x_mod_amp, y_mod)
        norm_slider("fm%d_moddepth" % n, x_mod_amp+24, y_mod+50, height=100)
        norm_slider("fm%d_lag" % n, x_fm+30,y_mod+75,height=75)

        tumbler("op%d_ratio" % n,5,0.001,x_ratio+8,y_carrier)
        tumbler("op%d_bias" % n,6,0.001,x_ratio,y_carrier+75)
        norm_slider("op%d_velocity" % n,x_velocity,y0)
        norm_slider("op%d_lfo1" % n,x_lfo1,y0)
        norm_slider("op%d_lfo2" % n,x_lfo2,y0)
        norm_slider("op%d_external" % n,x_external,y0)
        
        
        msb_keyscale("op%d_left" % n, x_keyscale,y0)
        msb_keyscale("op%d_right" % n, x_keyscale,y0+70)
        msb_keybreak("op%d_key" % n, x_keyscale,y0+140)
        
        penable = "op%d_enable" % n
        msb_enable = ToggleButton(canvas,penable, editor,
                                  fill = CFILL,
                                  foreground = CFOREGROUND,
                                  outline = COUTLINE,
                                  text = ["Off","Enabled"])
        self.add_control(penable,msb_enable)
        msb_enable.layout((x_enable, y0))
        msb_enable.update_aspect()
        volume_slider("op%d_amp" % n,x_enable+24,y0+50,height=100)

        env_parameters = []
        for s in ("attack","decay1","decay2","release",
                  "breakpoint","sustain","env_mode"):
            p = "op%d_%s" % (n,s)
            env_parameters.append(p)
        enved = ADDSREditor(canvas,n,(x_env,y_env),
                            (800,350),
                            env_parameters,
                            editor,
                            MAX_ENV_SEGMENT)
        self.add_child_editor("OP%dENV" % n, enved)
        enved.sync()

        y_extra = y_env+30
        x_extra = x0 + 800

        if n==3:
            # Add exgtra noise controls
            count = len(NOISE_BANDWIDTHS)
            msb = MSB(canvas,"nse3_bw",editor,count)
            for i,v in enumerate(NOISE_BANDWIDTHS):
                d = {"fill" : CFILL,
                     "foreground" : CFOREGROUND,
                     "outline" : COUTLINE,
                     "value" : v,
                     "text" : str(v)}
                msb.define_aspect(i,v,d)
            self.add_control("nse3_bw",msb)
            msb.layout((x_extra,y_extra))
            msb.update_aspect()
            norm_slider("nse3_mix",x_extra+24, y_extra+75)
        if n==4:
            # Add buzz controls
            x_n = x_extra+16
            x_env = x_n+60
            x_lfo = x_env+60
            x_lag = x_env
            x_mix = x_lag+60
            linear_slider("bzz4_n",(1,128),x_n,y_extra)
            linear_slider("bzz4_env",(-128,128),x_env,y_extra)
            linear_slider("bzz4_lfo2",(0,128),x_lfo,y_extra)
            norm_slider("bzz4_lag",x_lag,y_extra+200, height=100)
            norm_slider("bzz4_mix",x_mix,y_extra+200, height=100)
Exemple #15
0
    def __init__(self, editor):
        frame = editor.create_tab(self.NAME,self.TAB_FILE)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame, 1000, 700, self.IMAGE_FILE)
        canvas.pack()
        self.canvas = canvas
        self.editor = editor
        TkSubEditor.__init__(self, canvas, editor, self.NAME)
        editor.add_child_editor(self.NAME, self)

        cfill = "black"
        cforeground="#c79fa1"
        coutline="blue"
        csfill = "#005c56"
        csforeground = "white"
        
        y0 = 0
        ysliders = y0+192
        ywave = y0+128
        yclock = ywave
        yfilter = yclock
        yrsenable = y0+200
        
        x0 = 75
        xgain = x0+60
        xwave = x0+143
        xclock = xwave+100
        xfilter = xclock+100
        xefx = xgain+395
        xdry = xgain+455

        def volume_slider(param,x,y):
            s = cf.volume_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y)
            return s

        def linear_slider(param,range_,x,y):
            s = cf.linear_slider(canvas,param,editor,range_=range_)
            self.add_control(param,s)
            s.widget().place(x=x,y=y)
            return s

        linear_slider("gain",(0,8),xgain,ysliders)
        
        msb_wave = MSB(canvas,"wave",editor, 5)
        for i,tx in enumerate(("Off","Soft","Clip","Fold","Wrap")):
            d = {"fill" : cfill,
                 "foreground" : cforeground,
                 "outline" : coutline,
                 "value" : i,
                 "text" : tx}
            msb_wave.define_aspect(i,i,d)
        msb_wave.layout((xwave,ywave))
        msb_wave.update_aspect()

        msb_clock = MSB(canvas,"clockFreq",editor,len(CLOCK_FREQS))
        for i,freq in enumerate(CLOCK_FREQS):
            ad = {"fill" : cfill,
                  "foreground" : cforeground,
                  "outline" : coutline,
                  "text" : str(freq),
                  "value" : freq}
            msb_clock.define_aspect(i,freq,ad)
        self.add_control("clockFreq",msb_clock)
        msb_clock.layout((xclock,yclock))
        msb_clock.update_aspect()

        msb_filter = MSB(canvas,"low",editor, len(LP_FREQS))
        for i,freq in enumerate(LP_FREQS):
            ad = {"fill" : cfill,
                  "foreground" : cforeground,
                  "outline" : coutline,
                  "text" : str(freq),
                  "value" : freq}
            msb_filter.define_aspect(i,freq,ad)
        self.add_control("low",msb_filter)
        msb_filter.layout((xfilter,yfilter))
        msb_filter.update_aspect()

        volume_slider("wet",xefx,ysliders)
        volume_slider("dry",xdry,ysliders)

        tog_rs_enable = ToggleButton(canvas,"resampleEnable",editor,
                                     fill = cfill,
                                     foreground = cforeground,
                                     outline = coutline,
                                     selected_fill = csfill,
                                     selected_foreground = csforeground,
                                     text = ["Off","On"],
                                     values = [0,1])
        self.add_control("resampleEnable", tog_rs_enable)
        tog_rs_enable.layout((xclock,yrsenable))
        tog_rs_enable.update_aspect()
Exemple #16
0
class Tumbler(object):

    
    def __init__(self,canvas,param,editor,
                 sign=False,digits=4,scale=1.0,
                 range_ = None,
                 fill = 'black',
                 foreground = 'white',
                 outline = 'white',
                 active_color = 'yellow',
                 font = ('Times',10)):
        '''
        Tumbler combines several MSB buttons into a single compost control
        for numeric values.
        '''
        self.canvas = canvas
        self.param=param
        self.editor = editor
        #self._range = range_ or (0,10**digits-1)
        if not range_:
            mag = 10**digits-1
            if sign:
                range_ = (-mag,mag)
            else:
                range_ = (0,mag)
        self._range = range_
        self._common_aspect = {"fill" : fill,
                               "foreground" : foreground,
                               "outline" : outline,
                               "active-fill" : fill,
                               "active-foreground" : active_color,
                               "active-outline" : active_color,
                               "font" : font}
        self.scale = float(scale)
        self.has_sign = sign
        self._msb_sign = ToggleButton(canvas,"",None,
                                      text=["-","+"],
                                      values=[-1,1])
        self._msb_sign.tag_bind("<Button-1>", self._callback)
        self._msb_sign.tag_bind("<Button-3>", self._callback)

      
        acc = []
        for i in range(digits):
            msb = MSB.digit_msb(canvas,"",None,
                                font = self._common_aspect['font'],
                                fill = self._common_aspect['fill'],
                                foreground = self._common_aspect['foreground'],
                                outline = self._common_aspect['outline'],
                                active_fill = self._common_aspect['fill'],
                                active_foreground = self._common_aspect['active-foreground'],
                                active_outline = self._common_aspect['active-outline'])
            msb.tag_bind("<Button-1>", self._callback)
            msb.tag_bind("<Button-3>", self._callback)
            msb.weight = (10**i)
            acc.append(msb)
        acc.reverse()
        self._digits = acc
        
        

    def widget(self, key=None):
        msg = "Tumbler does not implement widget method"
        raise NotImplementedError(msg)

    def widget_keys(self):
        return []

    def has_widget(self, key):
        return False

    def _get_value(self):
        acc = 0
        for b in self._digits:
            w = b.weight
            digit = b.value()
            acc += digit*w
        acc *= self._msb_sign.value()
        mn,mx = self._range
        acc = min(max(acc,mn),mx)
        return acc*self.scale

    def _set_value(self, v):
        mn,mx = self._range
        v = int(v/self.scale)
        v = min(max(v,mn),mx)
        if v < 0:
            s = -1
        else:
            s = 1
        v = abs(v)
        dcount = len(self._digits)
        for i in range(dcount):
            j = dcount-i-1
            b = self._digits[j]
            lsd = int(v % 10)
            b.value(lsd)
            v /= 10
        self._msb_sign.value(s)
        self._update_synths()

    def _callback(self, *_):
        mn,mx = self._range
        v = min(max(self._get_value(),mn),mx)
        self._set_value(v)
        
    def _update_synths(self, *_):
        if self.editor:
            v = self._get_value()
            synth = self.editor.synth
            synth.x_param_change(self.param,v)
            program = synth.bank()[None]
            program[self.param] = v
            msg = '[%s] -> %s' % (self.param, v)
            self.editor.status(msg)
        
    def update_aspect(self):
        for b in self._digits:
            b.update_aspect()
        self._msb_sign.update_aspect()

    # No range test, no scaling
    def aspect(self, new_aspect=None):
        if new_aspect is not None:
            a = new_aspect
            if a < 0:
                s = -1
                a = abs(a)
            else:
                s = 1
            for b in self._digits:
                lsd = int(a % 10)
                b.value(lsd)
            self._msb_sign.value(s)
        acc = 0
        s = self._msb_sign.value()
        for b in self._digits:
            w = b.weight
            acc += w*b.value()
        return int(acc*s)

    def value(self, new_value=None):
        if new_value is not None:
            self._set_value(new_value)
            self.update_aspect()
        return self._get_value()
    
    def layout(self, offset=(0,0),bwidth=15,height=20):
        x,y= offset
        if self.has_sign:
            self._msb_sign.layout((x,y),width=bwidth,height=height)
            x += bwidth
            self._msb_sign.update_aspect()
        for b in self._digits:
            b.layout((x,y),width=bwidth,height=height)
            x += bwidth
            b.update_aspect()
Exemple #17
0
    def __init__(self, n, editor):
        name = "OP%d" % n
        image_file = "resources/Corvus/editor_%d.png" % n
        tab_file = "resources/Corvus/tab_%d.png" % n
        frame = editor.create_tab(name, tab_file)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame, 1053, 663, image_file)
        canvas.pack()
        self.canvas = canvas
        self.editor = editor
        TkSubEditor.__init__(self, canvas, editor, name)
        editor.add_child_editor(name, self)
        self.op = n

        y0 = 50
        y_carrier = y0
        y_mod = y_carrier
        y_env = y0 + 250

        x0 = 50
        x_fm = x0
        x_mod_lfo1 = x_fm + 100
        x_mod_lfo2 = x_mod_lfo1 + 60
        x_mod_external = x_mod_lfo2 + 60
        x_mod_keyscale = x_mod_lfo2 + 100
        x_mod_amp = x_mod_keyscale + 87

        x_carrier = x_mod_amp + 100
        x_ratio = x_carrier
        x_velocity = x_ratio + 120
        x_lfo1 = x_velocity + 60
        x_lfo2 = x_lfo1 + 60
        x_external = x_lfo2 + 60
        x_keyscale = x_external + 60
        x_enable = x_keyscale + 90

        x_env = x0 - 22

        def norm_slider(param, x, y, height=150):
            s = cf.normalized_slider(canvas, param, editor)
            self.add_control(param, s)
            s.widget().place(x=x, y=y, height=height)
            return s

        def volume_slider(param, x, y, height=150):
            s = cf.volume_slider(canvas, param, editor)
            self.add_control(param, s)
            s.widget().place(x=x, y=y, height=height)
            return s

        def linear_slider(param, range_, x, y):
            s = cf.linear_slider(canvas, param, editor, range_=range_)
            self.add_control(param, s)
            s.widget().place(x=x, y=y)
            return s

        def tumbler(param, digits, scale, x, y):
            t = Tumbler(canvas, param, editor, digits=digits, scale=scale)
            self.add_control(param, t)
            t.layout((x, y))
            t.update_aspect()
            return t

        def msb_keyscale(param, x, y):
            count = len(KEYSCALES)
            msb = MSB(canvas, param, editor, count)
            for i, s in enumerate(KEYSCALES):
                d = {
                    "fill": CFILL,
                    "foreground": CFOREGROUND,
                    "outline": COUTLINE,
                    "value": s,
                    "text": "%+d" % s
                }
                msb.define_aspect(i, s, d)
            self.add_control(param, msb)
            msb.layout((x, y))
            msb.update_aspect()
            return msb

        def msb_keybreak(param, x, y):
            count = len(KEYBREAK)
            msb = MSB(canvas, param, editor, count)
            for i, s in enumerate(KEYBREAK):
                d = {
                    "fill": CFILL,
                    "foreground": CFOREGROUND,
                    "outline": COUTLINE,
                    "value": s,
                    "text": "%d" % s
                }
                msb.define_aspect(i, s, d)
            self.add_control(param, msb)
            msb.layout((x, y))
            msb.update_aspect()
            return msb

        def msb_modscale(param, x, y):
            count = len(MODSCALES)
            msb = MSB(canvas, param, editor, count)
            for i in MODSCALES:
                j = i + 1
                value = 10**i
                d = {
                    "fill": CFILL,
                    "foreground": CFOREGROUND,
                    "outline": COUTLINE,
                    "value": value,
                    "text": "x%d" % j
                }
                msb.define_aspect(i, value, d)
            self.add_control(param, msb)
            msb.layout((x, y))
            msb.update_aspect()

        tumbler("fm%d_ratio" % n, 5, 0.001, x_fm, y_mod)
        norm_slider("fm%d_lfo1" % n, x_mod_lfo1, y_mod)
        norm_slider("fm%d_lfo2" % n, x_mod_lfo2, y_mod)
        norm_slider("fm%d_external" % n, x_mod_external, y_mod)
        msb_keyscale("fm%d_left" % n, x_mod_keyscale, y_mod)
        msb_keyscale("fm%d_right" % n, x_mod_keyscale, y_mod + 70)
        msb_modscale("fm%d_modscale" % n, x_mod_amp, y_mod)
        norm_slider("fm%d_moddepth" % n,
                    x_mod_amp + 24,
                    y_mod + 50,
                    height=100)
        norm_slider("fm%d_lag" % n, x_fm + 30, y_mod + 75, height=75)

        tumbler("op%d_ratio" % n, 5, 0.001, x_ratio + 8, y_carrier)
        tumbler("op%d_bias" % n, 6, 0.001, x_ratio, y_carrier + 75)
        norm_slider("op%d_velocity" % n, x_velocity, y0)
        norm_slider("op%d_lfo1" % n, x_lfo1, y0)
        norm_slider("op%d_lfo2" % n, x_lfo2, y0)
        norm_slider("op%d_external" % n, x_external, y0)

        msb_keyscale("op%d_left" % n, x_keyscale, y0)
        msb_keyscale("op%d_right" % n, x_keyscale, y0 + 70)
        msb_keybreak("op%d_key" % n, x_keyscale, y0 + 140)

        penable = "op%d_enable" % n
        msb_enable = ToggleButton(canvas,
                                  penable,
                                  editor,
                                  fill=CFILL,
                                  foreground=CFOREGROUND,
                                  outline=COUTLINE,
                                  text=["Off", "Enabled"])
        self.add_control(penable, msb_enable)
        msb_enable.layout((x_enable, y0))
        msb_enable.update_aspect()
        volume_slider("op%d_amp" % n, x_enable + 24, y0 + 50, height=100)

        env_parameters = []
        for s in ("attack", "decay1", "decay2", "release", "breakpoint",
                  "sustain", "env_mode"):
            p = "op%d_%s" % (n, s)
            env_parameters.append(p)
        enved = ADDSREditor(canvas, n, (x_env, y_env), (800, 350),
                            env_parameters, editor, MAX_ENV_SEGMENT)
        self.add_child_editor("OP%dENV" % n, enved)
        enved.sync()

        y_extra = y_env + 30
        x_extra = x0 + 800

        if n == 3:
            # Add exgtra noise controls
            count = len(NOISE_BANDWIDTHS)
            msb = MSB(canvas, "nse3_bw", editor, count)
            for i, v in enumerate(NOISE_BANDWIDTHS):
                d = {
                    "fill": CFILL,
                    "foreground": CFOREGROUND,
                    "outline": COUTLINE,
                    "value": v,
                    "text": str(v)
                }
                msb.define_aspect(i, v, d)
            self.add_control("nse3_bw", msb)
            msb.layout((x_extra, y_extra))
            msb.update_aspect()
            norm_slider("nse3_mix", x_extra + 24, y_extra + 75)
        if n == 4:
            # Add buzz controls
            x_n = x_extra + 16
            x_env = x_n + 60
            x_lfo = x_env + 60
            x_lag = x_env
            x_mix = x_lag + 60
            linear_slider("bzz4_n", (1, 128), x_n, y_extra)
            linear_slider("bzz4_env", (-128, 128), x_env, y_extra)
            linear_slider("bzz4_lfo2", (0, 128), x_lfo, y_extra)
            norm_slider("bzz4_lag", x_lag, y_extra + 200, height=100)
            norm_slider("bzz4_mix", x_mix, y_extra + 200, height=100)
Exemple #18
0
    def __init__(self, editor):
        frame = editor.create_tab(self.NAME, self.TAB_FILE)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame, 1000, 700, self.IMAGE_FILE)
        canvas.pack()
        self.canvas = canvas
        self.editor = editor
        TkSubEditor.__init__(self, canvas, editor, self.NAME)
        editor.add_child_editor(self.NAME, self)

        cfill = "black"
        cforeground = "#c79fa1"
        coutline = "blue"
        csfill = "#005c56"
        csforeground = "white"

        y0 = 0
        ysliders = y0 + 192
        ywave = y0 + 128
        yclock = ywave
        yfilter = yclock
        yrsenable = y0 + 200

        x0 = 75
        xgain = x0 + 60
        xwave = x0 + 143
        xclock = xwave + 100
        xfilter = xclock + 100
        xefx = xgain + 395
        xdry = xgain + 455

        def volume_slider(param, x, y):
            s = cf.volume_slider(canvas, param, editor)
            self.add_control(param, s)
            s.widget().place(x=x, y=y)
            return s

        def linear_slider(param, range_, x, y):
            s = cf.linear_slider(canvas, param, editor, range_=range_)
            self.add_control(param, s)
            s.widget().place(x=x, y=y)
            return s

        linear_slider("gain", (0, 8), xgain, ysliders)

        msb_wave = MSB(canvas, "wave", editor, 5)
        for i, tx in enumerate(("Off", "Soft", "Clip", "Fold", "Wrap")):
            d = {
                "fill": cfill,
                "foreground": cforeground,
                "outline": coutline,
                "value": i,
                "text": tx
            }
            msb_wave.define_aspect(i, i, d)
        msb_wave.layout((xwave, ywave))
        msb_wave.update_aspect()

        msb_clock = MSB(canvas, "clockFreq", editor, len(CLOCK_FREQS))
        for i, freq in enumerate(CLOCK_FREQS):
            ad = {
                "fill": cfill,
                "foreground": cforeground,
                "outline": coutline,
                "text": str(freq),
                "value": freq
            }
            msb_clock.define_aspect(i, freq, ad)
        self.add_control("clockFreq", msb_clock)
        msb_clock.layout((xclock, yclock))
        msb_clock.update_aspect()

        msb_filter = MSB(canvas, "low", editor, len(LP_FREQS))
        for i, freq in enumerate(LP_FREQS):
            ad = {
                "fill": cfill,
                "foreground": cforeground,
                "outline": coutline,
                "text": str(freq),
                "value": freq
            }
            msb_filter.define_aspect(i, freq, ad)
        self.add_control("low", msb_filter)
        msb_filter.layout((xfilter, yfilter))
        msb_filter.update_aspect()

        volume_slider("wet", xefx, ysliders)
        volume_slider("dry", xdry, ysliders)

        tog_rs_enable = ToggleButton(canvas,
                                     "resampleEnable",
                                     editor,
                                     fill=cfill,
                                     foreground=cforeground,
                                     outline=coutline,
                                     selected_fill=csfill,
                                     selected_foreground=csforeground,
                                     text=["Off", "On"],
                                     values=[0, 1])
        self.add_control("resampleEnable", tog_rs_enable)
        tog_rs_enable.layout((xclock, yrsenable))
        tog_rs_enable.update_aspect()
Exemple #19
0
    def __init__(self, editor):
        frame = editor.create_tab(self.NAME,self.TAB_FILE)
        frame.config(background=factory.bg())
        canvas = factory.canvas(frame, 741,700, self.IMAGE_FILE)
        canvas.pack()
        self.canvas = canvas
        self.editor = editor
        TkSubEditor.__init__(self, canvas, editor, self.NAME)
        editor.add_child_editor(self.NAME, self)

        y0 = 50
        x0 = 75
        xfilter = x0+130
        xmod = xfilter+90
        xattack = xmod + 90
        xrelease = xattack + 60
        xdry = xrelease+90
        xwet = xdry+60
               
        
        def norm_slider(param,x):
            s = cf.normalized_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y0)
            return s

        def volume_slider(param,x):
            s = cf.volume_slider(canvas,param,editor)
            self.add_control(param,s)
            s.widget().place(x=x,y=y0)
            return s

        def linear_slider(param,range_,x):
            s = cf.linear_slider(canvas,param,editor,range_=range_)
            self.add_control(param,s)
            s.widget().place(x=x,y=y0)
            return s

        t_freq = Tumbler(canvas,"fixedFrequency",editor,
                         digits = 4, scale=0.01)
        t_track = Tumbler(canvas,"keyTrack",editor,
                          digits=2, scale=1, range_=(0,16))
        self.add_control("fixedFrequency",t_freq)
        self.add_control("keyTrack",t_track)
        t_freq.layout((x0+25,y0+25))
        t_track.layout((x0+40,y0+100))

        cfill = 'black'
        cforeground = 'white'
        coutline = 'white'
        
        msb_filter = MSB(canvas,"inputFilter",editor,len(FILTER_VALUES))
        for i,v in enumerate(FILTER_VALUES):
            k = v/1000
            tx = "%dk" % k
            d = {"fill" : cfill,
                 "foreground" : cforeground,
                 "outline" : coutline,
                 "value" : v,
                 "text" : tx}
            msb_filter.define_aspect(i,v,d)
        self.add_control("inputFilter",msb_filter)
        msb_filter.layout((xfilter,y0+25))
        msb_filter.update_aspect()

        msb_gain = MSB(canvas,"inputGain",editor,MAX_INPUT_GAIN_MAGNITUDE)
        for i in range(MAX_INPUT_GAIN_MAGNITUDE):
            j = i+1
            v = 10**i
            tx = "x%d" % j
            d = {"fill" : cfill,
                 "foreground" : cforeground,
                 "outline" : coutline,
                 "value" : v,
                 "text" : tx}
            msb_gain.define_aspect(i,v,d)
        self.add_control("inputGain",msb_gain)
        msb_gain.layout((xfilter,y0+100))
        msb_gain.update_aspect()
        norm_slider("modDepth",xmod)
        linear_slider("attack",(0,4),xattack)
        linear_slider("release",(0,4),xrelease)

        msb_env = ToggleButton(canvas,"envelopeSelect",editor,
                               text=("Follow","ASR"),
                               values = (0,1),
                               fill=cfill,
                               selected_fill = cfill,
                               foreground=cforeground,
                               selected_foreground=cforeground,
                               outline=coutline)
                               
        self.add_control("envelopeSelect",msb_env)
        msb_env.layout((xattack+8,y0+200))
        msb_env.update_aspect()
        volume_slider("dryAmp",xdry)
        volume_slider("wetAmp",xwet)