diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index 41aaedfb3f..cad2e36543 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"
@@ -2900,6 +2901,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 a35c4c73ec..5301d64dbe 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -3424,6 +3424,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index 7ba92fe15a..3443195c73 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -4506,6 +4506,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 eec603f4e9..347119b4fe 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
@@ -3424,6 +3424,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index 99a67af9b6..42c70e400f 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -4506,6 +4506,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 b414a53468..03cd95e25b 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"
@@ -2469,6 +2470,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 b6de45cc5f..acdc6d0047 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
@@ -2938,6 +2938,7 @@
+
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index 87f690df00..4b4340cd8b 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -3768,6 +3768,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 f4b792d169..8e5af291fd 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"
@@ -2655,6 +2656,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 c065068bc7..b4ddec8884 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -3118,6 +3118,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index fde929b00e..2ebca4c84e 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -4044,6 +4044,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 dfdfdfaa85..1110f35e1a 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
@@ -3118,6 +3118,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index 4c232094a5..2db578d129 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -4044,6 +4044,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 635156e4ec..32be901834 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"
@@ -2553,6 +2554,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 e1e54beced..ea7d72e077 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
@@ -3029,6 +3029,7 @@
+
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index f46478fb12..7b491b9084 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -3909,6 +3909,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 0724ed3cc3..89e24bfe48 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -3230,6 +3230,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index 6f29ece00e..d8f1ca5ba6 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -4203,6 +4203,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 9a04131577..e2e9a20efa 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
@@ -3230,6 +3230,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index 76257d6851..71723e8ef6 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -4203,6 +4203,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 9d55e2153e..0609dcef72 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
@@ -3005,6 +3005,7 @@
+
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
index 57530ca870..c9b151cc71 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
@@ -3876,6 +3876,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 8f5ff1370d..2625b9a6c3 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
+};
+
+}