13
0

Fix shuttle wheel semi-tone mode

Previously it was not possible to return from reverse playback
since left-scroll decreased pitch, even during reverse playback.

This also fixes an edge-case when quickly scrolling through
zero. use_shuttle_fract() ignores rapid events, map_transport_state()
can round speed to zero and next scroll-event set the default +1st
speed (really should have been 0st).This is solved by starting at
-24st, similar to how percentage does not start at 100%.
This commit is contained in:
Robin Gareus 2021-04-20 13:53:35 +02:00
parent 62f47e75c9
commit 2c8746eda9
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04

View File

@ -381,11 +381,16 @@ ShuttleControl::on_scroll_event (GdkEventScroll* ev)
case GDK_SCROLL_RIGHT:
if (semis) {
if (shuttle_fract == 0) {
shuttle_fract = semitones_as_fract (1, false);
shuttle_fract = semitones_as_fract (-24, false);
} else {
bool rev;
int st = fract_as_semitones (shuttle_fract, rev);
shuttle_fract = semitones_as_fract (st + 1, rev);
st += (rev ? -1 : 1);
if (st < -24) {
st = -24;
rev = !rev;
}
shuttle_fract = semitones_as_fract (st, rev);
}
} else {
shuttle_fract += 0.00125;
@ -395,11 +400,16 @@ ShuttleControl::on_scroll_event (GdkEventScroll* ev)
case GDK_SCROLL_LEFT:
if (semis) {
if (shuttle_fract == 0) {
shuttle_fract = semitones_as_fract (1, true);
shuttle_fract = semitones_as_fract (-24, true);
} else {
bool rev;
int st = fract_as_semitones (shuttle_fract, rev);
shuttle_fract = semitones_as_fract (st - 1, rev);
st += (rev ? 1 : -1);
if (st < -24) {
st = -24;
rev = !rev;
}
shuttle_fract = semitones_as_fract (st, rev);
}
} else {
shuttle_fract -= 0.00125;
@ -409,32 +419,6 @@ ShuttleControl::on_scroll_event (GdkEventScroll* ev)
return false;
}
if (semis) {
float lower_side_of_dead_zone = semitones_as_fract (-24, true);
float upper_side_of_dead_zone = semitones_as_fract (-24, false);
/* if we entered the "dead zone" (-24 semitones in forward or reverse), jump
to the far side of it.
*/
if (shuttle_fract > lower_side_of_dead_zone && shuttle_fract < upper_side_of_dead_zone) {
switch (ev->direction) {
case GDK_SCROLL_UP:
case GDK_SCROLL_RIGHT:
shuttle_fract = upper_side_of_dead_zone;
break;
case GDK_SCROLL_DOWN:
case GDK_SCROLL_LEFT:
shuttle_fract = lower_side_of_dead_zone;
break;
default:
/* impossible, checked above */
return false;
}
}
}
use_shuttle_fract (true);
return true;