1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 13:38:11 +00:00

Piano: Respect logarithmic parameters in sliders

If the underlying parameter is logarithmic, the slider respects that and
switches to a logarithmic display. Currently, the used base is e, and
we'll have to see in practice if 2 or 10 might be better. The parameters
that make use of this, as can be seen in the previous commit, are all of
the time dependent parameters such as the synth envelope parameters, as
with these, usually fine-grained control at small time scales and
coarser control at large time scales is desired.

This was a good opportunity to refactor the slider step count into a
constant.
This commit is contained in:
kleines Filmröllchen 2021-10-12 01:17:40 +02:00 committed by Andreas Kling
parent e7d84da3da
commit 889315e8aa
2 changed files with 29 additions and 4 deletions

View file

@ -6,21 +6,36 @@
#include "Slider.h"
#include "WidgetWithLabel.h"
#include <AK/FixedPoint.h>
#include <AK/Math.h>
ProcessorParameterSlider::ProcessorParameterSlider(Orientation orientation, LibDSP::ProcessorRangeParameter& parameter, RefPtr<GUI::Label> value_label)
: Slider(orientation)
, WidgetWithLabel(move(value_label))
, m_parameter(parameter)
{
set_range(m_parameter.min_value().raw(), m_parameter.max_value().raw());
set_value(m_parameter.value().raw());
set_step((m_parameter.min_value() - m_parameter.max_value()).raw() / 128);
if (!is_logarithmic()) {
set_range(m_parameter.min_value().raw(), m_parameter.max_value().raw());
set_value(m_parameter.value().raw());
set_step((m_parameter.min_value() - m_parameter.max_value()).raw() / slider_steps);
} else {
auto min_log = m_parameter.min_value().log2().raw();
auto max_log = m_parameter.max_value().log2().raw();
auto value_log = m_parameter.value().log2().raw();
set_range(min_log, max_log);
set_value(value_log);
set_step((min_log - max_log) / slider_steps);
}
set_tooltip(m_parameter.name());
m_value_label->set_text(String::formatted("{:.2f}", static_cast<double>(m_parameter)));
on_change = [this](auto value) {
LibDSP::ParameterFixedPoint real_value;
real_value.raw() = value;
if (is_logarithmic())
// FIXME: Implement exponential for fixed point
real_value = exp(static_cast<double>(real_value));
m_parameter.set_value_sneaky(real_value, LibDSP::Detail::ProcessorParameterSetValueTag {});
if (m_value_label) {
double value = static_cast<double>(m_parameter);
@ -34,6 +49,9 @@ ProcessorParameterSlider::ProcessorParameterSlider(Orientation orientation, LibD
}
};
m_parameter.did_change_value = [this](auto value) {
set_value(value.raw());
if (!is_logarithmic())
set_value(value.raw());
else
set_value(value.log2().raw());
};
}