2 Copyright (C) 2008 Hans Baier
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "midi++/midnam_patch.h"
25 #include "pbd/compose.h"
26 #include "pbd/convert.h"
27 #include "pbd/error.h"
28 #include "pbd/failed_constructor.h"
39 Patch::Patch (std::string name, uint8_t p_number, uint16_t b_number)
41 , _id (p_number, b_number)
45 int initialize_primary_key_from_commands (PatchPrimaryKey& id, const XMLNode* node)
47 const XMLNodeList events = node->children();
48 for (XMLNodeList::const_iterator i = events.begin(); i != events.end(); ++i) {
50 if (node->name() == "ControlChange") {
51 string control = node->property("Control")->value();
52 assert(control != "");
53 string value = node->property("Value")->value();
59 id.bank_number |= (PBD::atoi (value)<<7);
60 } else if (control == "32") {
61 id.bank_number |= PBD::atoi (value);
63 } else if (node->name() == "ProgramChange") {
64 string number = node->property("Number")->value();
66 id.program_number = PBD::atoi(number);
74 Patch::get_state (void)
76 XMLNode* node = new XMLNode("Patch");
78 /* XXX this is totally wrong */
80 node->add_property("Number", string_compose ("%1", _id.program_number));
81 node->add_property("Name", _name);
84 typedef std::list< boost::shared_ptr< Evoral::MIDIEvent<double> > > PatchMidiCommands;
85 XMLNode* commands = node->add_child("PatchMIDICommands");
86 for (PatchMidiCommands::const_iterator event = _patch_midi_commands.begin();
87 event != _patch_midi_commands.end();
89 commands->add_child_copy(*((((Evoral::MIDIEvent&)*event)).to_xml()));
97 Patch::set_state (const XMLTree&, const XMLNode& node)
99 if (node.name() != "Patch") {
100 cerr << "Incorrect node " << node.name() << " handed to Patch" << endl;
104 const XMLProperty* prop = node.property ("Number");
109 _id.program_number = PBD::atoi (prop->value());
111 prop = node.property ("Name");
116 _name = prop->value();
118 XMLNode* commands = node.child("PatchMIDICommands");
121 if (initialize_primary_key_from_commands(_id, commands)) {
125 string program_change = node.property("ProgramChange")->value();
126 assert(program_change.length());
127 _id.program_number = PBD::atoi(program_change);
135 Note::get_state (void)
137 XMLNode* node = new XMLNode("Note");
138 node->add_property("Number", _number);
139 node->add_property("Name", _name);
146 Note::set_state (const XMLTree&, const XMLNode& node)
148 assert(node.name() == "Note");
149 _number = node.property("Number")->value();
150 _name = node.property("Name")->value();
156 NoteNameList::get_state (void)
158 XMLNode* node = new XMLNode("NoteNameList");
159 node->add_property("Name", _name);
165 NoteNameList::set_state (const XMLTree& tree, const XMLNode& node)
167 assert(node.name() == "NoteNameList");
168 _name = node.property("Name")->value();
170 boost::shared_ptr<XMLSharedNodeList> notes = tree.find("//Note");
171 for (XMLSharedNodeList::const_iterator i = notes->begin(); i != notes->end(); ++i) {
172 boost::shared_ptr<Note> note(new Note());
173 note->set_state (tree, *(*i));
174 _notes.push_back(note);
182 PatchBank::get_state (void)
184 XMLNode* node = new XMLNode("PatchBank");
185 node->add_property("Name", _name);
186 XMLNode* patch_name_list = node->add_child("PatchNameList");
187 for (PatchNameList::iterator patch = _patch_name_list.begin();
188 patch != _patch_name_list.end();
190 patch_name_list->add_child_nocopy((*patch)->get_state());
197 PatchBank::set_state (const XMLTree& tree, const XMLNode& node)
199 assert(node.name() == "PatchBank");
200 _name = node.property("Name")->value();
202 XMLNode* commands = node.child("MIDICommands");
204 PatchPrimaryKey id (0, 0);
205 if (initialize_primary_key_from_commands (id, commands)) {
208 _number = id.bank_number;
211 XMLNode* patch_name_list = node.child("PatchNameList");
213 if (patch_name_list) {
214 const XMLNodeList patches = patch_name_list->children();
215 for (XMLNodeList::const_iterator i = patches.begin(); i != patches.end(); ++i) {
216 boost::shared_ptr<Patch> patch (new Patch (string(), 0, _number));
217 patch->set_state(tree, *(*i));
218 _patch_name_list.push_back(patch);
221 XMLNode* use_patch_name_list = node.child ("UsesPatchNameList");
222 if (use_patch_name_list) {
223 _patch_list_name = use_patch_name_list->property ("Name")->value();
225 error << "Patch without patch name list - patchfile will be ignored" << endmsg;
234 PatchBank::set_patch_name_list (const PatchNameList& pnl)
236 _patch_name_list = pnl;
237 _patch_list_name = "";
239 for (PatchNameList::iterator p = _patch_name_list.begin(); p != _patch_name_list.end(); p++) {
240 (*p)->set_bank_number (_number);
247 operator<< (std::ostream& os, const ChannelNameSet& cns)
249 os << "Channel Name Set: name = " << cns._name << endl
250 << "Map size " << cns._patch_map.size () << endl
251 << "List size " << cns._patch_list.size() << endl
252 << "Patch list name = [" << cns._patch_list_name << ']' << endl
253 << "Available channels : ";
254 for (set<uint8_t>::iterator x = cns._available_for_channels.begin(); x != cns._available_for_channels.end(); ++x) {
255 os << (int) (*x) << ' ';
259 for (ChannelNameSet::PatchBanks::const_iterator pbi = cns._patch_banks.begin(); pbi != cns._patch_banks.end(); ++pbi) {
260 os << "\tPatch Bank " << (*pbi)->name() << " with " << (*pbi)->patch_name_list().size() << " patches\n";
261 for (PatchBank::PatchNameList::const_iterator pni = (*pbi)->patch_name_list().begin(); pni != (*pbi)->patch_name_list().end(); ++pni) {
262 os << "\t\tPatch name " << (*pni)->name() << " prog " << (int) (*pni)->program_number() << " bank " << (*pni)->bank_number() << endl;
270 ChannelNameSet::set_patch_banks (const ChannelNameSet::PatchBanks& pb)
275 _patch_list.clear ();
276 _patch_list_name = "";
277 _available_for_channels.clear ();
279 for (PatchBanks::const_iterator pbi = _patch_banks.begin(); pbi != _patch_banks.end(); ++pbi) {
280 for (PatchBank::PatchNameList::const_iterator pni = (*pbi)->patch_name_list().begin(); pni != (*pbi)->patch_name_list().end(); ++pni) {
281 _patch_map[(*pni)->patch_primary_key()] = (*pni);
282 _patch_list.push_back ((*pni)->patch_primary_key());
286 for (uint8_t n = 0; n < 16; ++n) {
287 _available_for_channels.insert (n);
292 ChannelNameSet::use_patch_name_list (const PatchBank::PatchNameList& pnl)
294 for (PatchBank::PatchNameList::const_iterator p = pnl.begin(); p != pnl.end(); ++p) {
295 _patch_map[(*p)->patch_primary_key()] = (*p);
296 _patch_list.push_back ((*p)->patch_primary_key());
301 ChannelNameSet::get_state (void)
303 XMLNode* node = new XMLNode("ChannelNameSet");
304 node->add_property("Name", _name);
306 XMLNode* available_for_channels = node->add_child("AvailableForChannels");
307 assert(available_for_channels);
309 for (uint8_t channel = 0; channel < 16; ++channel) {
310 XMLNode* available_channel = available_for_channels->add_child("AvailableChannel");
311 assert(available_channel);
313 available_channel->add_property("Channel", (long) channel);
315 if (_available_for_channels.find(channel) != _available_for_channels.end()) {
316 available_channel->add_property("Available", "true");
318 available_channel->add_property("Available", "false");
322 for (PatchBanks::iterator patch_bank = _patch_banks.begin();
323 patch_bank != _patch_banks.end();
325 node->add_child_nocopy((*patch_bank)->get_state());
332 ChannelNameSet::set_state (const XMLTree& tree, const XMLNode& node)
334 assert(node.name() == "ChannelNameSet");
335 _name = node.property("Name")->value();
336 const XMLNodeList children = node.children();
337 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
340 if (node->name() == "AvailableForChannels") {
341 boost::shared_ptr<XMLSharedNodeList> channels =
342 tree.find("//AvailableChannel[@Available = 'true']/@Channel");
343 for(XMLSharedNodeList::const_iterator i = channels->begin();
344 i != channels->end();
346 _available_for_channels.insert(atoi((*i)->attribute_value().c_str()));
350 if (node->name() == "PatchBank") {
351 boost::shared_ptr<PatchBank> bank (new PatchBank ());
352 bank->set_state(tree, *node);
353 _patch_banks.push_back(bank);
354 const PatchBank::PatchNameList& patches = bank->patch_name_list();
355 for (PatchBank::PatchNameList::const_iterator patch = patches.begin();
356 patch != patches.end();
358 _patch_map[(*patch)->patch_primary_key()] = *patch;
359 _patch_list.push_back((*patch)->patch_primary_key());
368 CustomDeviceMode::set_state(const XMLTree& tree, const XMLNode& a_node)
370 assert(a_node.name() == "CustomDeviceMode");
372 _name = a_node.property("Name")->value();
374 boost::shared_ptr<XMLSharedNodeList> channel_name_set_assignments =
375 tree.find("//ChannelNameSetAssign");
376 for(XMLSharedNodeList::const_iterator i = channel_name_set_assignments->begin();
377 i != channel_name_set_assignments->end();
379 int channel = atoi((*i)->property("Channel")->value().c_str());
380 string name_set = (*i)->property("NameSet")->value();
381 assert( 1 <= channel && channel <= 16 );
382 _channel_name_set_assignments[channel - 1] = name_set;
388 CustomDeviceMode::get_state(void)
390 XMLNode* custom_device_mode = new XMLNode("CustomDeviceMode");
391 custom_device_mode->add_property("Name", _name);
392 XMLNode* channel_name_set_assignments =
393 custom_device_mode->add_child("ChannelNameSetAssignments");
394 for (int i = 0; i < 15 && !_channel_name_set_assignments[i].empty(); i++) {
395 XMLNode* channel_name_set_assign =
396 channel_name_set_assignments->add_child("ChannelNameSetAssign");
397 channel_name_set_assign->add_property("Channel", i + 1);
398 channel_name_set_assign->add_property("NameSet", _channel_name_set_assignments[i]);
401 return *custom_device_mode;
404 boost::shared_ptr<CustomDeviceMode>
405 MasterDeviceNames::custom_device_mode_by_name(std::string mode_name)
407 assert(mode_name != "");
408 return _custom_device_modes[mode_name];
411 boost::shared_ptr<ChannelNameSet>
412 MasterDeviceNames::channel_name_set_by_device_mode_and_channel(std::string mode, uint8_t channel)
414 boost::shared_ptr<CustomDeviceMode> cdm = custom_device_mode_by_name(mode);
415 boost::shared_ptr<ChannelNameSet> cns = _channel_name_sets[cdm->channel_name_set_name_by_channel(channel)];
419 boost::shared_ptr<Patch>
420 MasterDeviceNames::find_patch(std::string mode, uint8_t channel, PatchPrimaryKey& key)
422 return channel_name_set_by_device_mode_and_channel(mode, channel)->find_patch(key);
426 MasterDeviceNames::set_state(const XMLTree& tree, const XMLNode& a_node)
429 boost::shared_ptr<XMLSharedNodeList> manufacturer = tree.find("//Manufacturer");
430 assert(manufacturer->size() == 1);
431 _manufacturer = manufacturer->front()->content();
434 boost::shared_ptr<XMLSharedNodeList> models = tree.find("//Model");
435 assert(models->size() >= 1);
436 for (XMLSharedNodeList::iterator i = models->begin();
439 const XMLNodeList& contents = (*i)->children();
440 assert(contents.size() == 1);
441 XMLNode * content = *(contents.begin());
442 assert(content->is_content());
443 _models.push_back(content->content());
447 boost::shared_ptr<XMLSharedNodeList> custom_device_modes = tree.find("//CustomDeviceMode");
448 for (XMLSharedNodeList::iterator i = custom_device_modes->begin();
449 i != custom_device_modes->end();
451 boost::shared_ptr<CustomDeviceMode> custom_device_mode(new CustomDeviceMode());
452 custom_device_mode->set_state(tree, *(*i));
454 _custom_device_modes[custom_device_mode->name()] = custom_device_mode;
455 _custom_device_mode_names.push_back(custom_device_mode->name());
459 boost::shared_ptr<XMLSharedNodeList> channel_name_sets = tree.find("//ChannelNameSet");
460 for (XMLSharedNodeList::iterator i = channel_name_sets->begin();
461 i != channel_name_sets->end();
463 boost::shared_ptr<ChannelNameSet> channel_name_set(new ChannelNameSet());
464 channel_name_set->set_state(tree, *(*i));
465 _channel_name_sets[channel_name_set->name()] = channel_name_set;
469 boost::shared_ptr<XMLSharedNodeList> note_name_lists = tree.find("//NoteNameList");
470 for (XMLSharedNodeList::iterator i = note_name_lists->begin();
471 i != note_name_lists->end();
473 boost::shared_ptr<NoteNameList> note_name_list(new NoteNameList());
474 note_name_list->set_state (tree, *(*i));
475 _note_name_lists.push_back(note_name_list);
478 // global/post-facto PatchNameLists
479 boost::shared_ptr<XMLSharedNodeList> patch_name_lists = tree.find("/child::MIDINameDocument/child::MasterDeviceNames/child::PatchNameList");
480 for (XMLSharedNodeList::iterator i = patch_name_lists->begin();
481 i != patch_name_lists->end();
484 PatchBank::PatchNameList patch_name_list;
485 const XMLNodeList patches = (*i)->children();
487 for (XMLNodeList::const_iterator p = patches.begin(); p != patches.end(); ++p) {
488 boost::shared_ptr<Patch> patch (new Patch ());
489 patch->set_state(tree, *(*p));
490 patch_name_list.push_back(patch);
493 if (!patch_name_list.empty()) {
494 _patch_name_lists[(*i)->property ("Name")->value()] = patch_name_list;
498 /* now traverse patches and hook up anything that used UsePatchNameList
499 * to the right patch list
502 for (ChannelNameSets::iterator cns = _channel_name_sets.begin(); cns != _channel_name_sets.end(); ++cns) {
503 ChannelNameSet::PatchBanks pbs = cns->second->patch_banks();
504 PatchNameLists::iterator p;
506 for (ChannelNameSet::PatchBanks::iterator pb = pbs.begin(); pb != pbs.end(); ++pb) {
507 std::string pln = (*pb)->patch_list_name();
509 if ((p = _patch_name_lists.find (pln)) != _patch_name_lists.end()) {
510 if ((*pb)->set_patch_name_list (p->second)) {
513 cns->second->use_patch_name_list (p->second);
515 error << string_compose ("Patch list name %1 was not found - patch file ignored", pln) << endmsg;
527 MasterDeviceNames::get_state(void)
529 static XMLNode nothing("<nothing>");
533 MIDINameDocument::MIDINameDocument (const string& filename)
535 if (!_document.read (filename)) {
536 throw failed_constructor ();
539 set_state (_document, *_document.root());
543 MIDINameDocument::set_state (const XMLTree& tree, const XMLNode& a_node)
547 boost::shared_ptr<XMLSharedNodeList> author = tree.find("//Author");
548 if (author->size() < 1) {
549 error << "No author information in MIDNAM file" << endmsg;
552 _author = author->front()->content();
556 boost::shared_ptr<XMLSharedNodeList> master_device_names_list = tree.find ("//MasterDeviceNames");
558 for (XMLSharedNodeList::iterator i = master_device_names_list->begin();
559 i != master_device_names_list->end();
561 boost::shared_ptr<MasterDeviceNames> master_device_names(new MasterDeviceNames());
563 if (master_device_names->set_state(tree, *(*i))) {
567 for (MasterDeviceNames::Models::const_iterator model = master_device_names->models().begin();
568 model != master_device_names->models().end();
570 _master_device_names_list.insert(
571 std::pair<std::string, boost::shared_ptr<MasterDeviceNames> >
572 (*model, master_device_names));
574 _all_models.push_back(*model);
582 MIDINameDocument::get_state(void)
584 static XMLNode nothing("<nothing>");
588 const char* general_midi_program_names[128] = {
589 "Acoustic Grand Piano",
590 "Bright Acoustic Piano",
591 "Electric Grand Piano",
613 "Acoustic Guitar (nylon)",
614 "Acoustic Guitar (steel)",
615 "Electric Guitar (jazz)",
616 "Electric Guitar (clean)",
617 "Electric Guitar (muted)",
622 "Electric Bass (finger)",
623 "Electric Bass (pick)",
671 "Lead 3 (calliope lead)",
672 "Lead 4 (chiff lead)",
676 "Lead 8 (bass + lead)",