Changeset 53e24573f438b3127f3acf8dddba3fc383178aa5

Show
Ignore:
Timestamp:
06/06/09 02:21:54 (3 years ago)
Author:
Nedko Arnaudov <nedko@…>
Children:
92734ec69ee76842de3cb995ad24056caa272fde
Parents:
a0304dc201653703aa54a0878fabdf3f06b9f0c9
git-committer:
Nedko Arnaudov <nedko@arnaudov.name> / 2009-06-06T02:21:54Z+0300
Message:

Logarithmic scales for frequency and pandwidth knobs

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • ui

    ra0304dc r53e2457  
    2626import xml.dom.minidom 
    2727import cairo 
    28 from math import pi, sin, cos, atan2 
     28from math import pi, sin, cos, atan2, log 
    2929from colorsys import hls_to_rgb, rgb_to_hls 
    3030import liblo 
     
    115115 
    116116    def show_tooltip(self, knob): 
    117         text = knob.format_value(knob.value) 
    118         self.tooltip.set_text(knob.format_value(knob.max_value)) 
     117        text = knob.format_value() 
    119118        rc = knob.get_allocation() 
    120119        x,y = knob.window.get_origin() 
     
    153152        knob_tooltip = KnobTooltip() 
    154153    return knob_tooltip 
     154 
     155class SmartAdjustment(gtk.Adjustment): 
     156    def __init__(self, log=False, value=0, lower=0, upper=0, step_incr=0, page_incr=0, page_size=0): 
     157        self.log = log 
     158        gtk.Adjustment.__init__(self, value, lower, upper, step_incr, page_incr, page_size) 
     159        self.normalized_value = self.real2norm(self.value) 
     160 
     161    def real2norm(self, value): 
     162        if self.log: 
     163            return log(value / self.lower, self.upper / self.lower) 
     164        else: 
     165            return (value - self.lower) / (self.upper - self.lower) 
     166 
     167    def norm2real(self, value): 
     168        if self.log: 
     169            return self.lower * pow(self.upper / self.lower, value) 
     170        else: 
     171            return value * (self.upper - self.lower) + self.lower 
     172 
     173    def set_value(self, value): 
     174        self.normalized_value = self.real2norm(value) 
     175        gtk.Adjustment.set_value(self, value) 
     176 
     177    def get_normalized_value(self): 
     178        return self.normalized_value 
     179 
     180    def set_normalized_value(self, value): 
     181        self.normalized_value = value 
     182 
     183        if self.normalized_value < 0.0: 
     184            self.normalized_value = 0.0 
     185        elif self.normalized_value > 1.0: 
     186            self.normalized_value = 1.0 
     187 
     188        self.set_value(self.norm2real(self.normalized_value)) 
    155189 
    156190class Knob(gtk.VBox): 
     
    185219 
    186220    def set_adjustment(self, adj): 
    187         self.min_value = adj.lower 
    188         self.max_value = adj.upper 
    189         self.value = adj.value 
     221        self.min_value = 0.0 
     222        self.max_value = 1.0 
     223        self.value = adj.get_normalized_value() 
    190224        if self.adj: 
    191225            self.adj.disconnect(self.adj_id) 
     
    196230        return self.get_property("sensitive") 
    197231 
    198     def format_value(self, value): 
     232    def format_value(self): 
     233        if self.adj: 
     234            value = self.adj.value 
     235        else: 
     236            value = self.value 
    199237        return ("%%.%if" % self.digits) % value 
    200238 
     
    247285 
    248286    def on_adj_value_changed(self, adj): 
    249         if self.value != adj.value: 
    250             self.value = adj.value 
     287        new_value = adj.get_normalized_value() 
     288        if self.value != new_value: 
     289            self.value = new_value 
    251290            self.refresh() 
    252291 
     
    256295        if self.value != oldval: 
    257296            if self.adj: 
    258                 self.adj.set_value(value) 
     297                self.adj.set_normalized_value(value) 
    259298            self.refresh() 
    260299 
     
    690729        self.add_param_box(master_box, self.create_toggle_box(port)) 
    691730 
    692         port = {'index': 1, 'name': 'Gain', 'type': 'knob', 'min': -20.0, 'max': 20.0, 'unit': 'dB'} 
     731        port = {'index': 1, 'name': 'Gain', 'type': 'knob', 'min': -20.0, 'max': 20.0, 'unit': 'dB', 'log': False} 
    693732        self.ports.append(port) 
    694733        self.add_param_box(master_box, self.create_knob_box(port)) 
     
    698737        band_parameters = [ 
    699738            {'name': 'Active', 'type': 'toggle'}, 
    700             {'name': 'Frequency', 'type': 'knob', 'unit': 'Hz'}, 
    701             {'name': 'Bandwidth', 'type': 'knob', 'min': 0.125, 'max': 8.0, 'unit': ''}, 
    702             {'name': 'Gain', 'type': 'knob', 'min': -20.0, 'max': 20.0, 'unit': 'dB'}] 
     739            {'name': 'Frequency', 'type': 'knob', 'unit': 'Hz', 'log': True}, 
     740            {'name': 'Bandwidth', 'type': 'knob', 'min': 0.125, 'max': 8.0, 'unit': '', 'log': True}, 
     741            {'name': 'Gain', 'type': 'knob', 'min': -20.0, 'max': 20.0, 'unit': 'dB', 'log': False}] 
    703742 
    704743        freq_min = [  20.0,   40.0,   100.0,   200.0] 
     
    742781        param_box = gtk.VBox() 
    743782        step = (port['max'] - port['min']) / 100 
    744         adj = gtk.Adjustment(port['min'], port['min'], port['max'], step, step * 20) 
     783        adj = SmartAdjustment(port['log'], port['min'], port['min'], port['max'], step, step * 20) 
    745784        adj.port = port 
    746785        port['adj'] = adj