generic_midi: add proper handling of midi controll toggles

This commit is contained in:
Jan Lentfer 2018-03-03 14:04:12 +01:00
parent 7e5a488d81
commit a2af019c95
3 changed files with 26 additions and 1 deletions

View file

@ -813,6 +813,7 @@ GenericMidiControlProtocol::create_binding (const XMLNode& node)
MIDI::eventType ev; MIDI::eventType ev;
int intval; int intval;
bool momentary; bool momentary;
MIDIControllable::CtlType ctltype;
MIDIControllable::Encoder encoder = MIDIControllable::No_enc; MIDIControllable::Encoder encoder = MIDIControllable::No_enc;
bool rpn_value = false; bool rpn_value = false;
bool nrpn_value = false; bool nrpn_value = false;
@ -820,6 +821,10 @@ GenericMidiControlProtocol::create_binding (const XMLNode& node)
bool nrpn_change = false; bool nrpn_change = false;
if ((prop = node.property (X_("ctl"))) != 0) { if ((prop = node.property (X_("ctl"))) != 0) {
ctltype = MIDIControllable::Ctl_Momentary;
ev = MIDI::controller;
} else if ((prop = node.property (X_("ctl-toggle"))) !=0) {
ctltype = MIDIControllable::Ctl_Toggle;
ev = MIDI::controller; ev = MIDI::controller;
} else if ((prop = node.property (X_("note"))) != 0) { } else if ((prop = node.property (X_("note"))) != 0) {
ev = MIDI::on; ev = MIDI::on;
@ -895,6 +900,7 @@ GenericMidiControlProtocol::create_binding (const XMLNode& node)
} else if (nrpn_change) { } else if (nrpn_change) {
mc->bind_nrpn_change (channel, detail); mc->bind_nrpn_change (channel, detail);
} else { } else {
mc->set_ctltype (ctltype);
mc->set_encoder (encoder); mc->set_encoder (encoder);
mc->bind_midi (channel, ev, detail); mc->bind_midi (channel, ev, detail);
} }

View file

@ -54,6 +54,7 @@ MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, MIDI::Parser&
, _momentary (m) , _momentary (m)
{ {
_learned = false; /* from URI */ _learned = false; /* from URI */
_ctltype = Ctl_Momentary;
_encoder = No_enc; _encoder = No_enc;
setting = false; setting = false;
last_value = 0; // got a better idea ? last_value = 0; // got a better idea ?
@ -74,6 +75,7 @@ MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, MIDI::Parser&
set_controllable (&c); set_controllable (&c);
_learned = true; /* from controllable */ _learned = true; /* from controllable */
_ctltype = Ctl_Momentary;
_encoder = No_enc; _encoder = No_enc;
setting = false; setting = false;
last_value = 0; // got a better idea ? last_value = 0; // got a better idea ?
@ -392,10 +394,18 @@ MIDIControllable::midi_sense_controller (Parser &, EventTwoBytes *msg)
* (0x40). It is hard to imagine why anyone would make * (0x40). It is hard to imagine why anyone would make
* a MIDI controller button that sent 0x0 when pressed. * a MIDI controller button that sent 0x0 when pressed.
*/ */
if (msg->value >= 0x40) { if (msg->value >= 0x40) {
controllable->set_value (controllable->get_value() >= 0.5 ? 0.0 : 1.0, Controllable::UseGroup); controllable->set_value (controllable->get_value() >= 0.5 ? 0.0 : 1.0, Controllable::UseGroup);
DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi CC %1 value 1 %2\n", (int) msg->controller_number, current_uri())); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi CC %1 value 1 %2\n", (int) msg->controller_number, current_uri()));
} else {
switch (get_ctltype()) {
case Ctl_Momentary:
break;
case Ctl_Toggle:
controllable->set_value (0.0, Controllable::NoGroup);
DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Midi CC %1 value 0 %2\n", (int) msg->controller_number, current_uri()));
break;
}
} }
} }

View file

@ -59,6 +59,11 @@ class MIDIControllable : public PBD::Stateful
uint32_t rid() const { return _rid; } uint32_t rid() const { return _rid; }
std::string what() const { return _what; } std::string what() const { return _what; }
enum CtlType {
Ctl_Momentary,
Ctl_Toggle,
};
enum Encoder { enum Encoder {
No_enc, No_enc,
Enc_R, Enc_R,
@ -80,6 +85,9 @@ class MIDIControllable : public PBD::Stateful
bool learned() const { return _learned; } bool learned() const { return _learned; }
CtlType get_ctltype() const { return _ctltype; }
void set_ctltype (CtlType val) { _ctltype = val; }
Encoder get_encoder() const { return _encoder; } Encoder get_encoder() const { return _encoder; }
void set_encoder (Encoder val) { _encoder = val; } void set_encoder (Encoder val) { _encoder = val; }
@ -122,6 +130,7 @@ class MIDIControllable : public PBD::Stateful
bool _momentary; bool _momentary;
bool _is_gain_controller; bool _is_gain_controller;
bool _learned; bool _learned;
CtlType _ctltype;
Encoder _encoder; Encoder _encoder;
int midi_msg_id; /* controller ID or note number */ int midi_msg_id; /* controller ID or note number */
PBD::ScopedConnection midi_sense_connection[2]; PBD::ScopedConnection midi_sense_connection[2];