def get_raw_value_for()

in pedalboard/_pedalboard.py [0:0]


    def get_raw_value_for(self, new_value: Union[float, str, bool]) -> float:
        if self.type is float:
            to_float_value: Union[str, float, bool]
            if isinstance(new_value, str) and self.label and new_value.endswith(self.label):
                to_float_value = new_value[: -len(self.label)]
            else:
                to_float_value = new_value

            try:
                new_value = float(to_float_value)
            except ValueError:
                if self.label:
                    raise ValueError(
                        "Value received for parameter '{}' ({}) must be a number or a string (with"
                        " the optional suffix '{}')".format(
                            self.python_name, repr(new_value), self.label
                        )
                    )
                raise ValueError(
                    "Value received for parameter '{}' ({}) must be a number or a string".format(
                        self.python_name, repr(new_value)
                    )
                )
            if (self.min_value is not None and new_value < self.min_value) or (
                self.max_value is not None and new_value > self.max_value
            ):
                raise ValueError(
                    "Value received for parameter '{}' ({}) is out of range [{}{}, {}{}]".format(
                        self.python_name,
                        repr(new_value),
                        self.min_value,
                        self.label,
                        self.max_value,
                        self.label,
                    )
                )
            plugin_reported_raw_value = self.get_raw_value_for_text(str(new_value))

            closest_diff = None
            closest_range_value: Optional[Tuple[float, float]] = None
            for value, raw_value_range in self._value_to_raw_value_ranges.items():
                if not isinstance(value, float):
                    continue
                diff = new_value - value
                if closest_diff is None or abs(diff) < abs(closest_diff):
                    closest_range_value = raw_value_range
                    closest_diff = diff

            if closest_range_value is not None:
                expected_low, expected_high = closest_range_value
                if (
                    plugin_reported_raw_value < expected_low
                    or plugin_reported_raw_value > expected_high
                ):
                    # The plugin might have bad code in it when trying
                    # to parse one of the string values it gave to us.
                    # Let's use the range we had before:
                    return expected_low
            return plugin_reported_raw_value

        elif self.type is str:
            if isinstance(new_value, (str, int, float, bool)):
                new_value = str(new_value)
            else:
                raise ValueError(
                    "Value received for parameter '{}' ({}) should be a string (or string-like),"
                    " but got an object of type: {}".format(
                        self.python_name, repr(new_value), type(new_value)
                    )
                )
            if new_value not in self.valid_values:
                raise ValueError(
                    "Value received for parameter '{}' ({}) not in list of valid values: {}".format(
                        self.python_name, repr(new_value), self.valid_values
                    )
                )
            plugin_reported_raw_value = self.get_raw_value_for_text(new_value)
            expected_low, expected_high = self._value_to_raw_value_ranges[new_value]
            if (
                plugin_reported_raw_value < expected_low
                or plugin_reported_raw_value > expected_high
            ):
                # The plugin might have bad code in it when trying
                # to parse one of the string values it gave to us.
                # Let's use the range we had before:
                return expected_low
            else:
                return plugin_reported_raw_value
        elif self.type is bool:
            if not isinstance(new_value, (bool, WrappedBool)):
                raise ValueError(
                    "Value received for parameter '{}' ({}) should be a boolean,"
                    " but got an object of type: {}".format(
                        self.python_name, repr(new_value), type(new_value)
                    )
                )
            return 1.0 if new_value else 0.0
        else:
            raise ValueError(
                "Parameter has invalid type: {}. This should not be possible!".format(self.type)
            )