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.
21 #ifndef MIDNAM_PATCH_H_
22 #define MIDNAM_PATCH_H_
30 #include "midi++/event.h"
31 #include "pbd/xml++.h"
39 struct PatchPrimaryKey
46 PatchPrimaryKey(int a_msb = -1, int a_lsb = -1, int a_program_number = -1) {
49 program_number = a_program_number;
53 return ((msb >= 0) && (msb <= 127) &&
54 (lsb >= 0) && (lsb <= 127) &&
55 (program_number >=0 ) && (program_number <= 127));
58 inline PatchPrimaryKey& operator=(const PatchPrimaryKey& id) {
61 program_number = id.program_number;
65 inline bool operator==(const PatchPrimaryKey& id) const {
66 return (msb == id.msb && lsb == id.lsb && program_number == id.program_number);
70 * obey strict weak ordering or crash in STL containers
72 inline bool operator<(const PatchPrimaryKey& id) const {
75 } else if (msb == id.msb && lsb < id.lsb) {
77 } else if (lsb == id.lsb && program_number < id.program_number) {
91 Patch (PatchBank* a_bank = 0);
92 Patch(std::string a_number, std::string a_name, PatchBank* a_bank = 0);
95 const std::string& name() const { return _name; }
96 void set_name(const std::string a_name) { _name = a_name; }
98 const std::string& number() const { return _number; }
99 void set_number(const std::string a_number) { _number = a_number; }
101 const PatchPrimaryKey& patch_primary_key() const { return _id; }
103 XMLNode& get_state (void);
104 int set_state (const XMLTree&, const XMLNode&);
106 int use_bank_info (PatchBank*);
117 typedef std::list<boost::shared_ptr<Patch> > PatchNameList;
119 PatchBank () : _id(0) {};
120 PatchBank (std::string a_name, PatchPrimaryKey* an_id = 0) : _name(a_name), _id(an_id) {};
121 virtual ~PatchBank() { delete _id; };
123 const std::string& name() const { return _name; }
124 void set_name(const std::string a_name) { _name = a_name; }
126 const PatchNameList& patch_name_list() const { return _patch_name_list; }
127 const std::string& patch_list_name() const { return _patch_list_name; }
129 int set_patch_name_list (const PatchNameList&);
131 const PatchPrimaryKey* patch_primary_key() const { return _id; }
133 XMLNode& get_state (void);
134 int set_state (const XMLTree&, const XMLNode&);
138 PatchNameList _patch_name_list;
139 PatchPrimaryKey* _id;
140 std::string _patch_list_name;
146 typedef std::set<uint8_t> AvailableForChannels;
147 typedef std::list<boost::shared_ptr<PatchBank> > PatchBanks;
148 typedef std::map<PatchPrimaryKey, boost::shared_ptr<Patch> > PatchMap;
149 typedef std::list<PatchPrimaryKey> PatchList;
152 virtual ~ChannelNameSet() {};
153 ChannelNameSet(std::string a_name) : _name(a_name) {};
155 const std::string& name() const { return _name; }
156 void set_name(const std::string a_name) { _name = a_name; }
158 const PatchBanks& patch_banks() const { return _patch_banks; }
160 bool available_for_channel(uint8_t channel) const {
161 return _available_for_channels.find(channel) != _available_for_channels.end();
164 boost::shared_ptr<Patch> find_patch(PatchPrimaryKey& key) {
165 assert(key.is_sane());
166 return _patch_map[key];
169 boost::shared_ptr<Patch> previous_patch(PatchPrimaryKey& key) {
170 assert(key.is_sane());
171 std::cerr << "finding patch with " << key.msb << "/" << key.lsb << "/" <<key.program_number << std::endl;
172 for (PatchList::const_iterator i = _patch_list.begin();
173 i != _patch_list.end();
176 if (i != _patch_list.begin()) {
177 std::cerr << "got it!" << std::endl;
179 return _patch_map[*i];
184 return boost::shared_ptr<Patch>();
187 boost::shared_ptr<Patch> next_patch(PatchPrimaryKey& key) {
188 assert(key.is_sane());
189 std::cerr << "finding patch with " << key.msb << "/" << key.lsb << "/" <<key.program_number << std::endl;
190 for (PatchList::const_iterator i = _patch_list.begin();
191 i != _patch_list.end();
194 if (++i != _patch_list.end()) {
195 std::cerr << "got it!" << std::endl;
196 return _patch_map[*i];
203 return boost::shared_ptr<Patch>();
206 XMLNode& get_state (void);
207 int set_state (const XMLTree&, const XMLNode&);
211 AvailableForChannels _available_for_channels;
212 PatchBanks _patch_banks;
214 PatchList _patch_list;
215 std::string _patch_list_name;
222 Note(std::string a_number, std::string a_name) : _number(a_number), _name(a_name) {};
225 const std::string& name() const { return _name; }
226 void set_name(const std::string a_name) { _name = a_name; }
228 const std::string& number() const { return _number; }
229 void set_number(const std::string a_number) { _number = a_number; }
231 XMLNode& get_state (void);
232 int set_state (const XMLTree&, const XMLNode&);
242 typedef std::list<boost::shared_ptr<Note> > Notes;
244 NoteNameList (std::string a_name) : _name(a_name) {};
247 const std::string& name() const { return _name; }
248 void set_name(const std::string a_name) { _name = a_name; }
250 const Notes& notes() const { return _notes; }
252 XMLNode& get_state (void);
253 int set_state (const XMLTree&, const XMLNode&);
260 class CustomDeviceMode
263 CustomDeviceMode() {};
264 virtual ~CustomDeviceMode() {};
266 const std::string& name() const { return _name; }
267 void set_name(const std::string a_name) { _name = a_name; }
270 XMLNode& get_state (void);
271 int set_state (const XMLTree&, const XMLNode&);
273 std::string channel_name_set_name_by_channel(uint8_t channel) {
274 assert(channel <= 15);
275 return _channel_name_set_assignments[channel];
279 /// array index = channel number
280 /// string contents = name of channel name set
282 std::string _channel_name_set_assignments[16];
285 class MasterDeviceNames
288 typedef std::list<std::string> Models;
289 /// maps name to CustomDeviceMode
290 typedef std::map<std::string, boost::shared_ptr<CustomDeviceMode> > CustomDeviceModes;
291 typedef std::list<std::string> CustomDeviceModeNames;
292 /// maps name to ChannelNameSet
293 typedef std::map<std::string, boost::shared_ptr<ChannelNameSet> > ChannelNameSets;
294 typedef std::list<boost::shared_ptr<NoteNameList> > NoteNameLists;
295 typedef std::map<std::string, PatchBank::PatchNameList> PatchNameLists;
297 MasterDeviceNames() {};
298 virtual ~MasterDeviceNames() {};
300 const std::string& manufacturer() const { return _manufacturer; }
301 void set_manufacturer(const std::string a_manufacturer) { _manufacturer = a_manufacturer; }
303 const Models& models() const { return _models; }
304 void set_models(const Models some_models) { _models = some_models; }
306 const CustomDeviceModeNames& custom_device_mode_names() const { return _custom_device_mode_names; }
308 boost::shared_ptr<CustomDeviceMode> custom_device_mode_by_name(std::string mode_name) {
309 assert(mode_name != "");
310 return _custom_device_modes[mode_name];
313 boost::shared_ptr<ChannelNameSet> channel_name_set_by_device_mode_and_channel(std::string mode, uint8_t channel) {
314 return _channel_name_sets[custom_device_mode_by_name(mode)->channel_name_set_name_by_channel(channel)];
317 boost::shared_ptr<Patch> find_patch(std::string mode, uint8_t channel, PatchPrimaryKey& key) {
318 return channel_name_set_by_device_mode_and_channel(mode, channel)->find_patch(key);
321 XMLNode& get_state (void);
322 int set_state (const XMLTree&, const XMLNode&);
325 std::string _manufacturer;
327 CustomDeviceModes _custom_device_modes;
328 CustomDeviceModeNames _custom_device_mode_names;
329 ChannelNameSets _channel_name_sets;
330 NoteNameLists _note_name_lists;
331 PatchNameLists _patch_name_lists;
334 class MIDINameDocument
337 // Maps Model names to MasterDeviceNames
338 typedef std::map<std::string, boost::shared_ptr<MasterDeviceNames> > MasterDeviceNamesList;
340 MIDINameDocument() {}
341 MIDINameDocument(const std::string &filename);
342 virtual ~MIDINameDocument() {};
344 const std::string& author() const { return _author; }
345 void set_author(const std::string an_author) { _author = an_author; }
347 const MasterDeviceNamesList& master_device_names_by_model() const { return _master_device_names_list; }
349 const MasterDeviceNames::Models& all_models() const { return _all_models; }
351 XMLNode& get_state (void);
352 int set_state (const XMLTree&, const XMLNode&);
356 MasterDeviceNamesList _master_device_names_list;
358 MasterDeviceNames::Models _all_models;
364 #endif /*MIDNAM_PATCH_H_*/