X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nonlinear_fader.cpp;h=61317e0acfc0c5c9ba2e871d421e483b6df73b27;hb=937b6ab9e4c5d13fe7f7bdcb5a17bf48929f44ce;hp=7c26434aac743faeda9e29434758a78543e68b13;hpb=22bb590d54107446f09d0cb60f32e610cc9ed7ad;p=nageru diff --git a/nonlinear_fader.cpp b/nonlinear_fader.cpp index 7c26434..61317e0 100644 --- a/nonlinear_fader.cpp +++ b/nonlinear_fader.cpp @@ -17,35 +17,38 @@ namespace { vector> fader_control_points = { // The main area is from +6 to -12 dB (18 dB), and we use half the slider range for it. - { 6.0, 0.0 }, - { -12.0, 0.5 }, + // Adjust slightly so that the MIDI controller value of 106 becomes exactly 0.0 dB + // (cf. map_controller_to_float()); otherwise, we'd miss ever so slightly, which is + // really frustrating. + { 6.0, 1.0 }, + { -12.0, 1.0 - (1.0 - 106.5/127.0) * 3.0 }, // About 0.492. // -12 to -21 is half the range (9 dB). Halve. - { -21.0, 0.625 }, + { -21.0, 0.325 }, // -21 to -30 (9 dB) gets the same range as the previous one. - { -30.0, 0.75 }, + { -30.0, 0.25 }, // -30 to -48 (18 dB) gets half of half. - { -48.0, 0.875 }, + { -48.0, 0.125 }, // -48 to -84 (36 dB) gets half of half of half. - { -84.0, 1.0 }, + { -84.0, 0.0 }, }; double slider_fraction_to_db(double db) { - if (db <= fader_control_points[0].second) { + if (db >= fader_control_points[0].second) { return fader_control_points[0].first; } - if (db >= fader_control_points.back().second) { + if (db <= fader_control_points.back().second) { return fader_control_points.back().first; } for (unsigned i = 1; i < fader_control_points.size(); ++i) { - const double x0 = fader_control_points[i - 1].second; - const double x1 = fader_control_points[i].second; - const double y0 = fader_control_points[i - 1].first; - const double y1 = fader_control_points[i].first; + const double x0 = fader_control_points[i].second; + const double x1 = fader_control_points[i - 1].second; + const double y0 = fader_control_points[i].first; + const double y1 = fader_control_points[i - 1].first; if (db >= x0 && db <= x1) { const double t = (db - x0) / (x1 - x0); return y0 + t * (y1 - y0); @@ -100,8 +103,8 @@ void NonLinearFader::paintEvent(QPaintEvent *event) // FIXME: Where does the slider_length / 2 come from? I can't really find it // in the Qt code, but it seems to match up with reality. int slider_length = sr.height(); - int slider_min = gr.top() + (slider_length / 2); - int slider_max = gr.bottom() + (slider_length / 2) - slider_length + 1; + int slider_max = gr.top() + (slider_length / 2); + int slider_min = gr.bottom() + (slider_length / 2) - slider_length + 1; QPainter p(this); @@ -119,15 +122,6 @@ void NonLinearFader::paintEvent(QPaintEvent *event) QSlider::paintEvent(event); } -void NonLinearFader::resizeEvent(QResizeEvent *event) -{ - QSlider::resizeEvent(event); - inhibit_updates = true; - setRange(0, event->size().height() - 1); - inhibit_updates = false; - update_slider_position(); -} - void NonLinearFader::sliderChange(SliderChange change) { QSlider::sliderChange(change); @@ -135,7 +129,7 @@ void NonLinearFader::sliderChange(SliderChange change) if (value() == 0) { db_value = -HUGE_VAL; } else { - double frac = 1.0 - value() / (height() - 1.0); + double frac = double(value() - minimum()) / (maximum() - minimum()); db_value = slider_fraction_to_db(frac); } emit dbValueChanged(db_value); @@ -145,6 +139,7 @@ void NonLinearFader::sliderChange(SliderChange change) void NonLinearFader::update_slider_position() { inhibit_updates = true; - setValue(lrint((1.0 - db_to_slider_fraction(db_value)) * (height() - 1.0))); + double val = db_to_slider_fraction(db_value) * (maximum() - minimum()) + minimum(); + setValue(lrint(val)); inhibit_updates = false; }