summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2020-04-15 01:40:13 +0200
committerRobin Gareus <robin@gareus.org>2020-04-15 01:51:04 +0200
commit984dc1694dec5a5cea2af48d0750195b0d279f67 (patch)
tree4409e06d16f7f4633b0a442050ce8897ad557cf5
parent6d75d40533a8058db5ec791002dea9b09b0ff47f (diff)
Allow MIDNAM lookup of valid channels for controllers
-rw-r--r--libs/ardour/ardour/instrument_info.h1
-rw-r--r--libs/ardour/instrument_info.cc23
2 files changed, 24 insertions, 0 deletions
diff --git a/libs/ardour/ardour/instrument_info.h b/libs/ardour/ardour/instrument_info.h
index 0d3957fb68..a2a5e7f2db 100644
--- a/libs/ardour/ardour/instrument_info.h
+++ b/libs/ardour/ardour/instrument_info.h
@@ -72,6 +72,7 @@ public:
boost::shared_ptr<const MIDI::Name::ValueNameList> value_name_list_by_control (uint8_t channel, uint8_t number) const;
size_t master_controller_count () const;
+ uint16_t channels_for_control_list (std::string const& ctrl_name_list) const;
PBD::Signal0<void> Changed;
diff --git a/libs/ardour/instrument_info.cc b/libs/ardour/instrument_info.cc
index c00efeedbf..2d5a156d4a 100644
--- a/libs/ardour/instrument_info.cc
+++ b/libs/ardour/instrument_info.cc
@@ -178,6 +178,29 @@ InstrumentInfo::master_device_names () const
#endif
}
+/* reverse lookup which "ChannelNameSet" use "UsesControlNameList <name>",
+ * then add all channels that the ChannelNameSet is AvailableForChannels.
+ */
+uint16_t
+InstrumentInfo::channels_for_control_list (std::string const& ctrl_name_list) const
+{
+ boost::shared_ptr<MasterDeviceNames> const& dev_names (MidiPatchManager::instance ().master_device_by_model (model ()));
+ uint16_t channels = 0;
+ for (int c = 0; c < 16; ++c) {
+ boost::shared_ptr<ChannelNameSet> const& chan_names (dev_names->channel_name_set_by_channel (mode (), c));
+ if (!chan_names || !chan_names->available_for_channel (c + 1)) {
+ continue;
+ }
+ if (chan_names->control_list_name () == ctrl_name_list) {
+ channels |= 0x0001 << c;
+ }
+ }
+ if (channels == 0) {
+ channels = 65535;
+ }
+ return channels;
+}
+
boost::shared_ptr<ControlNameList>
InstrumentInfo::control_name_list (uint8_t channel)
{