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:
parent
62f47e75c9
commit
2c8746eda9
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user