MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, Port& p, Controllable& c, bool m)
: _surface (s)
- , controllable (&c)
, _descriptor (0)
, _port (p)
, _momentary (m)
{
+ set_controllable (&c);
+
_learned = true; /* from controllable */
setting = false;
last_value = 0; // got a better idea ?
void
MIDIControllable::set_controllable (Controllable* c)
{
+ if (c == controllable) {
+ return;
+ }
+
+ controllable_death_connection.disconnect ();
+
controllable = c;
+
+ if (controllable) {
+ last_controllable_value = controllable->get_value();
+ } else {
+ last_controllable_value = 0.0f; // is there a better value?
+ }
+
+ if (controllable) {
+ controllable->Destroyed.connect (controllable_death_connection, MISSING_INVALIDATOR,
+ boost::bind (&MIDIControllable::drop_controllable, this),
+ MidiControlUI::instance());
+ }
}
void
float control_max = controllable->upper ();
const float control_range = control_max - control_min;
+ if (controllable->is_toggle()) {
+ if (val >= (control_min + (control_range/2.0f))) {
+ return max_value_for_type();
+ } else {
+ return 0;
+ }
+ }
+
return (val - control_min) / control_range * max_value_for_type ();
}
return -1;
}
- controllable = c.get();
- controllable->Destroyed.connect (controllable_death_connection, MISSING_INVALIDATOR,
- boost::bind (&MIDIControllable::drop_controllable, this),
- MidiControlUI::instance());
+ set_controllable (c.get ());
return 0;
}
void
MIDIControllable::drop_controllable ()
{
- cerr << "removed controllable\n";
- controllable_death_connection.disconnect ();
- controllable = 0;
+ set_controllable (0);
}
void
}
if (!controllable->is_toggle()) {
- controllable->set_value (midi_to_control (msg->note_number));
+ if (control_additional == msg->note_number) {
+ controllable->set_value (midi_to_control (msg->velocity));
+ }
} else {
if (control_additional == msg->note_number) {
controllable->set_value (controllable->get_value() > 0.5f ? 0.0f : 1.0f);
if (control_additional == msg->controller_number) {
if (!controllable->is_toggle()) {
+
float new_value = msg->value;
float max_value = max(last_controllable_value, new_value);
float min_value = min(last_controllable_value, new_value);