Package _Framework :: Module ButtonSliderElement
[hide private]
[frames] | no frames]

Source Code for Module _Framework.ButtonSliderElement

 1  #Embedded file name: /Users/versonator/Hudson/live/Projects/AppLive/Resources/MIDI Remote Scripts/_Framework/ButtonSliderElement.py 
 2  from SliderElement import SliderElement 
 3  from InputControlElement import InputControlElement, MIDI_INVALID_TYPE 
 4  from ButtonElement import ButtonElement 
 5   
6 -class ButtonSliderElement(SliderElement):
7 """ Class representing a set of buttons used as a slider """ 8 _last_sent_value = -1 9
10 - def __init__(self, buttons):
11 raise buttons != None or AssertionError 12 raise isinstance(buttons, tuple) or AssertionError 13 raise len(buttons) > 1 or AssertionError 14 SliderElement.__init__(self, MIDI_INVALID_TYPE, 0, 0) 15 self._buttons = buttons 16 self._last_button_lit = -1 17 identify_sender = True 18 for new_button in self._buttons: 19 raise new_button != None or AssertionError 20 raise isinstance(new_button, ButtonElement) or AssertionError 21 new_button.add_value_listener(self._button_value, identify_sender)
22
23 - def disconnect(self):
24 if self._parameter_to_map_to != None: 25 self._parameter_to_map_to.remove_value_listener(self._on_parameter_changed) 26 SliderElement.disconnect(self) 27 self._buttons = None
28
29 - def message_channel(self):
30 raise NotImplementedError, 'message_channel() should not be called directly on ButtonSliderElement'
31
32 - def message_identifier(self):
33 raise NotImplementedError, 'message_identifier() should not be called directly on ButtonSliderElement'
34
35 - def message_map_mode(self):
36 raise NotImplementedError, 'message_map_mode() should not be called directly on ButtonSliderElement'
37
38 - def install_connections(self, install_translation_callback, install_mapping_callback, install_forwarding_callback):
39 pass
40
41 - def connect_to(self, parameter):
42 if self._parameter_to_map_to != None: 43 self._parameter_to_map_to.remove_value_listener(self._on_parameter_changed) 44 InputControlElement.connect_to(self, parameter) 45 if self._parameter_to_map_to != None: 46 self._parameter_to_map_to.add_value_listener(self._on_parameter_changed) 47 self._on_parameter_changed()
48
49 - def release_parameter(self):
50 if self._parameter_to_map_to != None: 51 self._parameter_to_map_to.remove_value_listener(self._on_parameter_changed) 52 InputControlElement.release_parameter(self)
53
54 - def identifier_bytes(self):
55 raise RuntimeWarning, 'identifier_bytes() should not be called on ButtonSliderElement'
56
57 - def send_value(self, value):
58 if value != self._last_sent_value: 59 index_to_light = 0 60 if value > 0: 61 index_to_light = int((len(self._buttons) - 1) * value / 127) 62 for index in xrange(len(self._buttons)): 63 if index == index_to_light: 64 self._buttons[index].turn_on() 65 else: 66 self._buttons[index].turn_off() 67 68 self._last_sent_value = value 69 self._last_button_lit = index_to_light
70
71 - def _button_value(self, value, sender):
72 self.clear_send_cache() 73 if value != 0 or not sender.is_momentary(): 74 index_of_sender = list(self._buttons).index(sender) 75 midi_value = int(127 * index_of_sender / (len(self._buttons) - 1)) 76 if self._parameter_to_map_to != None and self._parameter_to_map_to.is_enabled: 77 param_range = self._parameter_to_map_to.max - self._parameter_to_map_to.min 78 param_value = param_range * index_of_sender / (len(self._buttons) - 1) + self._parameter_to_map_to.min 79 if index_of_sender > 0: 80 param_value += param_range / (4 * len(self._buttons)) 81 if param_value > self._parameter_to_map_to.max: 82 param_value = self._parameter_to_map_to.max 83 self._parameter_to_map_to.value = param_value 84 self._last_button_lit = index_of_sender 85 self.notify_value(midi_value)
86
87 - def _on_parameter_changed(self):
88 raise self._parameter_to_map_to != None or AssertionError 89 param_range = abs(self._parameter_to_map_to.max - self._parameter_to_map_to.min) 90 midi_value = int(127 * abs(self._parameter_to_map_to.value - self._parameter_to_map_to.min) / param_range) 91 self.send_value(midi_value)
92