1 #include "MidnamTest.hpp"
3 #include <glibmm/fileutils.h>
4 #include <glibmm/miscutils.h>
7 #include "pbd/file_utils.h"
8 #include "pbd/compose.h"
9 #include "midi++/midnam_patch.h"
13 using namespace MIDI::Name;
15 CPPUNIT_TEST_SUITE_REGISTRATION( MidnamTest );
20 #ifdef PLATFORM_WINDOWS
21 std::vector<std::string> path_tok;
22 path_tok.push_back (g_win32_get_package_installation_directory_of_module(NULL));
23 path_tok.push_back ("share");
24 path_tok.push_back ("ardour3");
25 path_tok.push_back ("patchfiles");
26 return Glib::build_filename (path_tok);
28 return Glib::getenv("MIDIPP_TEST_PATH");
33 MidnamTest::protools_patchfile_test()
35 std::string test_file_path;
37 CPPUNIT_ASSERT(find_file (test_search_path (), "Roland_SC-88_Pro.midnam", test_file_path));
38 XMLTree xmldoc(test_file_path);
39 boost::shared_ptr<XMLSharedNodeList> result = xmldoc.find(
40 "//MIDINameDocument");
41 CPPUNIT_ASSERT(result->size() == 1);
43 result = xmldoc.find("//ChannelNameSet");
44 CPPUNIT_ASSERT(result->size() == 2);
46 MIDINameDocument doc(test_file_path);
47 CPPUNIT_ASSERT(doc.all_models().size() == 1);
48 CPPUNIT_ASSERT(doc.author().find("Mark of the Unicorn") == 0);
50 const string model = *doc.all_models().begin();
51 CPPUNIT_ASSERT_EQUAL(string("SC-88 Pro"), model);
52 boost::shared_ptr<MasterDeviceNames> masterDeviceNames =
53 doc.master_device_names_by_model().find(model)->second;
54 CPPUNIT_ASSERT_EQUAL(string("Roland"), masterDeviceNames->manufacturer());
56 string modename = masterDeviceNames->custom_device_mode_names().front();
57 CPPUNIT_ASSERT_EQUAL(string("Default"), modename);
59 boost::shared_ptr<CustomDeviceMode> mode =
60 masterDeviceNames->custom_device_mode_by_name(modename);
62 CPPUNIT_ASSERT_EQUAL(modename, mode->name());
64 string ns1 = string("Name Set 1");
65 string ns2 = string("Name Set 2");
67 for (uint8_t i = 0; i <= 15; i++) {
69 CPPUNIT_ASSERT_EQUAL(ns1,
70 mode->channel_name_set_name_by_channel(i));
72 CPPUNIT_ASSERT_EQUAL(ns2,
73 mode->channel_name_set_name_by_channel(i));
76 boost::shared_ptr<ChannelNameSet> nameSet1 =
77 masterDeviceNames->channel_name_set_by_channel(modename, 0);
78 boost::shared_ptr<ChannelNameSet> nameSet2 =
79 masterDeviceNames->channel_name_set_by_channel(modename, 9);
81 CPPUNIT_ASSERT_EQUAL(ns1, nameSet1->name());
82 CPPUNIT_ASSERT_EQUAL(ns2, nameSet2->name());
84 const ChannelNameSet::PatchBanks& banks1 = nameSet1->patch_banks();
85 const ChannelNameSet::PatchBanks& banks2 = nameSet2->patch_banks();
86 CPPUNIT_ASSERT(banks1.size() == 16);
87 CPPUNIT_ASSERT(banks2.size() == 1);
89 boost::shared_ptr<PatchBank> bank = banks1.front();
90 CPPUNIT_ASSERT_EQUAL(string("Piano"), bank->name());
91 const PatchNameList& plist1 = bank->patch_name_list();
92 CPPUNIT_ASSERT(plist1.size() == 110);
94 bank = banks2.front();
95 CPPUNIT_ASSERT_EQUAL(string("Drum sets"), bank->name());
96 const PatchNameList& plist2 = bank->patch_name_list();
97 CPPUNIT_ASSERT(plist2.size() == 49);
101 MidnamTest::yamaha_PSRS900_patchfile_test()
103 std::string test_file_path;
105 CPPUNIT_ASSERT(find_file (test_search_path (), "Yamaha_PSR-S900.midnam", test_file_path));
106 XMLTree xmldoc(test_file_path);
107 boost::shared_ptr<XMLSharedNodeList> result = xmldoc.find(
108 "//MIDINameDocument");
109 CPPUNIT_ASSERT(result->size() == 1);
111 result = xmldoc.find("//ChannelNameSet");
112 CPPUNIT_ASSERT(result->size() == 3);
114 MIDINameDocument doc(test_file_path);
115 CPPUNIT_ASSERT(doc.all_models().size() == 1);
116 CPPUNIT_ASSERT(doc.author().find("Hans Baier") == 0);
118 const string model = *doc.all_models().begin();
119 CPPUNIT_ASSERT_EQUAL(string("PSR-S900"), model);
120 boost::shared_ptr<MasterDeviceNames> masterDeviceNames =
121 doc.master_device_names_by_model().find(model)->second;
122 CPPUNIT_ASSERT_EQUAL(string("Yamaha"), masterDeviceNames->manufacturer());
124 const MasterDeviceNames::CustomDeviceModeNames& modes = masterDeviceNames->custom_device_mode_names();
125 CPPUNIT_ASSERT(masterDeviceNames->custom_device_mode_names().size() == 3);
127 string modename = modes.front();
128 CPPUNIT_ASSERT_EQUAL(string("Standard"), modename);
130 modename = (*(++modes.begin()));
131 CPPUNIT_ASSERT_EQUAL(string("GM+XG"), modename);
133 modename = modes.back();
134 CPPUNIT_ASSERT_EQUAL(string("GM2"), modename);
136 for (list<string>::const_iterator modename = modes.begin(); modename != modes.end(); ++modename) {
137 boost::shared_ptr<CustomDeviceMode> mode =
138 masterDeviceNames->custom_device_mode_by_name(*modename);
140 CPPUNIT_ASSERT_EQUAL(*modename, mode->name());
142 string ns = mode->name();
144 if (ns != string("Standard"))
145 for (uint8_t i = 0; i <= 15; i++) {
146 CPPUNIT_ASSERT_EQUAL(ns,
147 mode->channel_name_set_name_by_channel(i));
148 boost::shared_ptr<ChannelNameSet> nameSet =
149 masterDeviceNames->channel_name_set_by_channel(ns, 1);
151 CPPUNIT_ASSERT_EQUAL(ns, nameSet->name());
153 const ChannelNameSet::PatchBanks& banks1 = nameSet->patch_banks();
154 CPPUNIT_ASSERT(banks1.size() > 1);
156 boost::shared_ptr<PatchBank> bank = banks1.front();
157 const PatchNameList& list = bank->patch_name_list();
159 for(PatchNameList::const_iterator p = list.begin(); p != list.end(); ++p) {
161 if (ns == string("GM+XG")) {
162 uint8_t msb = (((*p)->bank_number()) >> 7) & 0x7f;
163 CPPUNIT_ASSERT( msb == 0 || msb == 64);
166 if (ns == string("GM2")) {
167 CPPUNIT_ASSERT((*p)->bank_number() >= (uint16_t(120) << 7));
175 MidnamTest::load_all_midnams_test ()
177 vector<std::string> result;
179 PBD::find_files_matching_pattern (result, test_search_path (), "*.midnam");
181 CPPUNIT_ASSERT(!result.empty());
183 cout << "Loading " << result.size() << " MIDI patches from " << test_search_path ().to_string () << endl;
185 for (vector<std::string>::iterator i = result.begin(); i != result.end(); ++i) {
186 cout << "Processing file " << *i << endl;
187 boost::shared_ptr<MIDINameDocument> document(new MIDINameDocument(*i));
190 boost::shared_ptr<XMLSharedNodeList> result = xmldoc.find("//MIDINameDocument");
191 CPPUNIT_ASSERT(result->size() == 1);
193 result = xmldoc.find("//MasterDeviceNames");
194 CPPUNIT_ASSERT(result->size() == 1);
196 result = xmldoc.find("//PatchBank");
197 //int banks = result->size();
200 result = xmldoc.find("//CustomDeviceMode[1]");
201 string deviceModeName = result->front()->property("Name")->value();
203 MIDINameDocument::MasterDeviceNamesList::const_iterator device =
204 document->master_device_names_by_model().begin();
206 string modename = device->second->custom_device_mode_names().front();
207 boost::shared_ptr<CustomDeviceMode> mode = device->second->custom_device_mode_by_name(modename);
208 CPPUNIT_ASSERT_EQUAL(deviceModeName, mode->name());
210 boost::shared_ptr<ChannelNameSet> nameSet = device->second->channel_name_set_by_channel(modename, 0);