summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_scene_changer.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-04-30 10:10:31 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2014-04-30 10:10:31 -0400
commitd604852f6785890efa033eff442f19b1419b79be (patch)
treefed64a919aa779f5d1d85ebe41090f3ba259a496 /libs/ardour/midi_scene_changer.cc
parent58522e5b5ea72896c2893c00bd4cf2939b30a492 (diff)
use per-channel signals to pick up scene changes, rather than global ones
Diffstat (limited to 'libs/ardour/midi_scene_changer.cc')
-rw-r--r--libs/ardour/midi_scene_changer.cc32
1 files changed, 10 insertions, 22 deletions
diff --git a/libs/ardour/midi_scene_changer.cc b/libs/ardour/midi_scene_changer.cc
index 49e835ca80..65503cb0c1 100644
--- a/libs/ardour/midi_scene_changer.cc
+++ b/libs/ardour/midi_scene_changer.cc
@@ -18,6 +18,7 @@
*/
#include "evoral/MIDIEvent.hpp"
+#include "midi++/channel.h"
#include "midi++/parser.h"
#include "midi++/port.h"
@@ -147,8 +148,7 @@ MIDISceneChanger::set_input_port (MIDI::Port* mp)
{
input_port = mp;
- incoming_bank_change_connection.disconnect ();
- incoming_program_change_connection.disconnect ();
+ incoming_connections.drop_connections();
if (input_port) {
@@ -157,8 +157,10 @@ MIDISceneChanger::set_input_port (MIDI::Port* mp)
* and thus invoke our callbacks as necessary.
*/
- input_port->parser()->bank_change.connect_same_thread (incoming_bank_change_connection, boost::bind (&MIDISceneChanger::bank_change_input, this, _1, _2));
- input_port->parser()->program_change.connect_same_thread (incoming_program_change_connection, boost::bind (&MIDISceneChanger::program_change_input, this, _1, _2));
+ for (int channel = 0; channel < 16; ++channel) {
+ input_port->parser()->channel_bank_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::bank_change_input, this, _1, _2, channel));
+ input_port->parser()->channel_program_change[channel].connect_same_thread (incoming_connections, boost::bind (&MIDISceneChanger::program_change_input, this, _1, _2, channel));
+ }
}
}
@@ -181,26 +183,24 @@ MIDISceneChanger::recording() const
}
void
-MIDISceneChanger::bank_change_input (MIDI::Parser& parser, unsigned short bank)
+MIDISceneChanger::bank_change_input (MIDI::Parser& parser, unsigned short, int)
{
if (!recording()) {
return;
}
last_bank_message_time = parser.get_timestamp ();
- current_bank = bank;
}
void
-MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program)
+MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program, int channel)
{
framecnt_t time = parser.get_timestamp ();
- frameoffset_t delta = time - last_program_message_time;
last_program_message_time = time;
if (!recording()) {
- jump_to (current_bank, program);
+ jump_to (input_port->channel (channel)->bank(), program);
return;
}
@@ -227,19 +227,7 @@ MIDISceneChanger::program_change_input (MIDI::Parser& parser, MIDI::byte program
new_mark = true;
}
- uint8_t bank;
- uint8_t channel = (program & 0xf0) >> 8;
-
- /* if we received a bank change message within the last 2 msec, use the
- * current bank value, otherwise lookup the current bank number and use
- * that.
- */
-
- if (time - last_bank_message_time < (2 * _session.frame_rate() / 1000.0)) {
- bank = current_bank;
- } else {
- bank = -1;
- }
+ unsigned short bank = input_port->channel (channel)->bank();
MIDISceneChange* msc =new MIDISceneChange (loc->start(), channel, bank, program & 0x7f);