summaryrefslogtreecommitdiff
path: root/gtk2_ardour/virtual_keyboard_window.cc
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 /gtk2_ardour/virtual_keyboard_window.cc
parent37c9a7beb103d4b0eca93b717621b35a6ab6cbb3 (diff)
VKeybd: exponential pitch-wheel/bend interpolation
Diffstat (limited to 'gtk2_ardour/virtual_keyboard_window.cc')
-rw-r--r--gtk2_ardour/virtual_keyboard_window.cc29
1 files changed, 16 insertions, 13 deletions
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