#define MIDNAM_PATCH_H_
#include <algorithm>
+#include <cassert>
#include <iostream>
#include <string>
#include <list>
struct LIBMIDIPP_API PatchPrimaryKey
{
public:
- int bank_number;
- int program_number;
+ PatchPrimaryKey (int program_num = 0, int bank_num = 0)
+ : _bank(std::max(0, std::min(bank_num, 16383)))
+ , _program(std::max(0, std::min(program_num, 127)))
+ {}
- PatchPrimaryKey (uint8_t a_program_number = 0, uint16_t a_bank_number = 0) {
- bank_number = std::min (a_bank_number, (uint16_t) 16384);
- program_number = std::min (a_program_number, (uint8_t) 127);
- }
-
- bool is_sane() const {
- return ((bank_number >= 0) && (bank_number <= 16384) &&
- (program_number >=0 ) && (program_number <= 127));
- }
-
inline PatchPrimaryKey& operator=(const PatchPrimaryKey& id) {
- bank_number = id.bank_number;
- program_number = id.program_number;
+ _bank = id._bank;
+ _program = id._program;
return *this;
}
-
+
inline bool operator==(const PatchPrimaryKey& id) const {
- return (bank_number == id.bank_number && program_number == id.program_number);
+ return (_bank == id._bank &&
+ _program == id._program);
}
-
- /**
- * obey strict weak ordering or crash in STL containers
- */
+
+ /** Strict weak ordering. */
inline bool operator<(const PatchPrimaryKey& id) const {
- if (bank_number < id.bank_number) {
+ if (_bank < id._bank) {
return true;
- } else if (bank_number == id.bank_number && program_number < id.program_number) {
+ } else if (_bank == id._bank && _program < id._program) {
return true;
}
-
return false;
}
+
+ void set_bank(int bank) { _bank = std::max(0, std::min(bank, 16383)); }
+ void set_program(int program) { _program = std::max(0, std::min(program, 127)); }
+
+ inline uint16_t bank() const { return _bank; }
+ inline uint8_t program() const { return _program; }
+
+private:
+ uint16_t _bank;
+ uint8_t _program;
};
class PatchBank;
-
-class LIBMIDIPP_API Patch
+
+class LIBMIDIPP_API Patch
{
public:
const std::string& name() const { return _name; }
void set_name(const std::string& name) { _name = name; }
-
+
const std::string& note_list_name() const { return _note_list_name; }
- uint8_t program_number() const { return _id.program_number; }
- void set_program_number(uint8_t n) { _id.program_number = n; }
+ uint8_t program_number() const { return _id.program(); }
+ void set_program_number(uint8_t n) { _id.set_program(n); }
- uint16_t bank_number() const { return _id.bank_number; }
- void set_bank_number (uint16_t n) { _id.bank_number = n; }
+ uint16_t bank_number() const { return _id.bank(); }
+ void set_bank_number (uint16_t n) { _id.set_bank(n); }
const PatchPrimaryKey& patch_primary_key() const { return _id; }
typedef std::list<boost::shared_ptr<Patch> > PatchNameList;
-class LIBMIDIPP_API PatchBank
+class LIBMIDIPP_API PatchBank
{
public:
PatchBank (uint16_t n = 0, std::string a_name = std::string()) : _name(a_name), _number (n) {};
const std::string& name() const { return _name; }
void set_name(const std::string& name) { _name = name; }
-
+
const PatchBanks& patch_banks() const { return _patch_banks; }
- bool available_for_channel(uint8_t channel) const {
- return _available_for_channels.find(channel) != _available_for_channels.end();
+ bool available_for_channel(uint8_t channel) const {
+ return _available_for_channels.find(channel) != _available_for_channels.end();
}
-
+
boost::shared_ptr<Patch> find_patch(const PatchPrimaryKey& key) {
- assert(key.is_sane());
return _patch_map[key];
}
-
+
boost::shared_ptr<Patch> previous_patch(const PatchPrimaryKey& key) {
- assert(key.is_sane());
for (PatchList::const_iterator i = _patch_list.begin();
i != _patch_list.end();
++i) {
if (i != _patch_list.begin()) {
--i;
return _patch_map[*i];
- }
+ }
}
}
-
+
return boost::shared_ptr<Patch>();
}
-
+
boost::shared_ptr<Patch> next_patch(const PatchPrimaryKey& key) {
- assert(key.is_sane());
for (PatchList::const_iterator i = _patch_list.begin();
i != _patch_list.end();
++i) {
}
}
}
-
+
return boost::shared_ptr<Patch>();
}
std::string _name;
};
-class LIBMIDIPP_API NoteNameList
+class LIBMIDIPP_API NoteNameList
{
public:
typedef std::vector< boost::shared_ptr<Note> > Notes;
boost::shared_ptr<ValueNameList> _value_name_list; ///< Local, ValueNameList
};
-class LIBMIDIPP_API ControlNameList
+class LIBMIDIPP_API ControlNameList
{
public:
typedef std::map<uint16_t, boost::shared_ptr<Control> > Controls;
const std::string& name() const { return _name; }
void set_name(const std::string& name) { _name = name; }
-
+
XMLNode& get_state (void);
int set_state (const XMLTree&, const XMLNode&);
-
+
/// Note: channel here is 0-based while in the MIDNAM-file it's 1-based
const std::string& channel_name_set_name_by_channel(uint8_t channel) {
assert(channel <= 15);
- return _channel_name_set_assignments[channel];
+ return _channel_name_set_assignments[channel];
}
-
+
private:
/// array index = channel number
- /// string contents = name of channel name set
+ /// string contents = name of channel name set
std::string _name;
std::string _channel_name_set_assignments[16];
};
typedef std::map<std::string, boost::shared_ptr<ControlNameList> > ControlNameLists;
typedef std::map<std::string, boost::shared_ptr<ValueNameList> > ValueNameLists;
typedef std::map<std::string, PatchNameList> PatchNameLists;
-
+
MasterDeviceNames() {};
virtual ~MasterDeviceNames() {};
-
+
const std::string& manufacturer() const { return _manufacturer; }
void set_manufacturer(const std::string& manufacturer) { _manufacturer = manufacturer; }
-
+
const Models& models() const { return _models; }
void set_models(const Models some_models) { _models = some_models; }
uint8_t number);
const CustomDeviceModeNames& custom_device_mode_names() const { return _custom_device_mode_names; }
-
+
boost::shared_ptr<CustomDeviceMode> custom_device_mode_by_name(const std::string& mode_name);
boost::shared_ptr<ChannelNameSet> channel_name_set_by_channel(const std::string& mode, uint8_t channel);
boost::shared_ptr<Patch> find_patch(const std::string& mode, uint8_t channel, const PatchPrimaryKey& key);
XMLNode& get_state (void);
int set_state (const XMLTree&, const XMLNode&);
-
+
private:
std::string _manufacturer;
Models _models;
public:
// Maps Model names to MasterDeviceNames
typedef std::map<std::string, boost::shared_ptr<MasterDeviceNames> > MasterDeviceNamesList;
-
+
MIDINameDocument() {}
- MIDINameDocument(const std::string& filename);
+ MIDINameDocument(const std::string& file_path);
virtual ~MIDINameDocument() {};
+ const std::string& file_path () const { return _file_path; }
+
const std::string& author() const { return _author; }
void set_author(const std::string& author) { _author = author; }
-
+
boost::shared_ptr<MasterDeviceNames> master_device_names(const std::string& model);
const MasterDeviceNamesList& master_device_names_by_model() const { return _master_device_names_list; }
-
+
const MasterDeviceNames::Models& all_models() const { return _all_models; }
-
+
XMLNode& get_state (void);
int set_state (const XMLTree&, const XMLNode&);
private:
+ const std::string _file_path;
std::string _author;
MasterDeviceNamesList _master_device_names_list;
- XMLTree _document;
MasterDeviceNames::Models _all_models;
};