def apply_device_parameter_adapater_patches(): def name(self): if hasattr(self._adaptee, 'custom_name'): return self._adaptee.custom_name else: return self._adaptee.name DeviceParameterAdapter.name = listenable_property(name) def valueItems(self): if getattr(self._adaptee, 'custom_parameter_values', None): return self._adaptee.custom_parameter_values else: if self._adaptee.is_quantized: return self._adaptee.value_items return [] DeviceParameterAdapter.valueItems = listenable_property(valueItems) def value_to_start_point_index(value, start_points): log.debug("start_points: " + str(start_points) + ", len: " + str(len(start_points)) + ", value: " + str(value)) for index, start_point in enumerate(start_points): log.debug("index: " + str(index) + ", start_point: " + str(start_point) + ", value: " + str(value)) if value > start_point and (index == len(start_points) - 1 or value < start_points[index + 1]): log.debug("Input value: " + str(value) + ", output index: " + str(index) + " with custom start points") return index def value_to_index(value, parameter_values): values_len = len(parameter_values) value_index = floor(value * values_len) # If the value is 1.00 we don't want an off by one error value_index = value_index - 1 if value_index == values_len else value_index log.debug("Input value: " + str(value) + ", output index: " + str(value_index)) return value_index def value(self): if getattr(self._adaptee, 'custom_parameter_values', None): if getattr(self._adaptee, 'custom_parameter_start_points', None): return value_to_start_point_index( self._adaptee.value, self._adaptee.custom_parameter_start_points) else: return value_to_index(self._adaptee.value, self._adaptee.custom_parameter_values) else: return self._adaptee.value DeviceParameterAdapter.value = listenable_property(value)
def apply_device_parameter_adapater_patches(): def name(self): if hasattr(self._adaptee, 'custom_name'): return self._adaptee.custom_name else: return self._adaptee.name DeviceParameterAdapter.name = listenable_property(name) def valueItems(self): if getattr(self._adaptee, 'custom_parameter_values', None): return self._adaptee.custom_parameter_values else: if self._adaptee.is_quantized: return self._adaptee.value_items return [] DeviceParameterAdapter.valueItems = listenable_property(valueItems) def value_to_start_point_index(value, start_points): log.debug("start_points: " + str(start_points) + ", len: " + str(len(start_points)) + ", value: " + str(value)) for index, start_point in enumerate(start_points): log.debug("index: " + str(index) + ", start_point: " + str(start_point) + ", value: " + str(value)) if value > start_point and (index == len(start_points) - 1 or value < start_points[index + 1]): log.debug("Input value: " + str(value) + ", output index: " + str(index) + " with custom start points") return index def value_to_index(value, parameter_values): values_len = len(parameter_values) value_index = floor(value * values_len) # If the value is 1.00 we don't want an off by one error value_index = value_index - 1 if value_index == values_len else value_index log.debug("Input value: " + str(value) + ", output index: " + str(value_index)) return value_index def value(self): if getattr(self._adaptee, 'custom_parameter_values', None): if getattr(self._adaptee, 'custom_parameter_start_points', None): return value_to_start_point_index(self._adaptee.value, self._adaptee.custom_parameter_start_points) else: return value_to_index(self._adaptee.value, self._adaptee.custom_parameter_values) else: return self._adaptee.value DeviceParameterAdapter.value = listenable_property(value)
class PitchParameter(InternalParameter): def __init__(self, integer_value_host=None, decimal_value_host=None, *a, **k): super(PitchParameter, self).__init__(*a, **k) self._integer_value_host = integer_value_host self._decimal_value_host = decimal_value_host self._on_integer_value_changed.subject = integer_value_host self._on_decimal_value_changed.subject = decimal_value_host self._on_integer_value_automation_state_changed.subject = integer_value_host self._on_decimal_value_automation_state_changed.subject = decimal_value_host self._integer_value = getattr(integer_value_host, 'value', 0) self._decimal_value = getattr(decimal_value_host, 'value', 0.0) self.adjust_finegrain = False @listens('value') def _on_integer_value_changed(self): new_integer_value = self._integer_value_host.value if self._integer_value != new_integer_value: self._integer_value = new_integer_value self.notify_value() @listens('value') def _on_decimal_value_changed(self): new_decimal_value = self._decimal_value_host.value if self._decimal_value != new_decimal_value: self._decimal_value = new_decimal_value self.notify_value() @listens('automation_state') def _on_integer_value_automation_state_changed(self): self.notify_automation_state() @listens('automation_state') def _on_decimal_value_automation_state_changed(self): self.notify_automation_state() @property def _combined_value(self): return getattr(self._integer_value_host, 'value', 0) + ( getattr(self._decimal_value_host, 'value', 0.0) - 0.5) def _get_value(self): return self._combined_value def _set_value(self, new_value): if new_value != self._combined_value: coarse_linear_value = round(new_value) fine_linear_value = new_value - coarse_linear_value + 0.5 self._set_coarse(coarse_linear_value) self._set_finegrain(fine_linear_value) self.notify_value() value = property(_get_value, _set_value) def _get_linear_value(self): if self.adjust_finegrain: return self._decimal_value return self._integer_value def _set_linear_value(self, new_value): if self.adjust_finegrain: if self._decimal_value != new_value: self._set_finegrain(new_value) self.notify_value() else: if self._integer_value != new_value: self._set_coarse(new_value) self.notify_value() linear_value = listenable_property(_get_linear_value, _set_linear_value) def _set_coarse(self, new_value): self._integer_value = new_value if liveobj_valid(self._integer_value_host): self._integer_value_host.value = clamp( new_value, self._integer_value_host.min, self._integer_value_host.max) def _set_finegrain(self, new_value): if new_value < 0 or new_value > 1: offset = 1 if new_value < 0 else -1 new_value += offset self._set_coarse( getattr(self._integer_value_host, 'value', 0) - offset) self._decimal_value = new_value if liveobj_valid(self._decimal_value_host): self._decimal_value_host.value = new_value @property def decimal_value_host(self): return self._decimal_value_host @property def integer_value_host(self): return self._integer_value_host @property def min(self): return getattr(self._integer_value_host, 'min', 0) - getattr( self._decimal_value_host, 'min', 0.0) @property def max(self): return getattr(self._integer_value_host, 'max', 1) + getattr( self._decimal_value_host, 'max', 1.0) @property def display_value(self): return ('{0:.2f}st').format(self._combined_value) @property def default_value(self): return 0 @property def automation_state(self): integer_host_automation_state = get_parameter_automation_state( self._integer_value_host) decimal_host_automation_state = get_parameter_automation_state( self._decimal_value_host) if integer_host_automation_state == AutomationState.playing or decimal_host_automation_state == AutomationState.playing: return AutomationState.playing return integer_host_automation_state or decimal_host_automation_state