diff options
Diffstat (limited to 'libs/midi++2/midnam_patch.cc')
-rw-r--r-- | libs/midi++2/midnam_patch.cc | 69 |
1 files changed, 47 insertions, 22 deletions
diff --git a/libs/midi++2/midnam_patch.cc b/libs/midi++2/midnam_patch.cc index bb9e27ebff..b606728572 100644 --- a/libs/midi++2/midnam_patch.cc +++ b/libs/midi++2/midnam_patch.cc @@ -240,11 +240,11 @@ Control::get_state (void) } int -Control::set_state (const XMLTree&, const XMLNode& node) +Control::set_state (const XMLTree& tree, const XMLNode& node) { assert(node.name() == "Control"); _type = node.property("Type")->value(); - _number = node.property("Number")->value(); + _number = string_to_int(tree, node.property("Number")->value()); _name = node.property("Name")->value(); return 0; @@ -265,18 +265,35 @@ ControlNameList::set_state (const XMLTree& tree, const XMLNode& node) assert(node.name() == "ControlNameList"); _name = node.property("Name")->value(); + _controls.clear(); for (XMLNodeList::const_iterator i = node.children().begin(); i != node.children().end(); ++i) { - if ((*i)->name() != "comment") { + if ((*i)->name() == "Control") { boost::shared_ptr<Control> control(new Control()); control->set_state (tree, *(*i)); - _controls.push_back(control); + if (_controls.find(control->number()) == _controls.end()) { + _controls.insert(make_pair(control->number(), control)); + } else { + PBD::warning << string_compose("%1: Duplicate control %2 ignored", + tree.filename(), control->number()) + << endmsg; + } } } return 0; } +boost::shared_ptr<const Control> +ControlNameList::control(uint16_t num) const +{ + Controls::const_iterator i = _controls.find(num); + if (i != _controls.end()) { + return i->second; + } + return boost::shared_ptr<const Control>(); +} + XMLNode& PatchBank::get_state (void) { @@ -357,7 +374,7 @@ operator<< (std::ostream& os, const ChannelNameSet& cns) 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) { + for (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; } } @@ -376,7 +393,7 @@ ChannelNameSet::set_patch_banks (const ChannelNameSet::PatchBanks& pb) _available_for_channels.clear (); for (PatchBanks::const_iterator pbi = _patch_banks.begin(); pbi != _patch_banks.end(); ++pbi) { - for (PatchBank::PatchNameList::const_iterator pni = (*pbi)->patch_name_list().begin(); pni != (*pbi)->patch_name_list().end(); ++pni) { + for (PatchNameList::const_iterator pni = (*pbi)->patch_name_list().begin(); pni != (*pbi)->patch_name_list().end(); ++pni) { _patch_map[(*pni)->patch_primary_key()] = (*pni); _patch_list.push_back ((*pni)->patch_primary_key()); } @@ -388,9 +405,9 @@ ChannelNameSet::set_patch_banks (const ChannelNameSet::PatchBanks& pb) } void -ChannelNameSet::use_patch_name_list (const PatchBank::PatchNameList& pnl) +ChannelNameSet::use_patch_name_list (const PatchNameList& pnl) { - for (PatchBank::PatchNameList::const_iterator p = pnl.begin(); p != pnl.end(); ++p) { + for (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()); } @@ -431,7 +448,7 @@ int ChannelNameSet::set_state (const XMLTree& tree, const XMLNode& node) { assert(node.name() == "ChannelNameSet"); - _name = node.property("Name")->value(); + _name = node.property("Name")->value(); const XMLNodeList children = node.children(); for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { @@ -440,29 +457,27 @@ ChannelNameSet::set_state (const XMLTree& tree, const XMLNode& node) if (node->name() == "AvailableForChannels") { boost::shared_ptr<XMLSharedNodeList> channels = tree.find("//AvailableChannel[@Available = 'true']/@Channel", node); - for(XMLSharedNodeList::const_iterator i = channels->begin(); + for (XMLSharedNodeList::const_iterator i = channels->begin(); i != channels->end(); ++i) { _available_for_channels.insert( string_to_int(tree, (*i)->attribute_value())); } - } - - if (node->name() == "PatchBank") { + } else if (node->name() == "PatchBank") { boost::shared_ptr<PatchBank> bank (new PatchBank ()); bank->set_state(tree, *node); _patch_banks.push_back(bank); - const PatchBank::PatchNameList& patches = bank->patch_name_list(); - for (PatchBank::PatchNameList::const_iterator patch = patches.begin(); + const PatchNameList& patches = bank->patch_name_list(); + for (PatchNameList::const_iterator patch = patches.begin(); patch != patches.end(); ++patch) { _patch_map[(*patch)->patch_primary_key()] = *patch; _patch_list.push_back((*patch)->patch_primary_key()); } - } - - if (node->name() == "UsesNoteNameList") { + } else if (node->name() == "UsesNoteNameList") { _note_list_name = node->property ("Name")->value(); + } else if (node->name() == "UsesControlNameList") { + _control_list_name = node->property ("Name")->value(); } } @@ -478,7 +493,7 @@ CustomDeviceMode::set_state(const XMLTree& tree, const XMLNode& a_node) boost::shared_ptr<XMLSharedNodeList> channel_name_set_assignments = tree.find("//ChannelNameSetAssign", const_cast<XMLNode *>(&a_node)); - for(XMLSharedNodeList::const_iterator i = channel_name_set_assignments->begin(); + for (XMLSharedNodeList::const_iterator i = channel_name_set_assignments->begin(); i != channel_name_set_assignments->end(); ++i) { const int channel = string_to_int(tree, (*i)->property("Channel")->value()); @@ -536,6 +551,16 @@ MasterDeviceNames::channel_name_set(const std::string& name) return boost::shared_ptr<ChannelNameSet>(); } +boost::shared_ptr<ControlNameList> +MasterDeviceNames::control_name_list(const std::string& name) +{ + ControlNameLists::const_iterator i = _control_name_lists.find(name); + if (i != _control_name_lists.end()) { + return i->second; + } + return boost::shared_ptr<ControlNameList>(); +} + boost::shared_ptr<NoteNameList> MasterDeviceNames::note_name_list(const std::string& name) { @@ -631,7 +656,7 @@ MasterDeviceNames::set_state(const XMLTree& tree, const XMLNode&) ++i) { boost::shared_ptr<NoteNameList> note_name_list(new NoteNameList()); note_name_list->set_state (tree, *(*i)); - _note_name_lists[(*i)->property ("Name")->value()] = note_name_list; + _note_name_lists[note_name_list->name()] = note_name_list; } // ControlNameLists @@ -641,7 +666,7 @@ MasterDeviceNames::set_state(const XMLTree& tree, const XMLNode&) ++i) { boost::shared_ptr<ControlNameList> control_name_list(new ControlNameList()); control_name_list->set_state (tree, *(*i)); - _control_name_lists.push_back(control_name_list); + _control_name_lists[control_name_list->name()] = control_name_list; } // global/post-facto PatchNameLists @@ -650,7 +675,7 @@ MasterDeviceNames::set_state(const XMLTree& tree, const XMLNode&) i != patch_name_lists->end(); ++i) { - PatchBank::PatchNameList patch_name_list; + PatchNameList patch_name_list; const XMLNodeList patches = (*i)->children(); for (XMLNodeList::const_iterator p = patches.begin(); p != patches.end(); ++p) { |