summaryrefslogtreecommitdiff
path: root/libs/surfaces/generic_midi/midicontrollable.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/surfaces/generic_midi/midicontrollable.cc')
-rw-r--r--libs/surfaces/generic_midi/midicontrollable.cc72
1 files changed, 21 insertions, 51 deletions
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc
index 533bb6db21..a1f5abf3b0 100644
--- a/libs/surfaces/generic_midi/midicontrollable.cc
+++ b/libs/surfaces/generic_midi/midicontrollable.cc
@@ -57,7 +57,6 @@ MIDIControllable::init ()
control_type = none;
_control_description = "MIDI Control: none";
control_additional = (byte) -1;
- connections = 0;
feedback = true; // for now
/* use channel 0 ("1") as the initial channel */
@@ -72,17 +71,20 @@ MIDIControllable::midi_forget ()
our existing event + type information.
*/
- if (connections > 0) {
- midi_sense_connection[0].disconnect ();
- }
-
- if (connections > 1) {
- midi_sense_connection[1].disconnect ();
- }
+ midi_sense_connection[0].disconnect ();
+ midi_sense_connection[1].disconnect ();
+ midi_learn_connection.disconnect ();
+}
- connections = 0;
+void
+MIDIControllable::drop_external_control ()
+{
+ midi_sense_connection[0].disconnect ();
+ midi_sense_connection[1].disconnect ();
midi_learn_connection.disconnect ();
+ control_type = none;
+ control_additional = (byte) -1;
}
void
@@ -109,7 +111,7 @@ void
MIDIControllable::learn_about_external_control ()
{
drop_external_control ();
- midi_learn_connection = _port.input()->any.connect (boost::bind (&MIDIControllable::midi_receiver, this, _1, _2, _3));
+ _port.input()->any.connect (midi_learn_connection, boost::bind (&MIDIControllable::midi_receiver, this, _1, _2, _3));
}
void
@@ -118,23 +120,6 @@ MIDIControllable::stop_learning ()
midi_learn_connection.disconnect ();
}
-void
-MIDIControllable::drop_external_control ()
-{
- if (connections > 0) {
- midi_sense_connection[0].disconnect ();
- }
- if (connections > 1) {
- midi_sense_connection[1].disconnect ();
- }
-
- connections = 0;
- midi_learn_connection.disconnect ();
-
- control_type = none;
- control_additional = (byte) -1;
-}
-
float
MIDIControllable::control_to_midi(float val)
{
@@ -300,58 +285,43 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional)
int chn_i = chn;
switch (ev) {
case MIDI::off:
- midi_sense_connection[0] = p.channel_note_off[chn_i].connect
- (boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2));
+ p.channel_note_off[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2));
/* if this is a bistate, connect to noteOn as well,
and we'll toggle back and forth between the two.
*/
if (bistate) {
- midi_sense_connection[1] = p.channel_note_on[chn_i].connect
- (boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2));
- connections = 2;
- } else {
- connections = 1;
- }
+ p.channel_note_on[chn_i].connect (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2));
+ }
+
_control_description = "MIDI control: NoteOff";
break;
case MIDI::on:
- midi_sense_connection[0] = p.channel_note_on[chn_i].connect
- (boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2));
+ p.channel_note_on[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2));
if (bistate) {
- midi_sense_connection[1] = p.channel_note_off[chn_i].connect
- (boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2));
- connections = 2;
- } else {
- connections = 1;
+ p.channel_note_off[chn_i].connect (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2));
}
_control_description = "MIDI control: NoteOn";
break;
case MIDI::controller:
- midi_sense_connection[0] = p.channel_controller[chn_i].connect
- (boost::bind (&MIDIControllable::midi_sense_controller, this, _1, _2));
- connections = 1;
+ p.channel_controller[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_controller, this, _1, _2));
snprintf (buf, sizeof (buf), "MIDI control: Controller %d", control_additional);
_control_description = buf;
break;
case MIDI::program:
if (!bistate) {
- midi_sense_connection[0] = p.channel_program_change[chn_i].connect
- (boost::bind (&MIDIControllable::midi_sense_program_change, this, _1, _2));
- connections = 1;
+ p.channel_program_change[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_program_change, this, _1, _2));
_control_description = "MIDI control: ProgramChange";
}
break;
case MIDI::pitchbend:
if (!bistate) {
- midi_sense_connection[0] = p.channel_pitchbend[chn_i].connect
- (boost::bind (&MIDIControllable::midi_sense_pitchbend, this, _1, _2));
- connections = 1;
+ p.channel_pitchbend[chn_i].connect (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_pitchbend, this, _1, _2));
_control_description = "MIDI control: Pitchbend";
}
break;