2 Copyright (C) 2012 Paul Davis
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef MIDNAM_PATCH_H_
21 #define MIDNAM_PATCH_H_
33 #include "midi++/event.h"
34 #include "pbd/xml++.h"
42 struct PatchPrimaryKey
48 PatchPrimaryKey (uint8_t a_program_number = 0, uint16_t a_bank_number = 0) {
49 bank_number = std::min (a_bank_number, (uint16_t) 16384);
50 program_number = std::min (a_program_number, (uint8_t) 127);
53 bool is_sane() const {
54 return ((bank_number >= 0) && (bank_number <= 16384) &&
55 (program_number >=0 ) && (program_number <= 127));
58 inline PatchPrimaryKey& operator=(const PatchPrimaryKey& id) {
59 bank_number = id.bank_number;
60 program_number = id.program_number;
64 inline bool operator==(const PatchPrimaryKey& id) const {
65 return (bank_number == id.bank_number && program_number == id.program_number);
69 * obey strict weak ordering or crash in STL containers
71 inline bool operator<(const PatchPrimaryKey& id) const {
72 if (bank_number < id.bank_number) {
74 } else if (bank_number == id.bank_number && program_number < id.program_number) {
88 Patch (std::string a_name = std::string(), uint8_t a_number = 0, uint16_t bank_number = 0);
91 const std::string& name() const { return _name; }
92 void set_name(const std::string a_name) { _name = a_name; }
94 const std::string& note_list_name() const { return _note_list_name; }
96 uint8_t program_number() const { return _id.program_number; }
97 void set_program_number(uint8_t n) { _id.program_number = n; }
99 uint16_t bank_number() const { return _id.bank_number; }
100 void set_bank_number (uint16_t n) { _id.bank_number = n; }
102 const PatchPrimaryKey& patch_primary_key() const { return _id; }
104 XMLNode& get_state (void);
105 int set_state (const XMLTree&, const XMLNode&);
110 std::string _note_list_name;
116 typedef std::list<boost::shared_ptr<Patch> > PatchNameList;
118 PatchBank (uint16_t n = 0, std::string a_name = std::string()) : _name(a_name), _number (n) {};
119 virtual ~PatchBank() { }
121 const std::string& name() const { return _name; }
122 void set_name(const std::string a_name) { _name = a_name; }
124 int number() const { return _number; }
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 XMLNode& get_state (void);
132 int set_state (const XMLTree&, const XMLNode&);
137 PatchNameList _patch_name_list;
138 std::string _patch_list_name;
144 typedef std::set<uint8_t> AvailableForChannels;
145 typedef std::list<boost::shared_ptr<PatchBank> > PatchBanks;
146 typedef std::map<PatchPrimaryKey, boost::shared_ptr<Patch> > PatchMap;
147 typedef std::list<PatchPrimaryKey> PatchList;
150 virtual ~ChannelNameSet() {};
151 ChannelNameSet(std::string a_name) : _name(a_name) {};
153 const std::string& name() const { return _name; }
154 void set_name(const std::string a_name) { _name = a_name; }
156 const PatchBanks& patch_banks() const { return _patch_banks; }
158 bool available_for_channel(uint8_t channel) const {
159 return _available_for_channels.find(channel) != _available_for_channels.end();
162 boost::shared_ptr<Patch> find_patch(const PatchPrimaryKey& key) {
163 assert(key.is_sane());
164 return _patch_map[key];
167 boost::shared_ptr<Patch> previous_patch(const PatchPrimaryKey& key) {
168 assert(key.is_sane());
169 for (PatchList::const_iterator i = _patch_list.begin();
170 i != _patch_list.end();
173 if (i != _patch_list.begin()) {
175 return _patch_map[*i];
180 return boost::shared_ptr<Patch>();
183 boost::shared_ptr<Patch> next_patch(const PatchPrimaryKey& key) {
184 assert(key.is_sane());
185 for (PatchList::const_iterator i = _patch_list.begin();
186 i != _patch_list.end();
189 if (++i != _patch_list.end()) {
190 return _patch_map[*i];
197 return boost::shared_ptr<Patch>();
200 const std::string& note_list_name() const { return _note_list_name; }
202 XMLNode& get_state (void);
203 int set_state (const XMLTree&, const XMLNode&);
205 void set_patch_banks (const PatchBanks&);
206 void use_patch_name_list (const PatchBank::PatchNameList&);
209 friend std::ostream& operator<< (std::ostream&, const ChannelNameSet&);
211 AvailableForChannels _available_for_channels;
212 PatchBanks _patch_banks;
214 PatchList _patch_list;
215 std::string _patch_list_name;
216 std::string _note_list_name;
219 std::ostream& operator<< (std::ostream&, const ChannelNameSet&);
225 Note(uint8_t number, const std::string& name) : _number(number), _name(name) {}
227 const std::string& name() const { return _name; }
228 void set_name(const std::string& name) { _name = name; }
230 uint8_t number() const { return _number; }
231 void set_number(uint8_t number) { _number = number; }
233 XMLNode& get_state (void);
234 int set_state (const XMLTree&, const XMLNode&);
244 typedef std::vector< boost::shared_ptr<Note> > Notes;
246 NoteNameList() { _notes.resize(128); }
247 NoteNameList (const std::string& name) : _name(name) { _notes.resize(128); }
249 const std::string& name() const { return _name; }
250 const Notes& notes() const { return _notes; }
252 void set_name(const std::string& name) { _name = name; }
254 XMLNode& get_state (void);
255 int set_state (const XMLTree&, const XMLNode&);
266 Control(const std::string& type,
267 const std::string& number,
268 const std::string& name)
274 const std::string& type() const { return _type; }
275 const std::string& number() const { return _number; }
276 const std::string& name() const { return _name; }
278 void set_type(const std::string& type) { _type = type; }
279 void set_number(const std::string& number) { _number = number; }
280 void set_name(const std::string& name) { _name = name; }
282 XMLNode& get_state(void);
283 int set_state(const XMLTree&, const XMLNode&);
291 class ControlNameList
294 typedef std::list< boost::shared_ptr<Control> > Controls;
297 ControlNameList(const std::string& name) : _name(name) {}
299 const std::string& name() const { return _name; }
301 void set_name(const std::string name) { _name = name; }
303 const Controls& controls() const { return _controls; }
305 XMLNode& get_state(void);
306 int set_state(const XMLTree&, const XMLNode&);
313 class CustomDeviceMode
316 CustomDeviceMode() {};
317 virtual ~CustomDeviceMode() {};
319 const std::string& name() const { return _name; }
320 void set_name(const std::string a_name) { _name = a_name; }
323 XMLNode& get_state (void);
324 int set_state (const XMLTree&, const XMLNode&);
326 /// Note: channel here is 0-based while in the MIDNAM-file it's 1-based
327 std::string channel_name_set_name_by_channel(uint8_t channel) {
328 assert(channel <= 15);
329 return _channel_name_set_assignments[channel];
333 /// array index = channel number
334 /// string contents = name of channel name set
336 std::string _channel_name_set_assignments[16];
339 class MasterDeviceNames
342 typedef std::set<std::string> Models;
343 /// maps name to CustomDeviceMode
344 typedef std::map<std::string, boost::shared_ptr<CustomDeviceMode> > CustomDeviceModes;
345 typedef std::list<std::string> CustomDeviceModeNames;
346 /// maps name to ChannelNameSet
347 typedef std::map<std::string, boost::shared_ptr<ChannelNameSet> > ChannelNameSets;
348 typedef std::map<std::string, boost::shared_ptr<NoteNameList> > NoteNameLists;
349 typedef std::list<boost::shared_ptr<ControlNameList> > ControlNameLists;
350 typedef std::map<std::string, PatchBank::PatchNameList> PatchNameLists;
352 MasterDeviceNames() {};
353 virtual ~MasterDeviceNames() {};
355 const std::string& manufacturer() const { return _manufacturer; }
356 void set_manufacturer(const std::string a_manufacturer) { _manufacturer = a_manufacturer; }
358 const Models& models() const { return _models; }
359 void set_models(const Models some_models) { _models = some_models; }
361 const ControlNameLists& controls() const { return _control_name_lists; }
363 const CustomDeviceModeNames& custom_device_mode_names() const { return _custom_device_mode_names; }
365 boost::shared_ptr<CustomDeviceMode> custom_device_mode_by_name(std::string mode_name);
366 boost::shared_ptr<ChannelNameSet> channel_name_set_by_device_mode_and_channel(std::string mode, uint8_t channel);
367 boost::shared_ptr<Patch> find_patch(std::string mode, uint8_t channel, const PatchPrimaryKey& key);
369 boost::shared_ptr<NoteNameList> note_name_list(const std::string& name);
370 boost::shared_ptr<ChannelNameSet> channel_name_set(const std::string& name);
372 std::string note_name(const std::string& mode_name,
378 XMLNode& get_state (void);
379 int set_state (const XMLTree&, const XMLNode&);
382 std::string _manufacturer;
384 CustomDeviceModes _custom_device_modes;
385 CustomDeviceModeNames _custom_device_mode_names;
386 ChannelNameSets _channel_name_sets;
387 NoteNameLists _note_name_lists;
388 PatchNameLists _patch_name_lists;
389 ControlNameLists _control_name_lists;
392 class MIDINameDocument
395 // Maps Model names to MasterDeviceNames
396 typedef std::map<std::string, boost::shared_ptr<MasterDeviceNames> > MasterDeviceNamesList;
398 MIDINameDocument() {}
399 MIDINameDocument(const std::string &filename);
400 virtual ~MIDINameDocument() {};
402 const std::string& author() const { return _author; }
403 void set_author(const std::string an_author) { _author = an_author; }
405 boost::shared_ptr<MasterDeviceNames> master_device_names(const std::string& model);
407 const MasterDeviceNamesList& master_device_names_by_model() const { return _master_device_names_list; }
409 const MasterDeviceNames::Models& all_models() const { return _all_models; }
411 XMLNode& get_state (void);
412 int set_state (const XMLTree&, const XMLNode&);
416 MasterDeviceNamesList _master_device_names_list;
418 MasterDeviceNames::Models _all_models;
421 extern const char* general_midi_program_names[128]; /* 0 .. 127 */
426 #endif /*MIDNAM_PATCH_H_*/