a few small fixes that help pitchbend control of things, notably the shuttle controller. but note that basically, teh shuttle controller is completely and hopelessly broken through excess complexity and incorrect design

git-svn-id: svn://localhost/ardour2/branches/3.0@13870 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2013-01-17 14:48:17 +00:00
parent 4ecb07aaee
commit 5adcb61f60
3 changed files with 19 additions and 22 deletions

View file

@ -427,10 +427,10 @@ ShuttleControl::mouse_shuttle (double x, bool force)
} }
void void
ShuttleControl::set_shuttle_fract (double f) ShuttleControl::set_shuttle_fract (double f, bool zero_ok)
{ {
shuttle_fract = f; shuttle_fract = f;
use_shuttle_fract (false); use_shuttle_fract (false, zero_ok);
} }
int int
@ -472,7 +472,7 @@ ShuttleControl::fract_as_semitones (float fract, bool& reverse)
} }
void void
ShuttleControl::use_shuttle_fract (bool force) ShuttleControl::use_shuttle_fract (bool force, bool zero_ok)
{ {
microseconds_t now = get_microseconds(); microseconds_t now = get_microseconds();
@ -503,7 +503,11 @@ ShuttleControl::use_shuttle_fract (bool force)
speed = shuttle_max_speed * shuttle_fract; speed = shuttle_max_speed * shuttle_fract;
} }
_session->request_transport_speed_nonzero (speed, Config->get_shuttle_behaviour() == Wheel); if (zero_ok) {
_session->request_transport_speed (speed, Config->get_shuttle_behaviour() == Wheel);
} else {
_session->request_transport_speed_nonzero (speed, Config->get_shuttle_behaviour() == Wheel);
}
} }
void void
@ -657,25 +661,13 @@ ShuttleControl::ShuttleControllable::ShuttleControllable (ShuttleControl& s)
void void
ShuttleControl::ShuttleControllable::set_value (double val) ShuttleControl::ShuttleControllable::set_value (double val)
{ {
double fract; sc.set_shuttle_fract ((val - lower()) / (upper() - lower()), true);
if (val == 0.5) {
fract = 0.0;
} else {
if (val < 0.5) {
fract = -((0.5 - val)/0.5);
} else {
fract = ((val - 0.5)/0.5);
}
}
sc.set_shuttle_fract (fract);
} }
double double
ShuttleControl::ShuttleControllable::get_value () const ShuttleControl::ShuttleControllable::get_value () const
{ {
return sc.get_shuttle_fract (); return lower() + (sc.get_shuttle_fract () * (upper() - lower()));
} }
void void

View file

@ -40,7 +40,7 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
void map_transport_state (); void map_transport_state ();
void update_speed_display (); void update_speed_display ();
void set_shuttle_fract (double); void set_shuttle_fract (double, bool zero_ok = false);
double get_shuttle_fract () const { return shuttle_fract; } double get_shuttle_fract () const { return shuttle_fract; }
void set_session (ARDOUR::Session*); void set_session (ARDOUR::Session*);
@ -49,6 +49,9 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
void set_value (double); void set_value (double);
double get_value (void) const; double get_value (void) const;
double lower() const { return -1.0; }
double upper() const { return 1.0; }
ShuttleControl& sc; ShuttleControl& sc;
}; };
@ -89,8 +92,8 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
void on_size_allocate (Gtk::Allocation&); void on_size_allocate (Gtk::Allocation&);
bool on_query_tooltip (int, int, bool, const Glib::RefPtr<Gtk::Tooltip>&); bool on_query_tooltip (int, int, bool, const Glib::RefPtr<Gtk::Tooltip>&);
gint mouse_shuttle (double x, bool force); gint mouse_shuttle (double x, bool force);
void use_shuttle_fract (bool force); void use_shuttle_fract (bool force, bool zero_ok = false);
void parameter_changed (std::string); void parameter_changed (std::string);
void set_shuttle_units (ARDOUR::ShuttleUnits); void set_shuttle_units (ARDOUR::ShuttleUnits);

View file

@ -122,6 +122,8 @@ MIDIControllable::set_controllable (Controllable* c)
controllable = c; controllable = c;
last_controllable_value = controllable->get_value();
if (controllable) { if (controllable) {
controllable->Destroyed.connect (controllable_death_connection, MISSING_INVALIDATOR, controllable->Destroyed.connect (controllable_death_connection, MISSING_INVALIDATOR,
boost::bind (&MIDIControllable::drop_controllable, this), boost::bind (&MIDIControllable::drop_controllable, this),
@ -228,7 +230,6 @@ MIDIControllable::lookup_controllable()
void void
MIDIControllable::drop_controllable () MIDIControllable::drop_controllable ()
{ {
cerr << "removed controllable " << controllable << "\n";
set_controllable (0); set_controllable (0);
} }
@ -272,6 +273,7 @@ MIDIControllable::midi_sense_controller (Parser &, EventTwoBytes *msg)
if (control_additional == msg->controller_number) { if (control_additional == msg->controller_number) {
if (!controllable->is_toggle()) { if (!controllable->is_toggle()) {
float new_value = msg->value; float new_value = msg->value;
float max_value = max(last_controllable_value, new_value); float max_value = max(last_controllable_value, new_value);
float min_value = min(last_controllable_value, new_value); float min_value = min(last_controllable_value, new_value);