예제 #1
0
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)
예제 #3
0
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