GUI tweaks for unset midi banks.
authorRobin Gareus <robin@gareus.org>
Tue, 24 Jul 2018 19:35:14 +0000 (21:35 +0200)
committerRobin Gareus <robin@gareus.org>
Tue, 24 Jul 2018 21:22:21 +0000 (23:22 +0200)
Some MIDNAM files use Patch-Banks that do *not* have a common midi bank
(CC0, CC32) but the Patchbank is instead just a collection of patches.
There may be more than 127 patches in a patch-bank and each of those
may be in a different midi-bank (e.g. Roland SC-88 Pro).

Midnams like these are now properly supported via dropdowns (in the
patch add/modify dialog and timeline), but ignored by the grid
(patch-widget). More work is needed.

gtk2_ardour/generic_pluginui.cc
gtk2_ardour/patch_change_dialog.cc
gtk2_ardour/patch_change_widget.cc

index 1e48986a282d5c8b5654cc068088005734e77e89..055129b704220b5953b8bedd97695daf73edaf6a 100644 (file)
@@ -732,7 +732,6 @@ GenericPluginUI::midi_refill_patches ()
                                for (MIDI::Name::PatchNameList::const_iterator j = patches.begin(); j != patches.end(); ++j) {
                                        const std::string pgm = (*j)->name ();
                                        MIDI::Name::PatchPrimaryKey const& key = (*j)->patch_primary_key ();
-                                       assert ((*i)->number () == key.bank());
                                        const uint32_t bp = (key.bank() << 7) | key.program();
                                        midi_pgmsel[chn]->AddMenuElem (MenuElemNoMnemonic (pgm, sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::midi_bank_patch_select), chn, bp)));
                                        pgm_names[bp] = pgm;
index 63aa9eac7b844ca9229a3c6b950af20161705332..961f91b512052ab15916adb54d266591b6d450fd 100644 (file)
@@ -116,9 +116,10 @@ PatchChangeDialog::PatchChangeDialog (
        t->attach (_bank_lsb, 1, 2, r, r + 1);
        ++r;
 
+       assert (patch.bank() != UINT16_MAX);
+
        _bank_msb.set_value ((patch.bank() >> 7));
        _bank_msb.signal_changed().connect (sigc::mem_fun (*this, &PatchChangeDialog::bank_changed));
-
        _bank_lsb.set_value ((patch.bank() & 127));
        _bank_lsb.signal_changed().connect (sigc::mem_fun (*this, &PatchChangeDialog::bank_changed));
 
@@ -270,10 +271,12 @@ PatchChangeDialog::bank_combo_changed ()
        fill_patch_combo ();
        set_active_patch_combo ();
 
-       _ignore_signals = true;
-       _bank_msb.set_value (_current_patch_bank->number() >> 7);
-       _bank_lsb.set_value (_current_patch_bank->number() & 127);
-       _ignore_signals = false;
+       if (_current_patch_bank->number() != UINT16_MAX) {
+               _ignore_signals = true;
+               _bank_msb.set_value (_current_patch_bank->number() >> 7);
+               _bank_lsb.set_value (_current_patch_bank->number() & 127);
+               _ignore_signals = false;
+       }
 }
 
 /** Fill the contents of the patch combo */
@@ -345,6 +348,8 @@ PatchChangeDialog::patch_combo_changed ()
                if (n == _patch_combo.get_active_text ()) {
                        _ignore_signals = true;
                        _program.set_value ((*j)->program_number() + 1);
+                       _bank_msb.set_value ((*j)->bank_number() >> 7);
+                       _bank_lsb.set_value ((*j)->bank_number() & 127);
                        _ignore_signals = false;
                        break;
                }
index 922f7cd6f78af13e7a7c784679ecf2ca786360d3..f9c88d80688af5845799a1204200d4c105fab932 100644 (file)
@@ -238,6 +238,9 @@ PatchChangeWidget::refill_banks ()
        if (cns) {
                for (MIDI::Name::ChannelNameSet::PatchBanks::const_iterator i = cns->patch_banks().begin(); i != cns->patch_banks().end(); ++i) {
                        std::string n = (*i)->name ();
+                       if ((*i)->number () == UINT16_MAX) {
+                               continue;
+                       }
                        _bank_select.AddMenuElem (MenuElemNoMnemonic (n, sigc::bind (sigc::mem_fun (*this, &PatchChangeWidget::select_bank), (*i)->number ())));
                        if ((*i)->number () == b) {
                                _current_patch_bank = *i;