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_
34 #include "midi++/libmidi_visibility.h"
35 #include "midi++/event.h"
36 #include "pbd/xml++.h"
44 struct LIBMIDIPP_API PatchPrimaryKey
47 PatchPrimaryKey (int program_num = 0, int bank_num = 0)
48 : _bank(std::max(0, std::min(bank_num, 16383)))
49 , _program(std::max(0, std::min(program_num, 127)))
52 inline PatchPrimaryKey& operator=(const PatchPrimaryKey& id) {
54 _program = id._program;
58 inline bool operator==(const PatchPrimaryKey& id) const {
59 return (_bank == id._bank &&
60 _program == id._program);
63 /** Strict weak ordering. */
64 inline bool operator<(const PatchPrimaryKey& id) const {
65 if (_bank < id._bank) {
67 } else if (_bank == id._bank && _program < id._program) {
73 void set_bank(int bank) { _bank = std::max(0, std::min(bank, 16383)); }
74 void set_program(int program) { _program = std::max(0, std::min(program, 127)); }
76 inline uint16_t bank() const { return _bank; }
77 inline uint8_t program() const { return _program; }
86 class LIBMIDIPP_API Patch
90 Patch (std::string a_name = std::string(), uint8_t a_number = 0, uint16_t bank_number = 0);
93 const std::string& name() const { return _name; }
94 void set_name(const std::string& name) { _name = name; }
96 const std::string& note_list_name() const { return _note_list_name; }
98 uint8_t program_number() const { return _id.program(); }
99 void set_program_number(uint8_t n) { _id.set_program(n); }
101 uint16_t bank_number() const { return _id.bank(); }
102 void set_bank_number (uint16_t n) { _id.set_bank(n); }
104 const PatchPrimaryKey& patch_primary_key() const { return _id; }
106 XMLNode& get_state (void);
107 int set_state (const XMLTree&, const XMLNode&);
112 std::string _note_list_name;
115 typedef std::list<boost::shared_ptr<Patch> > PatchNameList;
117 class LIBMIDIPP_API PatchBank
120 PatchBank (uint16_t n = 0, std::string a_name = std::string()) : _name(a_name), _number (n) {};
121 virtual ~PatchBank() { }
123 const std::string& name() const { return _name; }
124 void set_name(const std::string& a_name) { _name = a_name; }
126 int number() const { return _number; }
128 const PatchNameList& patch_name_list() const { return _patch_name_list; }
129 const std::string& patch_list_name() const { return _patch_list_name; }
131 int set_patch_name_list (const PatchNameList&);
133 XMLNode& get_state (void);
134 int set_state (const XMLTree&, const XMLNode&);
139 PatchNameList _patch_name_list;
140 std::string _patch_list_name;
143 class LIBMIDIPP_API ChannelNameSet
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& name) : _name(name) {};
155 const std::string& name() const { return _name; }
156 void set_name(const std::string& name) { _name = 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(const PatchPrimaryKey& key) {
165 return _patch_map[key];
168 boost::shared_ptr<Patch> previous_patch(const PatchPrimaryKey& key) {
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 for (PatchList::const_iterator i = _patch_list.begin();
185 i != _patch_list.end();
188 if (++i != _patch_list.end()) {
189 return _patch_map[*i];
196 return boost::shared_ptr<Patch>();
199 const std::string& note_list_name() const { return _note_list_name; }
200 const std::string& control_list_name() const { return _control_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 PatchNameList&);
209 friend std::ostream& operator<< (std::ostream&, const ChannelNameSet&);
212 AvailableForChannels _available_for_channels;
213 PatchBanks _patch_banks;
215 PatchList _patch_list;
216 std::string _patch_list_name;
217 std::string _note_list_name;
218 std::string _control_list_name;
221 std::ostream& operator<< (std::ostream&, const ChannelNameSet&);
223 class LIBMIDIPP_API Note
227 Note(uint8_t number, const std::string& name) : _number(number), _name(name) {}
229 const std::string& name() const { return _name; }
230 void set_name(const std::string& name) { _name = name; }
232 uint8_t number() const { return _number; }
233 void set_number(uint8_t number) { _number = number; }
235 XMLNode& get_state (void);
236 int set_state (const XMLTree&, const XMLNode&);
243 class LIBMIDIPP_API NoteNameList
246 typedef std::vector< boost::shared_ptr<Note> > Notes;
248 NoteNameList() { _notes.resize(128); }
249 NoteNameList (const std::string& name) : _name(name) { _notes.resize(128); }
251 const std::string& name() const { return _name; }
252 const Notes& notes() const { return _notes; }
254 void set_name(const std::string& name) { _name = name; }
256 XMLNode& get_state (void);
257 int set_state (const XMLTree&, const XMLNode&);
264 class LIBMIDIPP_API Value
268 Value(const uint16_t number,
269 const std::string& name)
274 uint16_t number() const { return _number; }
275 const std::string& name() const { return _name; }
277 void set_number(uint16_t number) { _number = number; }
278 void set_name(const std::string& name) { _name = name; }
280 XMLNode& get_state(void);
281 int set_state(const XMLTree&, const XMLNode&);
288 class LIBMIDIPP_API ValueNameList
291 typedef std::map<uint16_t, boost::shared_ptr<Value> > Values;
294 ValueNameList(const std::string& name) : _name(name) {}
296 const std::string& name() const { return _name; }
298 void set_name(const std::string& name) { _name = name; }
300 boost::shared_ptr<const Value> value(uint16_t num) const;
301 boost::shared_ptr<const Value> max_value_below(uint16_t num) const;
303 const Values& values() const { return _values; }
305 XMLNode& get_state(void);
306 int set_state(const XMLTree&, const XMLNode&);
313 class LIBMIDIPP_API Control
317 Control(const std::string& type,
318 const uint16_t number,
319 const std::string& name)
325 const std::string& type() const { return _type; }
326 uint16_t number() const { return _number; }
327 const std::string& name() const { return _name; }
329 const std::string& value_name_list_name() const { return _value_name_list_name; }
330 boost::shared_ptr<const ValueNameList> value_name_list() const { return _value_name_list; }
332 void set_type(const std::string& type) { _type = type; }
333 void set_number(uint16_t number) { _number = number; }
334 void set_name(const std::string& name) { _name = name; }
336 XMLNode& get_state(void);
337 int set_state(const XMLTree&, const XMLNode&);
344 std::string _value_name_list_name; ///< Global, UsesValueNameList
345 boost::shared_ptr<ValueNameList> _value_name_list; ///< Local, ValueNameList
348 class LIBMIDIPP_API ControlNameList
351 typedef std::map<uint16_t, boost::shared_ptr<Control> > Controls;
354 ControlNameList(const std::string& name) : _name(name) {}
356 const std::string& name() const { return _name; }
358 void set_name(const std::string& name) { _name = name; }
360 boost::shared_ptr<const Control> control(uint16_t num) const;
362 const Controls& controls() const { return _controls; }
364 XMLNode& get_state(void);
365 int set_state(const XMLTree&, const XMLNode&);
372 class LIBMIDIPP_API CustomDeviceMode
375 CustomDeviceMode() {};
376 virtual ~CustomDeviceMode() {};
378 const std::string& name() const { return _name; }
379 void set_name(const std::string& name) { _name = name; }
382 XMLNode& get_state (void);
383 int set_state (const XMLTree&, const XMLNode&);
385 /// Note: channel here is 0-based while in the MIDNAM-file it's 1-based
386 const std::string& channel_name_set_name_by_channel(uint8_t channel) {
387 assert(channel <= 15);
388 return _channel_name_set_assignments[channel];
392 /// array index = channel number
393 /// string contents = name of channel name set
395 std::string _channel_name_set_assignments[16];
398 class LIBMIDIPP_API MasterDeviceNames
401 typedef std::set<std::string> Models;
402 /// maps name to CustomDeviceMode
403 typedef std::map<std::string, boost::shared_ptr<CustomDeviceMode> > CustomDeviceModes;
404 typedef std::list<std::string> CustomDeviceModeNames;
405 /// maps name to ChannelNameSet
406 typedef std::map<std::string, boost::shared_ptr<ChannelNameSet> > ChannelNameSets;
407 typedef std::map<std::string, boost::shared_ptr<NoteNameList> > NoteNameLists;
408 typedef std::map<std::string, boost::shared_ptr<ControlNameList> > ControlNameLists;
409 typedef std::map<std::string, boost::shared_ptr<ValueNameList> > ValueNameLists;
410 typedef std::map<std::string, PatchNameList> PatchNameLists;
412 MasterDeviceNames() {};
413 virtual ~MasterDeviceNames() {};
415 const std::string& manufacturer() const { return _manufacturer; }
416 void set_manufacturer(const std::string& manufacturer) { _manufacturer = manufacturer; }
418 const Models& models() const { return _models; }
419 void set_models(const Models some_models) { _models = some_models; }
421 const ControlNameLists& controls() const { return _control_name_lists; }
422 const ValueNameLists& values() const { return _value_name_lists; }
424 boost::shared_ptr<const ValueNameList> value_name_list_by_control(
425 const std::string& mode,
429 const CustomDeviceModeNames& custom_device_mode_names() const { return _custom_device_mode_names; }
431 boost::shared_ptr<CustomDeviceMode> custom_device_mode_by_name(const std::string& mode_name);
432 boost::shared_ptr<ChannelNameSet> channel_name_set_by_channel(const std::string& mode, uint8_t channel);
433 boost::shared_ptr<Patch> find_patch(const std::string& mode, uint8_t channel, const PatchPrimaryKey& key);
435 boost::shared_ptr<ControlNameList> control_name_list(const std::string& name);
436 boost::shared_ptr<ValueNameList> value_name_list(const std::string& name);
437 boost::shared_ptr<NoteNameList> note_name_list(const std::string& name);
438 boost::shared_ptr<ChannelNameSet> channel_name_set(const std::string& name);
440 std::string note_name(const std::string& mode_name,
446 XMLNode& get_state (void);
447 int set_state (const XMLTree&, const XMLNode&);
450 std::string _manufacturer;
452 CustomDeviceModes _custom_device_modes;
453 CustomDeviceModeNames _custom_device_mode_names;
454 ChannelNameSets _channel_name_sets;
455 NoteNameLists _note_name_lists;
456 PatchNameLists _patch_name_lists;
457 ControlNameLists _control_name_lists;
458 ValueNameLists _value_name_lists;
461 class LIBMIDIPP_API MIDINameDocument
464 // Maps Model names to MasterDeviceNames
465 typedef std::map<std::string, boost::shared_ptr<MasterDeviceNames> > MasterDeviceNamesList;
467 MIDINameDocument() {}
468 MIDINameDocument(const std::string& filename);
469 virtual ~MIDINameDocument() {};
471 const std::string& author() const { return _author; }
472 void set_author(const std::string& author) { _author = author; }
474 boost::shared_ptr<MasterDeviceNames> master_device_names(const std::string& model);
476 const MasterDeviceNamesList& master_device_names_by_model() const { return _master_device_names_list; }
478 const MasterDeviceNames::Models& all_models() const { return _all_models; }
480 XMLNode& get_state (void);
481 int set_state (const XMLTree&, const XMLNode&);
485 MasterDeviceNamesList _master_device_names_list;
486 MasterDeviceNames::Models _all_models;
489 LIBMIDIPP_API extern const char* general_midi_program_names[128]; /* 0 .. 127 */
494 #endif /*MIDNAM_PATCH_H_*/