fix complete screw up in connecting MIDNAM PatchNameList with ChannelNameSets; more tweaks and twirls for patch/program change mgmt

git-svn-id: svn://localhost/ardour2/branches/3.0@12673 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2012-06-12 16:32:06 +00:00
parent d7551a8f08
commit d1d08e3910
6 changed files with 85 additions and 32 deletions

View File

@ -1809,8 +1809,14 @@ MidiRegionView::add_canvas_patch_change (MidiModel::PatchChangePtr patch, const
_patch_changes.push_back (patch_change);
}
void
MidiRegionView::get_patch_key_at (Evoral::MusicalTime time, uint8_t channel, MIDI::Name::PatchPrimaryKey& key)
MIDI::Name::PatchPrimaryKey
MidiRegionView::patch_change_to_patch_key (MidiModel::PatchChangePtr p)
{
return MIDI::Name::PatchPrimaryKey (p->program(), p->bank());
}
void
MidiRegionView::get_patch_key_at (double time, uint8_t channel, MIDI::Name::PatchPrimaryKey& key)
{
MidiModel::PatchChanges::iterator i = _model->patch_change_lower_bound (time);
while (i != _model->patch_changes().end() && (*i)->channel() != channel) {
@ -1827,7 +1833,6 @@ MidiRegionView::get_patch_key_at (Evoral::MusicalTime time, uint8_t channel, MID
assert (key.is_sane());
}
void
MidiRegionView::change_patch_change (CanvasPatchChange& pc, const MIDI::Name::PatchPrimaryKey& new_patch)
{
@ -1926,8 +1931,7 @@ void
MidiRegionView::previous_patch (CanvasPatchChange& patch)
{
if (patch.patch()->program() < 127) {
MIDI::Name::PatchPrimaryKey key;
get_patch_key_at (patch.patch()->time(), patch.patch()->channel(), key);
MIDI::Name::PatchPrimaryKey key = patch_change_to_patch_key (patch.patch());
key.program_number++;
change_patch_change (patch, key);
}
@ -1937,8 +1941,7 @@ void
MidiRegionView::next_patch (CanvasPatchChange& patch)
{
if (patch.patch()->program() > 0) {
MIDI::Name::PatchPrimaryKey key;
get_patch_key_at (patch.patch()->time(), patch.patch()->channel(), key);
MIDI::Name::PatchPrimaryKey key = patch_change_to_patch_key (patch.patch());
key.program_number--;
change_patch_change (patch, key);
}
@ -1948,8 +1951,7 @@ void
MidiRegionView::previous_bank (CanvasPatchChange& patch)
{
if (patch.patch()->program() < 127) {
MIDI::Name::PatchPrimaryKey key;
get_patch_key_at (patch.patch()->time(), patch.patch()->channel(), key);
MIDI::Name::PatchPrimaryKey key = patch_change_to_patch_key (patch.patch());
if (key.bank_number > 0) {
key.bank_number--;
change_patch_change (patch, key);
@ -1961,8 +1963,7 @@ void
MidiRegionView::next_bank (CanvasPatchChange& patch)
{
if (patch.patch()->program() > 0) {
MIDI::Name::PatchPrimaryKey key;
get_patch_key_at (patch.patch()->time(), patch.patch()->channel(), key);
MIDI::Name::PatchPrimaryKey key = patch_change_to_patch_key (patch.patch());
if (key.bank_number < 127) {
key.bank_number++;
change_patch_change (patch, key);

View File

@ -127,7 +127,11 @@ public:
* @key a reference to an instance of MIDI::Name::PatchPrimaryKey whose fields will
* will be set according to the result of the lookup
*/
void get_patch_key_at(double time, uint8_t channel, MIDI::Name::PatchPrimaryKey& key);
void get_patch_key_at (double time, uint8_t channel, MIDI::Name::PatchPrimaryKey& key);
/** Convert a given PatchChange into a PatchPrimaryKey
*/
MIDI::Name::PatchPrimaryKey patch_change_to_patch_key (ARDOUR::MidiModel::PatchChangePtr);
/** Change old_patch to new_patch.
* @param old_patch the canvas patch change which is to be altered

View File

@ -208,8 +208,8 @@ MidiTimeAxisView::set_route (boost::shared_ptr<Route> rt)
_model_selector.set_active_text (gui_property (X_("midnam-model-name")));
_custom_device_mode_selector.set_active_text (gui_property (X_("midnam-custom-device-mode")));
ARDOUR_UI::instance()->set_tip (_model_selector, _("external MIDI Device selector"));
ARDOUR_UI::instance()->set_tip (_custom_device_mode_selector, _("external MIDI Device Mode"));
ARDOUR_UI::instance()->set_tip (_model_selector, _("External MIDI Device"));
ARDOUR_UI::instance()->set_tip (_custom_device_mode_selector, _("External Device Mode"));
midi_controls_hbox->pack_start(_channel_selector, true, false);
if (!patch_manager.all_models().empty()) {

View File

@ -74,7 +74,6 @@ public:
if (master_device != 0 && custom_device_mode != "") {
return master_device->channel_name_set_by_device_mode_and_channel(custom_device_mode, channel);
} else {
std::cerr << "No MD for " << model << " + " << custom_device_mode << std::endl;
return boost::shared_ptr<ChannelNameSet>();
}
}
@ -88,10 +87,8 @@ public:
boost::shared_ptr<ChannelNameSet> channel_name_set = find_channel_name_set(model, custom_device_mode, channel);
if (channel_name_set) {
std::cerr << "found CNS for " << model << " + " << custom_device_mode << std::endl;
return channel_name_set->find_patch(patch_key);
} else {
std::cerr << "no CNS for " << model << " + " << custom_device_mode << std::endl;
return boost::shared_ptr<Patch>();
}
}

View File

@ -198,8 +198,10 @@ public:
int set_state (const XMLTree&, const XMLNode&);
void set_patch_banks (const PatchBanks&);
void use_patch_name_list (const PatchBank::PatchNameList&);
private:
friend std::ostream& operator<< (std::ostream&, const ChannelNameSet&);
std::string _name;
AvailableForChannels _available_for_channels;
PatchBanks _patch_banks;
@ -208,6 +210,8 @@ private:
std::string _patch_list_name;
};
std::ostream& operator<< (std::ostream&, const ChannelNameSet&);
class Note
{
public:
@ -298,18 +302,9 @@ public:
const CustomDeviceModeNames& custom_device_mode_names() const { return _custom_device_mode_names; }
boost::shared_ptr<CustomDeviceMode> custom_device_mode_by_name(std::string mode_name) {
assert(mode_name != "");
return _custom_device_modes[mode_name];
}
boost::shared_ptr<ChannelNameSet> channel_name_set_by_device_mode_and_channel(std::string mode, uint8_t channel) {
return _channel_name_sets[custom_device_mode_by_name(mode)->channel_name_set_name_by_channel(channel)];
}
boost::shared_ptr<Patch> find_patch(std::string mode, uint8_t channel, PatchPrimaryKey& key) {
return channel_name_set_by_device_mode_and_channel(mode, channel)->find_patch(key);
}
boost::shared_ptr<CustomDeviceMode> custom_device_mode_by_name(std::string mode_name);
boost::shared_ptr<ChannelNameSet> channel_name_set_by_device_mode_and_channel(std::string mode, uint8_t channel);
boost::shared_ptr<Patch> find_patch(std::string mode, uint8_t channel, PatchPrimaryKey& key);
XMLNode& get_state (void);
int set_state (const XMLTree&, const XMLNode&);

View File

@ -235,7 +235,7 @@ PatchBank::set_patch_name_list (const PatchNameList& pnl)
{
_patch_name_list = pnl;
_patch_list_name = "";
for (PatchNameList::iterator p = _patch_name_list.begin(); p != _patch_name_list.end(); p++) {
(*p)->set_bank_number (_number);
}
@ -243,6 +243,29 @@ PatchBank::set_patch_name_list (const PatchNameList& pnl)
return 0;
}
std::ostream&
operator<< (std::ostream& os, const ChannelNameSet& cns)
{
os << "Channel Name Set: name = " << cns._name << endl
<< "Map size " << cns._patch_map.size () << endl
<< "List size " << cns._patch_list.size() << endl
<< "Patch list name = [" << cns._patch_list_name << ']' << endl
<< "Available channels : ";
for (set<uint8_t>::iterator x = cns._available_for_channels.begin(); x != cns._available_for_channels.end(); ++x) {
os << (int) (*x) << ' ';
}
os << endl;
for (ChannelNameSet::PatchBanks::const_iterator pbi = cns._patch_banks.begin(); pbi != cns._patch_banks.end(); ++pbi) {
os << "\tPatch Bank " << (*pbi)->name() << " with " << (*pbi)->patch_name_list().size() << " patches\n";
for (PatchBank::PatchNameList::const_iterator pni = (*pbi)->patch_name_list().begin(); pni != (*pbi)->patch_name_list().end(); ++pni) {
os << "\t\tPatch name " << (*pni)->name() << " prog " << (int) (*pni)->program_number() << " bank " << (*pni)->bank_number() << endl;
}
}
return os;
}
void
ChannelNameSet::set_patch_banks (const ChannelNameSet::PatchBanks& pb)
{
@ -265,6 +288,15 @@ ChannelNameSet::set_patch_banks (const ChannelNameSet::PatchBanks& pb)
}
}
void
ChannelNameSet::use_patch_name_list (const PatchBank::PatchNameList& pnl)
{
for (PatchBank::PatchNameList::const_iterator p = pnl.begin(); p != pnl.end(); ++p) {
_patch_map[(*p)->patch_primary_key()] = (*p);
_patch_list.push_back ((*p)->patch_primary_key());
}
}
XMLNode&
ChannelNameSet::get_state (void)
{
@ -369,6 +401,27 @@ CustomDeviceMode::get_state(void)
return *custom_device_mode;
}
boost::shared_ptr<CustomDeviceMode>
MasterDeviceNames::custom_device_mode_by_name(std::string mode_name)
{
assert(mode_name != "");
return _custom_device_modes[mode_name];
}
boost::shared_ptr<ChannelNameSet>
MasterDeviceNames::channel_name_set_by_device_mode_and_channel(std::string mode, uint8_t channel)
{
boost::shared_ptr<CustomDeviceMode> cdm = custom_device_mode_by_name(mode);
boost::shared_ptr<ChannelNameSet> cns = _channel_name_sets[cdm->channel_name_set_name_by_channel(channel)];
return cns;
}
boost::shared_ptr<Patch>
MasterDeviceNames::find_patch(std::string mode, uint8_t channel, PatchPrimaryKey& key)
{
return channel_name_set_by_device_mode_and_channel(mode, channel)->find_patch(key);
}
int
MasterDeviceNames::set_state(const XMLTree& tree, const XMLNode& a_node)
{
@ -448,20 +501,23 @@ MasterDeviceNames::set_state(const XMLTree& tree, const XMLNode& a_node)
for (ChannelNameSets::iterator cns = _channel_name_sets.begin(); cns != _channel_name_sets.end(); ++cns) {
ChannelNameSet::PatchBanks pbs = cns->second->patch_banks();
PatchNameLists::iterator p;
for (ChannelNameSet::PatchBanks::iterator pb = pbs.begin(); pb != pbs.end(); ++pb) {
std::string pln = (*pb)->patch_list_name();
if (!pln.empty()) {
PatchNameLists::iterator p = _patch_name_lists.find (pln);
if (p != _patch_name_lists.end()) {
if ((p = _patch_name_lists.find (pln)) != _patch_name_lists.end()) {
if ((*pb)->set_patch_name_list (p->second)) {
return -1;
}
cns->second->use_patch_name_list (p->second);
} else {
error << string_compose ("Patch list name %1 was not found - patch file ignored", pln) << endmsg;
return -1;
}
}
}
}
return 0;