diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-06-12 04:05:10 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-06-12 04:05:10 +0000 |
commit | 557f56a7f2173fdf9b01dfb3f3410f227d05f8e2 (patch) | |
tree | 2ebd0a0655fadffcb962591355fd0d4a9c7e7ce6 /libs/midi++2 | |
parent | cf0753a4bd4ed23d40fd06e8d1dec4f0b46da6fc (diff) |
more changes to patch change/plugin preset support - replace regexp replacement with boost::replace_all(), actually find programs/patches in the data we have, and more. notable changes to constructors and structure of various MIDI::Name objects
git-svn-id: svn://localhost/ardour2/branches/3.0@12667 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/midi++2')
-rw-r--r-- | libs/midi++2/midi++/midnam_patch.h | 47 | ||||
-rw-r--r-- | libs/midi++2/midnam_patch.cc | 91 |
2 files changed, 58 insertions, 80 deletions
diff --git a/libs/midi++2/midi++/midnam_patch.h b/libs/midi++2/midi++/midnam_patch.h index 276b402086..7a570ad3ff 100644 --- a/libs/midi++2/midi++/midnam_patch.h +++ b/libs/midi++2/midi++/midnam_patch.h @@ -21,12 +21,15 @@ #ifndef MIDNAM_PATCH_H_ #define MIDNAM_PATCH_H_ +#include <algorithm> #include <iostream> #include <string> #include <list> #include <set> #include <map> +#include <stdint.h> + #include "midi++/event.h" #include "pbd/xml++.h" @@ -42,9 +45,9 @@ public: int bank_number; int program_number; - PatchPrimaryKey(int a_bank_number = -1, int a_program_number = -1) { - bank_number = a_bank_number; - program_number = a_program_number; + 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() { @@ -82,27 +85,26 @@ class Patch { public: - Patch (PatchBank* a_bank = 0); - Patch(std::string a_number, std::string a_name, PatchBank* a_bank = 0); + Patch (std::string a_name = std::string(), uint8_t a_number = 0, uint16_t bank_number = 0); virtual ~Patch() {}; const std::string& name() const { return _name; } void set_name(const std::string a_name) { _name = a_name; } - const std::string& number() const { return _number; } - void set_number(const std::string a_number) { _number = a_number; } - + uint8_t program_number() const { return _id.program_number; } + void set_program_number(uint8_t n) { _id.program_number = n; } + + uint16_t bank_number() const { return _id.bank_number; } + void set_bank_number (uint16_t n) { _id.bank_number = n; } + const PatchPrimaryKey& patch_primary_key() const { return _id; } - XMLNode& get_state (void); + XMLNode& get_state (void); int set_state (const XMLTree&, const XMLNode&); - int use_bank_info (PatchBank*); - private: - std::string _number; - std::string _name; - PatchPrimaryKey _id; + std::string _name; + PatchPrimaryKey _id; }; class PatchBank @@ -110,27 +112,26 @@ class PatchBank public: typedef std::list<boost::shared_ptr<Patch> > PatchNameList; - PatchBank () : _id(0) {}; - PatchBank (std::string a_name, PatchPrimaryKey* an_id = 0) : _name(a_name), _id(an_id) {}; - virtual ~PatchBank() { delete _id; }; + PatchBank (uint16_t n = 0, std::string a_name = std::string()) : _name(a_name), _number (n) {}; + virtual ~PatchBank() { } const std::string& name() const { return _name; } void set_name(const std::string a_name) { _name = a_name; } + int number() const { return _number; } + const PatchNameList& patch_name_list() const { return _patch_name_list; } const std::string& patch_list_name() const { return _patch_list_name; } int set_patch_name_list (const PatchNameList&); - const PatchPrimaryKey* patch_primary_key() const { return _id; } - - XMLNode& get_state (void); + XMLNode& get_state (void); int set_state (const XMLTree&, const XMLNode&); private: std::string _name; + uint16_t _number; PatchNameList _patch_name_list; - PatchPrimaryKey* _id; std::string _patch_list_name; }; @@ -162,13 +163,11 @@ public: boost::shared_ptr<Patch> previous_patch(PatchPrimaryKey& key) { assert(key.is_sane()); - std::cerr << "finding patch with " << key.bank_number << "/" <<key.program_number << std::endl; for (PatchList::const_iterator i = _patch_list.begin(); i != _patch_list.end(); ++i) { if ((*i) == key) { if (i != _patch_list.begin()) { - std::cerr << "got it!" << std::endl; --i; return _patch_map[*i]; } @@ -180,13 +179,11 @@ public: boost::shared_ptr<Patch> next_patch(PatchPrimaryKey& key) { assert(key.is_sane()); - std::cerr << "finding patch with " << key.bank_number << "/" <<key.program_number << std::endl; for (PatchList::const_iterator i = _patch_list.begin(); i != _patch_list.end(); ++i) { if ((*i) == key) { if (++i != _patch_list.end()) { - std::cerr << "got it!" << std::endl; return _patch_map[*i]; } else { --i; diff --git a/libs/midi++2/midnam_patch.cc b/libs/midi++2/midnam_patch.cc index 1ad5cf9dc5..fea9c09704 100644 --- a/libs/midi++2/midnam_patch.cc +++ b/libs/midi++2/midnam_patch.cc @@ -35,36 +35,11 @@ namespace MIDI namespace Name { - -Patch::Patch (PatchBank* b) -{ - use_bank_info (b); -} - -Patch::Patch (std::string a_number, std::string a_name, PatchBank* a_bank) - : _number (a_number) - , _name (a_name) -{ - use_bank_info (a_bank); -} - -XMLNode& -Patch::get_state (void) + +Patch::Patch (std::string name, uint8_t p_number, uint16_t b_number) + : _name (name) + , _id (p_number, b_number) { - XMLNode* node = new XMLNode("Patch"); - node->add_property("Number", _number); - node->add_property("Name", _name); - /* - typedef std::list< boost::shared_ptr< Evoral::MIDIEvent<double> > > PatchMidiCommands; - XMLNode* commands = node->add_child("PatchMIDICommands"); - for (PatchMidiCommands::const_iterator event = _patch_midi_commands.begin(); - event != _patch_midi_commands.end(); - ++event) { - commands->add_child_copy(*((((Evoral::MIDIEvent&)*event)).to_xml())); - } - */ - - return *node; } int initialize_primary_key_from_commands (PatchPrimaryKey& id, const XMLNode* node) @@ -95,6 +70,29 @@ int initialize_primary_key_from_commands (PatchPrimaryKey& id, const XMLNode* no return 0; } +XMLNode& +Patch::get_state (void) +{ + XMLNode* node = new XMLNode("Patch"); + + /* XXX this is totally wrong */ + + node->add_property("Number", string_compose ("%1", _id.program_number)); + node->add_property("Name", _name); + + /* + typedef std::list< boost::shared_ptr< Evoral::MIDIEvent<double> > > PatchMidiCommands; + XMLNode* commands = node->add_child("PatchMIDICommands"); + for (PatchMidiCommands::const_iterator event = _patch_midi_commands.begin(); + event != _patch_midi_commands.end(); + ++event) { + commands->add_child_copy(*((((Evoral::MIDIEvent&)*event)).to_xml())); + } + */ + + return *node; +} + int Patch::set_state (const XMLTree&, const XMLNode& node) { @@ -108,7 +106,7 @@ Patch::set_state (const XMLTree&, const XMLNode& node) if (!prop) { return -1; } - _number = prop->value(); + _id.program_number = PBD::atoi (prop->value()); prop = node.property ("Name"); @@ -129,23 +127,6 @@ Patch::set_state (const XMLTree&, const XMLNode& node) _id.program_number = PBD::atoi(program_change); } - return 0; -} - -int -Patch::use_bank_info (PatchBank* bank) -{ - if (bank) { - if (bank->patch_primary_key() ) { - _id.bank_number = bank->patch_primary_key()->bank_number; - } else { - return -1; - } - } - - if (!_id.is_sane()) { - return -1; - } return 0; } @@ -160,6 +141,7 @@ Note::get_state (void) return *node; } + int Note::set_state (const XMLTree&, const XMLNode& node) { @@ -219,10 +201,11 @@ PatchBank::set_state (const XMLTree& tree, const XMLNode& node) XMLNode* commands = node.child("MIDICommands"); if (commands) { - _id = new PatchPrimaryKey(); - if (initialize_primary_key_from_commands(*_id, commands)) { + PatchPrimaryKey id (0, 0); + if (initialize_primary_key_from_commands (id, commands)) { return -1; } + _number = id.bank_number; } XMLNode* patch_name_list = node.child("PatchNameList"); @@ -230,7 +213,7 @@ PatchBank::set_state (const XMLTree& tree, const XMLNode& node) if (patch_name_list) { const XMLNodeList patches = patch_name_list->children(); for (XMLNodeList::const_iterator i = patches.begin(); i != patches.end(); ++i) { - boost::shared_ptr<Patch> patch(new Patch(this)); + boost::shared_ptr<Patch> patch (new Patch (string(), 0, _number)); patch->set_state(tree, *(*i)); _patch_name_list.push_back(patch); } @@ -254,9 +237,7 @@ PatchBank::set_patch_name_list (const PatchNameList& pnl) _patch_list_name = ""; for (PatchNameList::iterator p = _patch_name_list.begin(); p != _patch_name_list.end(); p++) { - if ((*p)->use_bank_info (this)) { - return -1; - } + (*p)->set_bank_number (_number); } return 0; @@ -335,7 +316,7 @@ ChannelNameSet::set_state (const XMLTree& tree, const XMLNode& node) } if (node->name() == "PatchBank") { - boost::shared_ptr<PatchBank> bank(new PatchBank()); + boost::shared_ptr<PatchBank> bank (new PatchBank ()); bank->set_state(tree, *node); _patch_banks.push_back(bank); const PatchBank::PatchNameList& patches = bank->patch_name_list(); @@ -451,7 +432,7 @@ MasterDeviceNames::set_state(const XMLTree& tree, const XMLNode& a_node) const XMLNodeList patches = (*i)->children(); for (XMLNodeList::const_iterator p = patches.begin(); p != patches.end(); ++p) { - boost::shared_ptr<Patch> patch(new Patch()); + boost::shared_ptr<Patch> patch (new Patch ()); patch->set_state(tree, *(*p)); patch_name_list.push_back(patch); } |