13
0

use per-channel signals to pick up scene changes, rather than global ones

This commit is contained in:
Paul Davis 2014-04-30 10:10:31 -04:00
parent 58522e5b5e
commit d604852f67
3 changed files with 16 additions and 29 deletions

View File

@ -59,12 +59,11 @@ class MIDISceneChanger : public SceneChanger
void jump_to (int bank, int program);
void deliver (MidiBuffer&, framepos_t, boost::shared_ptr<MIDISceneChange>);
void bank_change_input (MIDI::Parser&, unsigned short);
void program_change_input (MIDI::Parser&, MIDI::byte);
void bank_change_input (MIDI::Parser&, unsigned short, int channel);
void program_change_input (MIDI::Parser&, MIDI::byte, int channel);
void locations_changed (Locations::Change);
PBD::ScopedConnection incoming_bank_change_connection;
PBD::ScopedConnection incoming_program_change_connection;
PBD::ScopedConnectionList incoming_connections;
};
} // namespace

View File

@ -65,7 +65,7 @@ MIDISceneChange::get_bank_msb_message (uint8_t* buf, size_t size) const
buf[0] = 0xB0 | (_channel & 0xf);
buf[1] = 0x0;
buf[2] = (_bank & 0xf700) >> 8;
buf[2] = (_bank >> 7) & 0x7f;
return 3;
}
@ -79,7 +79,7 @@ MIDISceneChange::get_bank_lsb_message (uint8_t* buf, size_t size) const
buf[0] = 0xB0 | (_channel & 0xf);
buf[1] = 0x20;
buf[2] = (_bank & 0xf7);
buf[2] = _bank & 0x7f;
return 3;
}
@ -92,7 +92,7 @@ MIDISceneChange::get_program_message (uint8_t* buf, size_t size) const
}
buf[0] = 0xC0 | (_channel & 0xf);
buf[1] = _program & 0xf7;
buf[1] = _program & 0x7f;
return 2;
}

View File

@ -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);