diff options
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 3 | ||||
-rw-r--r-- | gtk2_ardour/midi_time_axis.cc | 30 | ||||
-rw-r--r-- | gtk2_ardour/patch_change.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/patch_change_dialog.cc | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_patch_manager.h | 6 | ||||
-rw-r--r-- | libs/ardour/midi_patch_manager.cc | 14 | ||||
-rw-r--r-- | patchfiles/Korg_Radias.midnam | 2 |
7 files changed, 45 insertions, 13 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 2f5d69ffe9..6541736a19 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -27,11 +27,12 @@ #include <sigc++/signal.h> +#include "midi++/midnam_patch.h" + #include "pbd/memento_command.h" #include "pbd/stateful_diff_command.h" #include "ardour/midi_model.h" -#include "ardour/midi_patch_manager.h" #include "ardour/midi_region.h" #include "ardour/midi_source.h" #include "ardour/midi_track.h" diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index c2d2a36ab1..1d55b7dffa 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -266,14 +266,28 @@ MidiTimeAxisView::set_route (boost::shared_ptr<Route> rt) } } - MIDI::Name::MidiPatchManager& patch_manager = MIDI::Name::MidiPatchManager::instance(); - - MIDI::Name::MasterDeviceNames::Models::const_iterator m = patch_manager.all_models().begin(); - for (; m != patch_manager.all_models().end(); ++m) { - _midnam_model_selector.AddMenuElem( - Gtk::Menu_Helpers::MenuElem(m->c_str(), - sigc::bind(sigc::mem_fun(*this, &MidiTimeAxisView::model_changed), - m->c_str()))); + typedef MIDI::Name::MidiPatchManager PatchManager; + + PatchManager& patch_manager = PatchManager::instance(); + + for (PatchManager::DeviceNamesByMaker::const_iterator m = patch_manager.devices_by_manufacturer().begin(); + m != patch_manager.devices_by_manufacturer().end(); ++m) { + Menu* menu = Gtk::manage(new Menu); + Menu_Helpers::MenuList& items = menu->items(); + + // Build manufacturer submenu + for (MIDI::Name::MIDINameDocument::MasterDeviceNamesList::const_iterator n = m->second.begin(); + n != m->second.end(); ++n) { + Menu_Helpers::MenuElem elem = Gtk::Menu_Helpers::MenuElem( + n->first.c_str(), + sigc::bind(sigc::mem_fun(*this, &MidiTimeAxisView::model_changed), + n->first.c_str())); + + items.push_back(elem); + } + + // Add manufacturer submenu to selector + _midnam_model_selector.AddMenuElem(Menu_Helpers::MenuElem(m->first, *menu)); } if (gui_property (X_("midnam-model-name")).empty()) { diff --git a/gtk2_ardour/patch_change.cc b/gtk2_ardour/patch_change.cc index 09fb8b9778..18ef5da004 100644 --- a/gtk2_ardour/patch_change.cc +++ b/gtk2_ardour/patch_change.cc @@ -26,7 +26,7 @@ #include "gtkmm2ext/keyboard.h" #include "gtkmm2ext/utils.h" -#include "ardour/midi_patch_manager.h" +#include "midi++/midnam_patch.h" #include "canvas/debug.h" diff --git a/gtk2_ardour/patch_change_dialog.cc b/gtk2_ardour/patch_change_dialog.cc index 3af5a4ed7f..23941e1545 100644 --- a/gtk2_ardour/patch_change_dialog.cc +++ b/gtk2_ardour/patch_change_dialog.cc @@ -27,7 +27,6 @@ #include "midi++/midnam_patch.h" -#include "ardour/midi_patch_manager.h" #include "ardour/beats_frames_converter.h" #include "ardour/instrument_info.h" diff --git a/libs/ardour/ardour/midi_patch_manager.h b/libs/ardour/ardour/midi_patch_manager.h index cd898aa00f..1b7de6a51d 100644 --- a/libs/ardour/ardour/midi_patch_manager.h +++ b/libs/ardour/ardour/midi_patch_manager.h @@ -46,7 +46,8 @@ private: static MidiPatchManager* _manager; public: - typedef std::map<std::string, boost::shared_ptr<MIDINameDocument> > MidiNameDocuments; + typedef std::map<std::string, boost::shared_ptr<MIDINameDocument> > MidiNameDocuments; + typedef std::map<std::string, MIDINameDocument::MasterDeviceNamesList> DeviceNamesByMaker; virtual ~MidiPatchManager() { _manager = 0; } @@ -133,6 +134,8 @@ public: const MasterDeviceNames::Models& all_models() const { return _all_models; } + const DeviceNamesByMaker& devices_by_manufacturer() const { return _devices_by_manufacturer; } + private: void session_going_away(); void refresh(); @@ -140,6 +143,7 @@ private: MidiNameDocuments _documents; MIDINameDocument::MasterDeviceNamesList _master_devices_by_model; + DeviceNamesByMaker _devices_by_manufacturer; MasterDeviceNames::Models _all_models; }; diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc index ab66949326..e0638f035e 100644 --- a/libs/ardour/midi_patch_manager.cc +++ b/libs/ardour/midi_patch_manager.cc @@ -87,6 +87,12 @@ MidiPatchManager::add_session_patches () // build a list of all master devices from all documents _master_devices_by_model[device->first] = device->second; _all_models.insert(device->first); + const std::string& manufacturer = device->second->manufacturer(); + if (_devices_by_manufacturer.find(manufacturer) == _devices_by_manufacturer.end()) { + MIDINameDocument::MasterDeviceNamesList empty; + _devices_by_manufacturer.insert(std::make_pair(manufacturer, empty)); + } + _devices_by_manufacturer[manufacturer].insert(std::make_pair(device->first, device->second)); // make sure there are no double model names // TODO: handle this gracefully. @@ -102,6 +108,7 @@ MidiPatchManager::refresh() _documents.clear(); _master_devices_by_model.clear(); _all_models.clear(); + _devices_by_manufacturer.clear(); Searchpath search_path = midi_patch_search_path (); vector<std::string> result; @@ -133,6 +140,12 @@ MidiPatchManager::refresh() _master_devices_by_model[device->first] = device->second; _all_models.insert(device->first); + const std::string& manufacturer = device->second->manufacturer(); + if (_devices_by_manufacturer.find(manufacturer) == _devices_by_manufacturer.end()) { + MIDINameDocument::MasterDeviceNamesList empty; + _devices_by_manufacturer.insert(std::make_pair(manufacturer, empty)); + } + _devices_by_manufacturer[manufacturer].insert(std::make_pair(device->first, device->second)); } } @@ -148,4 +161,5 @@ MidiPatchManager::session_going_away () _documents.clear(); _master_devices_by_model.clear(); _all_models.clear(); + _devices_by_manufacturer.clear(); } diff --git a/patchfiles/Korg_Radias.midnam b/patchfiles/Korg_Radias.midnam index 795c120d95..a82a6eef13 100644 --- a/patchfiles/Korg_Radias.midnam +++ b/patchfiles/Korg_Radias.midnam @@ -3,7 +3,7 @@ <MIDINameDocument> <Author>CherryPicker</Author> <MasterDeviceNames> - <Manufacturer>Korg inc.</Manufacturer> + <Manufacturer>Korg</Manufacturer> <Model>RADIAS</Model> <CustomDeviceMode Name="CPMode 1"> <ChannelNameSetAssignments> |