summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2019-12-17 16:47:46 +0100
committerRobin Gareus <robin@gareus.org>2019-12-17 16:47:46 +0100
commit9c6d9324bd6f86309651415a6e948995b9bbe78a (patch)
tree873765fc9d81be6f2babeecfff04b331fbf4fa57
parent37c9a7beb103d4b0eca93b717621b35a6ab6cbb3 (diff)
VKeybd: exponential pitch-wheel/bend interpolation
-rw-r--r--gtk2_ardour/pianokeyboard.cc5
-rw-r--r--gtk2_ardour/virtual_keyboard_window.cc29
2 files changed, 19 insertions, 15 deletions
diff --git a/gtk2_ardour/pianokeyboard.cc b/gtk2_ardour/pianokeyboard.cc
index c41e8dae5a..d317a33bed 100644
--- a/gtk2_ardour/pianokeyboard.cc
+++ b/gtk2_ardour/pianokeyboard.cc
@@ -599,11 +599,12 @@ APianoKeyboard::handle_fixed_keys (GdkEventKey* ev)
case GDK_KEY_F3:
/* fallthrough */
case GDK_KEY_F4:
- /* fallthrough */
+ PitchBend (8192, false);
+ break;
case GDK_KEY_Up:
/* fallthrough */
case GDK_KEY_Down:
- PitchBend (8192, false);
+ PitchBend (8192, true);
return true;
default:
break;
diff --git a/gtk2_ardour/virtual_keyboard_window.cc b/gtk2_ardour/virtual_keyboard_window.cc
index c263dba0ab..94295f9506 100644
--- a/gtk2_ardour/virtual_keyboard_window.cc
+++ b/gtk2_ardour/virtual_keyboard_window.cc
@@ -564,14 +564,17 @@ VirtualKeyboardWindow::octave_key_event_handler (bool up)
void
VirtualKeyboardWindow::pitch_bend_key_event_handler (int target, bool interpolate)
{
- if (_pitch_adjustment.get_value() == target) {
+ int cur = _pitch_adjustment.get_value();
+ if (cur == target) {
return;
}
if (interpolate) {
_pitch_bend_target = target;
- if (!_bender_connection.connected ()){
- _bender_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &VirtualKeyboardWindow::pitch_bend_timeout), 40 /*ms*/);
- } else {
+ if (!_bender_connection.connected ()) {
+ float tc = _pitch_bend_target == 8192 ? .35 : .51;
+ cur = rintf (cur + tc * (_pitch_bend_target - cur));
+ _pitch_adjustment.set_value (cur);
+ _bender_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &VirtualKeyboardWindow::pitch_bend_timeout), 20 /*ms*/);
}
return;
}
@@ -584,16 +587,16 @@ bool
VirtualKeyboardWindow::pitch_bend_timeout ()
{
int cur = _pitch_adjustment.get_value();
- int target;
- if (cur < _pitch_bend_target) {
- target = std::min (_pitch_bend_target, cur + 1024);
- } else if (cur > _pitch_bend_target) {
- target = std::max (_pitch_bend_target, cur - 1024);
- } else {
- target = _pitch_bend_target;
+
+ /* a spring would be 2nd order with overshoot,
+ * but we assume it's critically damped */
+ float tc = _pitch_bend_target == 8192 ? .35 : .51;
+ cur = rintf (cur + tc * (_pitch_bend_target - cur));
+ if (abs (cur - _pitch_bend_target) < 2) {
+ cur = _pitch_bend_target;
}
- _pitch_adjustment.set_value (target);
- return _pitch_bend_target != target;
+ _pitch_adjustment.set_value (cur);
+ return _pitch_bend_target != cur;
}
void