diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index a42c2c84f7..426834885a 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -217,6 +217,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h"
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp"
@@ -2903,6 +2904,7 @@ set_source_files_properties(
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h"
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp"
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
index c172a3161c..7046683508 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -3433,6 +3433,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index b3f42ca2b0..b65cb16ffc 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -4515,6 +4515,9 @@
JUCE Modules\juce_audio_devices\midi_io\ump
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
index de00024908..9e11687974 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
@@ -3433,6 +3433,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index 4d2d867579..d4c3e7fc6a 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -4515,6 +4515,9 @@
JUCE Modules\juce_audio_devices\midi_io\ump
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index 2d5498015b..5e7cfb0d4c 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -172,6 +172,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h"
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp"
@@ -2472,6 +2473,7 @@ set_source_files_properties(
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h"
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp"
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
index e1ab9159db..97bdb547b1 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
@@ -2947,6 +2947,7 @@
+
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index 7fb775d454..aeefc06c58 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -3777,6 +3777,9 @@
JUCE Modules\juce_audio_devices\midi_io\ump
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
index a6b97ff927..087ea426fa 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -205,6 +205,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h"
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp"
@@ -2658,6 +2659,7 @@ set_source_files_properties(
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h"
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp"
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
index 4d0999517d..580c389939 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -3127,6 +3127,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index 4bf0c062ba..ceef990767 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -4053,6 +4053,9 @@
JUCE Modules\juce_audio_devices\midi_io\ump
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
index 60671a916b..8df213e37a 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
@@ -3127,6 +3127,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index f1db0a3b53..0fe0fb861b 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -4053,6 +4053,9 @@
JUCE Modules\juce_audio_devices\midi_io\ump
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
index 97d412db4a..e3129962ce 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -176,6 +176,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h"
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp"
@@ -2556,6 +2557,7 @@ set_source_files_properties(
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h"
"../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp"
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
index 42c7fb20af..bef22b91b1 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
@@ -3038,6 +3038,7 @@
+
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index d8464040c8..818c1800eb 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -3918,6 +3918,9 @@
JUCE Modules\juce_audio_devices\midi_io\ump
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
index b7ebc81939..52eced3df1 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -3239,6 +3239,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index 7e41e44560..fd2d7021b8 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -4212,6 +4212,9 @@
JUCE Modules\juce_audio_devices\midi_io\ump
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
index a64b82cf8d..6148ba57d5 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
@@ -3239,6 +3239,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index 26816c46b2..53a52ae934 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -4212,6 +4212,9 @@
JUCE Modules\juce_audio_devices\midi_io\ump
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
index 81f5ec3193..266a515250 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
@@ -3014,6 +3014,7 @@
+
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
index 89f0ccaa87..01510cde16 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
@@ -3885,6 +3885,9 @@
JUCE Modules\juce_audio_devices\midi_io\ump
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
diff --git a/modules/juce_audio_devices/juce_audio_devices.h b/modules/juce_audio_devices/juce_audio_devices.h
index 7da8286390..3bfd211c32 100644
--- a/modules/juce_audio_devices/juce_audio_devices.h
+++ b/modules/juce_audio_devices/juce_audio_devices.h
@@ -200,6 +200,7 @@
//==============================================================================
#include "midi_io/juce_ScheduledEventThread.h"
#include "midi_io/ump/juce_UMPEndpointId.h"
+#include "midi_io/ump/juce_UMPStaticDeviceInfo.h"
#include "midi_io/ump/juce_UMPBlock.h"
#include "midi_io/ump/juce_UMPEndpoint.h"
#include "midi_io/ump/juce_UMPDisconnectionListener.h"
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h
index b321014137..05237f4dd0 100644
--- a/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h
+++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h
@@ -68,77 +68,6 @@ struct EndpointsListener
virtual void virtualMidiServiceActiveChanged() {}
};
-/**
- Static information about a particular MIDI device that can be queried without opening a
- connection to the device.
-
- This information differs from the detailed information in the Endpoint struct, in that
- the StaticDeviceInformation is communicated out-of-band, whereas Endpoint information is
- communicated 'in-band', i.e. it is sent as MIDI messages after establishing a connection to the
- device.
-
- @tags{Audio}
-*/
-class StaticDeviceInfo
-{
-public:
- [[nodiscard]] StaticDeviceInfo withName (const String& x) const { return withMember (*this, &StaticDeviceInfo::name, x); }
- [[nodiscard]] StaticDeviceInfo withManufacturer (const String& x) const { return withMember (*this, &StaticDeviceInfo::manufacturer, x); }
- [[nodiscard]] StaticDeviceInfo withProduct (const String& x) const { return withMember (*this, &StaticDeviceInfo::product, x); }
- [[nodiscard]] StaticDeviceInfo withHasSource (bool x) const { return withMember (*this, &StaticDeviceInfo::source, x); }
- [[nodiscard]] StaticDeviceInfo withHasDestination (bool x) const { return withMember (*this, &StaticDeviceInfo::destination, x); }
- [[nodiscard]] StaticDeviceInfo withTransport (Transport x) const { return withMember (*this, &StaticDeviceInfo::transport, x); }
-
- [[nodiscard]] StaticDeviceInfo withLegacyIdentifiersSrc (Span x) const
- {
- auto copy = *this;
- std::copy (x.begin(), x.end(), copy.identifierSrc.begin());
- return copy;
- }
-
- [[nodiscard]] StaticDeviceInfo withLegacyIdentifiersDst (Span x) const
- {
- auto copy = *this;
- std::copy (x.begin(), x.end(), copy.identifierDst.begin());
- return copy;
- }
-
- [[nodiscard]] StaticDeviceInfo withLegacyIdentifiers (IOKind k, Span x) const
- {
- return k == IOKind::src ? withLegacyIdentifiersSrc (x) : withLegacyIdentifiersDst (x);
- }
-
- String getName() const { return name; }
- String getManufacturer() const { return manufacturer; }
- String getProduct() const { return product; }
- bool hasSource() const { return source; }
- bool hasDestination() const { return destination; }
- Transport getTransport() const { return transport; }
-
- /** Returns an identifier to uniquely identify each group, for use with the legacy MIDI API. */
- Span getLegacyIdentifiersSrc() const& { return identifierSrc; }
- /** Returns an identifier to uniquely identify each group, for use with the legacy MIDI API. */
- Span getLegacyIdentifiersDst() const& { return identifierDst; }
-
- Span getLegacyIdentifiers (IOKind k) const&
- {
- return k == IOKind::src ? getLegacyIdentifiersSrc() : getLegacyIdentifiersDst();
- }
-
- Span getLegacyIdentifiersSrc() const&& = delete;
- Span getLegacyIdentifiersDst() const&& = delete;
- Span getLegacyIdentifiers (IOKind) const&& = delete;
-
-private:
- std::array identifierSrc, identifierDst;
- String name; ///< The full human-readable name of this device
- String manufacturer; ///< The name of the organisation that produced this device
- String product; ///< The human-readable product name
- Transport transport{}; ///< The format used for MIDI messages in transit
- uint8_t source = false; ///< True if the device can send messages
- uint8_t destination = false; ///< True if the device can receive messages
-};
-
/** MIDI implementation technologies
@tags{Audio}
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h
new file mode 100644
index 0000000000..958a392fc4
--- /dev/null
+++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h
@@ -0,0 +1,109 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE framework.
+ Copyright (c) Raw Material Software Limited
+
+ JUCE is an open source framework subject to commercial or open source
+ licensing.
+
+ By downloading, installing, or using the JUCE framework, or combining the
+ JUCE framework with any other source code, object code, content or any other
+ copyrightable work, you agree to the terms of the JUCE End User Licence
+ Agreement, and all incorporated terms including the JUCE Privacy Policy and
+ the JUCE Website Terms of Service, as applicable, which will bind you. If you
+ do not agree to the terms of these agreements, we will not license the JUCE
+ framework to you, and you must discontinue the installation or download
+ process and cease use of the JUCE framework.
+
+ JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
+ JUCE Privacy Policy: https://juce.com/juce-privacy-policy
+ JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
+
+ Or:
+
+ You may also use this code under the terms of the AGPLv3:
+ https://www.gnu.org/licenses/agpl-3.0.en.html
+
+ THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
+ WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce::universal_midi_packets
+{
+
+/**
+ Static information about a particular MIDI device that can be queried without opening a
+ connection to the device.
+
+ This information differs from the detailed information in the Endpoint struct, in that
+ the StaticDeviceInformation is communicated out-of-band, whereas Endpoint information is
+ communicated 'in-band', i.e. it is sent as MIDI messages after establishing a connection to the
+ device.
+
+ @tags{Audio}
+*/
+class StaticDeviceInfo
+{
+public:
+ [[nodiscard]] StaticDeviceInfo withName (const String& x) const { return withMember (*this, &StaticDeviceInfo::name, x); }
+ [[nodiscard]] StaticDeviceInfo withManufacturer (const String& x) const { return withMember (*this, &StaticDeviceInfo::manufacturer, x); }
+ [[nodiscard]] StaticDeviceInfo withProduct (const String& x) const { return withMember (*this, &StaticDeviceInfo::product, x); }
+ [[nodiscard]] StaticDeviceInfo withHasSource (bool x) const { return withMember (*this, &StaticDeviceInfo::source, x); }
+ [[nodiscard]] StaticDeviceInfo withHasDestination (bool x) const { return withMember (*this, &StaticDeviceInfo::destination, x); }
+ [[nodiscard]] StaticDeviceInfo withTransport (Transport x) const { return withMember (*this, &StaticDeviceInfo::transport, x); }
+
+ [[nodiscard]] StaticDeviceInfo withLegacyIdentifiersSrc (Span x) const
+ {
+ auto copy = *this;
+ std::copy (x.begin(), x.end(), copy.identifierSrc.begin());
+ return copy;
+ }
+
+ [[nodiscard]] StaticDeviceInfo withLegacyIdentifiersDst (Span x) const
+ {
+ auto copy = *this;
+ std::copy (x.begin(), x.end(), copy.identifierDst.begin());
+ return copy;
+ }
+
+ [[nodiscard]] StaticDeviceInfo withLegacyIdentifiers (IOKind k, Span x) const
+ {
+ return k == IOKind::src ? withLegacyIdentifiersSrc (x) : withLegacyIdentifiersDst (x);
+ }
+
+ String getName() const { return name; }
+ String getManufacturer() const { return manufacturer; }
+ String getProduct() const { return product; }
+ bool hasSource() const { return source; }
+ bool hasDestination() const { return destination; }
+ Transport getTransport() const { return transport; }
+
+ /** Returns an identifier to uniquely identify each group, for use with the legacy MIDI API. */
+ Span getLegacyIdentifiersSrc() const& { return identifierSrc; }
+ /** Returns an identifier to uniquely identify each group, for use with the legacy MIDI API. */
+ Span getLegacyIdentifiersDst() const& { return identifierDst; }
+
+ Span getLegacyIdentifiers (IOKind k) const&
+ {
+ return k == IOKind::src ? getLegacyIdentifiersSrc() : getLegacyIdentifiersDst();
+ }
+
+ Span getLegacyIdentifiersSrc() const&& = delete;
+ Span getLegacyIdentifiersDst() const&& = delete;
+ Span getLegacyIdentifiers (IOKind) const&& = delete;
+
+private:
+ std::array identifierSrc, identifierDst;
+ String name; ///< The full human-readable name of this device
+ String manufacturer; ///< The name of the organisation that produced this device
+ String product; ///< The human-readable product name
+ Transport transport{}; ///< The format used for MIDI messages in transit
+ uint8_t source = false; ///< True if the device can send messages
+ uint8_t destination = false; ///< True if the device can receive messages
+};
+
+}