Structure MIDI device selector by manufacturer.
authorDavid Robillard <d@drobilla.net>
Sat, 13 Dec 2014 05:37:34 +0000 (00:37 -0500)
committerDavid Robillard <d@drobilla.net>
Sat, 13 Dec 2014 05:37:34 +0000 (00:37 -0500)
Unfortunately we store the state of models as simply model, so if there's ever
duplicate model names, we're somewhat screwed, but this makes the (previously
unmanageably huge) menu usable, while retaining the "model name as global
identifier" state unmodified.

gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_time_axis.cc
gtk2_ardour/patch_change.cc
gtk2_ardour/patch_change_dialog.cc
libs/ardour/ardour/midi_patch_manager.h
libs/ardour/midi_patch_manager.cc
patchfiles/Korg_Radias.midnam

index 2f5d69ffe97e0fa4f3e1d1d22be6452d321ef7e1..6541736a190fc56bd34702b7f4edd40932b8667c 100644 (file)
 
 #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"
index c2d2a36ab1b5034f85c1e1a20d947e59df91e58a..1d55b7dffaee24896af95774a2b87800f4ea90f3 100644 (file)
@@ -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()) {
index 09fb8b977861b573d9a1c6b5cc97e48f9cbf64d2..18ef5da00434e1565eef5aa4bf015a5730c77eed 100644 (file)
@@ -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"
 
index 3af5a4ed7f4e5c45375da254ca2e4d81c11e01f2..23941e1545f855c2cf6ad7010eaa45e903511945 100644 (file)
@@ -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"
 
index cd898aa00f7de543aabab45c49165abca31ba5f8..1b7de6a51dd3f809f8cbd6109ccf9726d01d09c5 100644 (file)
@@ -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;
 };
 
index ab66949326e88360299cc631d87aa62d886454fc..e0638f035e510232d27e5701b5e216990451ac38 100644 (file)
@@ -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();
 }
index 795c120d95cb2856c81037b42b8db0b97e5cc716..a82a6eef1330a9437df87601817a24413276f379 100644 (file)
@@ -3,7 +3,7 @@
 <MIDINameDocument>
   <Author>CherryPicker</Author>
   <MasterDeviceNames>
-    <Manufacturer>Korg inc.</Manufacturer>
+    <Manufacturer>Korg</Manufacturer>
     <Model>RADIAS</Model>
     <CustomDeviceMode Name="CPMode 1">
       <ChannelNameSetAssignments>