Log scaling for better vol control

This commit is contained in:
Joey Yakimowich-Payne 2026-01-31 08:11:51 -07:00
commit cb9770a757
2 changed files with 25 additions and 6 deletions

View file

@ -48,9 +48,20 @@
#include <QVBoxLayout>
#include <algorithm>
#include <cmath>
#include <unordered_map>
#include <unordered_set>
namespace {
inline float sliderToVolume(int slider) {
float x = static_cast<float>(slider) / 100.0f;
return x * x * x;
}
inline int volumeToSlider(float volume) {
return static_cast<int>(std::round(std::cbrt(volume) * 100.0f));
}
}
class DeleteVirtualNodeCommand : public QUndoCommand {
public:
struct Snapshot {
@ -1192,7 +1203,7 @@ void GraphEditorWidget::wireVolumeWidget(QtNodes::NodeId nodeId) {
connect(vol, &NodeVolumeWidget::volumeChanged, this,
[this, capturedId](int value) {
auto state = m_model->nodeVolumeState(capturedId);
state.volume = static_cast<float>(value) / 100.0f;
state.volume = sliderToVolume(value);
m_model->setNodeVolumeState(capturedId, state);
});
@ -1268,7 +1279,7 @@ void GraphEditorWidget::rebuildMixerStrips() {
auto *slider = new ClickSlider(Qt::Horizontal);
slider->setRange(0, 100);
auto state = m_model->nodeVolumeState(nodeId);
slider->setValue(static_cast<int>(state.volume * 100.0f));
slider->setValue(volumeToSlider(state.volume));
slider->setStyleSheet(QStringLiteral(
"QSlider::groove:horizontal {"
" background: #1a1a1e; border-radius: 3px; height: 6px; }"
@ -1301,7 +1312,7 @@ void GraphEditorWidget::rebuildMixerStrips() {
connect(slider, &QSlider::valueChanged, this,
[this, capturedId](int value) {
auto s = m_model->nodeVolumeState(capturedId);
s.volume = static_cast<float>(value) / 100.0f;
s.volume = sliderToVolume(value);
m_model->setNodeVolumeState(capturedId, s);
});
@ -1330,7 +1341,7 @@ void GraphEditorWidget::rebuildMixerStrips() {
return;
QSignalBlocker sb(slider);
QSignalBlocker mb(muteBtn);
slider->setValue(static_cast<int>(cur.volume * 100.0f));
slider->setValue(volumeToSlider(cur.volume));
muteBtn->setChecked(cur.mute);
});