1 #include "MidnamTest.hpp"
3 #include <glibmm/fileutils.h>
6 #include "pbd/file_utils.h"
7 #include "pbd/compose.h"
8 #include "midi++/midnam_patch.h"
11 using namespace MIDI::Name;
13 CPPUNIT_TEST_SUITE_REGISTRATION( MidnamTest );
15 static string const prefix = "../../../patchfiles/";
18 MidnamTest::protools_patchfile_test()
20 XMLTree xmldoc(prefix + "ProtoolsPatchFile.midnam");
21 boost::shared_ptr<XMLSharedNodeList> result = xmldoc.find(
22 "//MIDINameDocument");
23 CPPUNIT_ASSERT(result->size() == 1);
25 result = xmldoc.find("//ChannelNameSet");
26 CPPUNIT_ASSERT(result->size() == 2);
28 MIDINameDocument doc(prefix + "ProtoolsPatchFile.midnam");
29 CPPUNIT_ASSERT(doc.all_models().size() == 1);
30 CPPUNIT_ASSERT(doc.author().find("Mark of the Unicorn") == 0);
32 const string model = doc.all_models().front();
33 CPPUNIT_ASSERT_EQUAL(string("SC-88 Pro"), model);
34 boost::shared_ptr<MasterDeviceNames> masterDeviceNames =
35 doc.master_device_names_by_model().find(model)->second;
36 CPPUNIT_ASSERT_EQUAL(string("Roland"), masterDeviceNames->manufacturer());
38 string modename = masterDeviceNames->custom_device_mode_names().front();
39 CPPUNIT_ASSERT_EQUAL(string("Mode 1"), modename);
41 boost::shared_ptr<CustomDeviceMode> mode =
42 masterDeviceNames->custom_device_mode_by_name(modename);
44 CPPUNIT_ASSERT_EQUAL(modename, mode->name());
46 string ns1 = string("Name Set 1");
47 string ns2 = string("Name Set 2");
49 for (uint8_t i = 0; i <= 15; i++) {
51 CPPUNIT_ASSERT_EQUAL(ns1,
52 mode->channel_name_set_name_by_channel(i));
54 CPPUNIT_ASSERT_EQUAL(ns2,
55 mode->channel_name_set_name_by_channel(i));
58 boost::shared_ptr<ChannelNameSet> nameSet1 =
59 masterDeviceNames->channel_name_set_by_device_mode_and_channel(
61 boost::shared_ptr<ChannelNameSet> nameSet2 =
62 masterDeviceNames->channel_name_set_by_device_mode_and_channel(
65 CPPUNIT_ASSERT_EQUAL(ns1, nameSet1->name());
66 CPPUNIT_ASSERT_EQUAL(ns2, nameSet2->name());
68 const ChannelNameSet::PatchBanks& banks1 = nameSet1->patch_banks();
69 const ChannelNameSet::PatchBanks& banks2 = nameSet2->patch_banks();
70 CPPUNIT_ASSERT(banks1.size() == 16);
71 CPPUNIT_ASSERT(banks2.size() == 1);
73 boost::shared_ptr<PatchBank> bank = banks1.front();
74 CPPUNIT_ASSERT_EQUAL(string("Piano"), bank->name());
75 const PatchBank::PatchNameList& plist1 = bank->patch_name_list();
76 CPPUNIT_ASSERT(plist1.size() == 110);
78 bank = banks2.front();
79 CPPUNIT_ASSERT_EQUAL(string("Drum sets"), bank->name());
80 const PatchBank::PatchNameList& plist2 = bank->patch_name_list();
81 CPPUNIT_ASSERT(plist2.size() == 49);
85 MidnamTest::yamaha_PSRS900_patchfile_test()
87 XMLTree xmldoc(prefix + "Yamaha-PSR-S900.midnam");
88 boost::shared_ptr<XMLSharedNodeList> result = xmldoc.find(
89 "//MIDINameDocument");
90 CPPUNIT_ASSERT(result->size() == 1);
92 result = xmldoc.find("//ChannelNameSet");
93 CPPUNIT_ASSERT(result->size() == 3);
95 MIDINameDocument doc(prefix + "Yamaha-PSR-S900.midnam");
96 CPPUNIT_ASSERT(doc.all_models().size() == 1);
97 CPPUNIT_ASSERT(doc.author().find("Hans Baier") == 0);
99 const string model = doc.all_models().front();
100 CPPUNIT_ASSERT_EQUAL(string("PSR-S900"), model);
101 boost::shared_ptr<MasterDeviceNames> masterDeviceNames =
102 doc.master_device_names_by_model().find(model)->second;
103 CPPUNIT_ASSERT_EQUAL(string("YAMAHA"), masterDeviceNames->manufacturer());
105 const MasterDeviceNames::CustomDeviceModeNames& modes = masterDeviceNames->custom_device_mode_names();
106 CPPUNIT_ASSERT(masterDeviceNames->custom_device_mode_names().size() == 3);
108 string modename = modes.front();
109 CPPUNIT_ASSERT_EQUAL(string("Standard"), modename);
111 modename = (*(++modes.begin()));
112 CPPUNIT_ASSERT_EQUAL(string("GM+XG"), modename);
114 modename = modes.back();
115 CPPUNIT_ASSERT_EQUAL(string("GM2"), modename);
117 for (list<string>::const_iterator modename = modes.begin(); modename != modes.end(); ++modename) {
118 boost::shared_ptr<CustomDeviceMode> mode =
119 masterDeviceNames->custom_device_mode_by_name(*modename);
121 CPPUNIT_ASSERT_EQUAL(*modename, mode->name());
123 string ns = mode->name();
125 if (ns != string("Standard"))
126 for (uint8_t i = 0; i <= 15; i++) {
127 CPPUNIT_ASSERT_EQUAL(ns,
128 mode->channel_name_set_name_by_channel(i));
129 boost::shared_ptr<ChannelNameSet> nameSet =
130 masterDeviceNames->channel_name_set_by_device_mode_and_channel(
133 CPPUNIT_ASSERT_EQUAL(ns, nameSet->name());
135 const ChannelNameSet::PatchBanks& banks1 = nameSet->patch_banks();
136 CPPUNIT_ASSERT(banks1.size() > 1);
138 boost::shared_ptr<PatchBank> bank = banks1.front();
139 const PatchBank::PatchNameList& list = bank->patch_name_list();
141 for(PatchBank::PatchNameList::const_iterator p = list.begin(); p != list.end(); ++p) {
143 if (ns == string("GM+XG")) {
144 cerr << "got Patch with name " << (*p)->name() << " bank " << (*p)->bank_number() << " program " << (int)(*p)->program_number() << endl;
145 uint8_t msb = (((*p)->bank_number()) >> 7) & 0x7f;
146 CPPUNIT_ASSERT( msb == 0 || msb == 64);
149 if (ns == string("GM2")) {
150 cerr << "got Patch with name " << (*p)->name() << " bank " << (*p)->bank_number() << " program " << (int)(*p)->program_number() << endl;
151 CPPUNIT_ASSERT((*p)->bank_number() >= (uint16_t(120) << 7));
159 MidnamTest::load_all_midnams_test ()
161 assert (Glib::file_test (prefix, Glib::FILE_TEST_IS_DIR));
163 Glib::PatternSpec pattern(string("*.midnam"));
164 vector<std::string> result;
166 PBD::find_matching_files_in_directory (prefix, pattern, result);
168 cout << "Loading " << result.size() << " MIDI patches from " << prefix << endl;
170 for (vector<std::string>::iterator i = result.begin(); i != result.end(); ++i) {
171 cout << "Processing file " << *i << endl;
172 boost::shared_ptr<MIDINameDocument> document(new MIDINameDocument(*i));
175 boost::shared_ptr<XMLSharedNodeList> result = xmldoc.find("//MIDINameDocument");
176 CPPUNIT_ASSERT(result->size() == 1);
178 result = xmldoc.find("//MasterDeviceNames");
179 CPPUNIT_ASSERT(result->size() == 1);
181 result = xmldoc.find("//ChannelNameSet");
182 CPPUNIT_ASSERT(result->size() >= 1);
184 result = xmldoc.find("//PatchBank");
185 //int banks = result->size();
188 result = xmldoc.find("//CustomDeviceMode[1]");
189 string deviceModeName = result->front()->property("Name")->value();
191 MIDINameDocument::MasterDeviceNamesList::const_iterator device =
192 document->master_device_names_by_model().begin();
194 string modename = device->second->custom_device_mode_names().front();
195 cerr << "modename:" << modename << endl;
196 boost::shared_ptr<CustomDeviceMode> mode = device->second->custom_device_mode_by_name(modename);
197 CPPUNIT_ASSERT_EQUAL(deviceModeName, mode->name());
199 boost::shared_ptr<ChannelNameSet> nameSet = device->second->channel_name_set_by_device_mode_and_channel(modename, 0);