diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index d39a44575b..68b1afe523 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -104,8 +104,10 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPBytesOnGroup.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h"
@@ -203,9 +205,11 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
"../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp"
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDisconnectionListener.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoint.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h"
@@ -2618,6 +2622,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_javascript/javascript/juce_JSObject.h"
"../../../../../modules/juce_javascript/juce_javascript.cpp"
"../../../../../modules/juce_javascript/juce_javascript.h"
+ "../../../../../modules/juce_midi_ci/ci/juce_CIChannelAddress.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIChannelAddress.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIDevice.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIDevice.h"
@@ -2629,10 +2634,12 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_midi_ci/ci/juce_CIEncodings.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIEncodings.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIFunctionBlock.h"
+ "../../../../../modules/juce_midi_ci/ci/juce_CIMessages.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIMessages.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIMuid.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIParser.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIParser.h"
+ "../../../../../modules/juce_midi_ci/ci/juce_CIProfileAtAddress.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIProfileAtAddress.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIProfileDelegate.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIProfileHost.cpp"
@@ -2649,6 +2656,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_midi_ci/ci/juce_CIResponderDelegate.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIResponderOutput.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIResponderOutput.h"
+ "../../../../../modules/juce_midi_ci/ci/juce_CISubscription.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CISubscription.h"
"../../../../../modules/juce_midi_ci/ci/juce_CISubscriptionManager.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CISubscriptionManager.h"
@@ -2836,8 +2844,10 @@ set_source_files_properties(
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPBytesOnGroup.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h"
@@ -2935,9 +2945,11 @@ set_source_files_properties(
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
"../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp"
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDisconnectionListener.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoint.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h"
@@ -5350,6 +5362,7 @@ set_source_files_properties(
"../../../../../modules/juce_javascript/javascript/juce_JSObject.h"
"../../../../../modules/juce_javascript/juce_javascript.cpp"
"../../../../../modules/juce_javascript/juce_javascript.h"
+ "../../../../../modules/juce_midi_ci/ci/juce_CIChannelAddress.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIChannelAddress.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIDevice.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIDevice.h"
@@ -5361,10 +5374,12 @@ set_source_files_properties(
"../../../../../modules/juce_midi_ci/ci/juce_CIEncodings.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIEncodings.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIFunctionBlock.h"
+ "../../../../../modules/juce_midi_ci/ci/juce_CIMessages.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIMessages.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIMuid.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIParser.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIParser.h"
+ "../../../../../modules/juce_midi_ci/ci/juce_CIProfileAtAddress.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIProfileAtAddress.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIProfileDelegate.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIProfileHost.cpp"
@@ -5381,6 +5396,7 @@ set_source_files_properties(
"../../../../../modules/juce_midi_ci/ci/juce_CIResponderDelegate.h"
"../../../../../modules/juce_midi_ci/ci/juce_CIResponderOutput.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CIResponderOutput.h"
+ "../../../../../modules/juce_midi_ci/ci/juce_CISubscription.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CISubscription.h"
"../../../../../modules/juce_midi_ci/ci/juce_CISubscriptionManager.cpp"
"../../../../../modules/juce_midi_ci/ci/juce_CISubscriptionManager.h"
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
index 190ac262cc..fe30280141 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -207,6 +207,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -339,6 +345,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -3195,15 +3207,24 @@
true
+
+ true
+
true
true
+
+ true
+
true
+
+ true
+
true
@@ -3222,6 +3243,9 @@
true
+
+ true
+
true
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index c8748e38f5..11ad09e18c 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -919,6 +919,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -1054,6 +1060,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
@@ -4063,15 +4075,24 @@
JUCE Modules\juce_javascript
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
@@ -4090,6 +4111,9 @@
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
index af291e49d3..99c74e34ba 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
@@ -207,6 +207,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -339,6 +345,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -3195,15 +3207,24 @@
true
+
+ true
+
true
true
+
+ true
+
true
+
+ true
+
true
@@ -3222,6 +3243,9 @@
true
+
+ true
+
true
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index 520e5f2816..905f2af3f9 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -919,6 +919,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -1054,6 +1060,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
@@ -4063,15 +4075,24 @@
JUCE Modules\juce_javascript
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
@@ -4090,6 +4111,9 @@
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
diff --git a/examples/DemoRunner/Builds/VisualStudio2026/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2026/DemoRunner_App.vcxproj
index 3309a96330..b2a29998ad 100644
--- a/examples/DemoRunner/Builds/VisualStudio2026/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2026/DemoRunner_App.vcxproj
@@ -207,6 +207,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -339,6 +345,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -3195,15 +3207,24 @@
true
+
+ true
+
true
true
+
+ true
+
true
+
+ true
+
true
@@ -3222,6 +3243,9 @@
true
+
+ true
+
true
diff --git a/examples/DemoRunner/Builds/VisualStudio2026/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2026/DemoRunner_App.vcxproj.filters
index 9e9cacbe0b..54a93c238b 100644
--- a/examples/DemoRunner/Builds/VisualStudio2026/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2026/DemoRunner_App.vcxproj.filters
@@ -919,6 +919,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -1054,6 +1060,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
@@ -4063,15 +4075,24 @@
JUCE Modules\juce_javascript
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
@@ -4090,6 +4111,9 @@
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index 8f17726751..d29c4edbda 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -56,8 +56,10 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPBytesOnGroup.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h"
@@ -155,9 +157,11 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
"../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp"
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDisconnectionListener.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoint.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h"
@@ -2399,8 +2403,10 @@ set_source_files_properties(
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPBytesOnGroup.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h"
@@ -2498,9 +2504,11 @@ set_source_files_properties(
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
"../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp"
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDisconnectionListener.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoint.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h"
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
index f2d761e301..57c0f51dae 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
@@ -165,6 +165,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -297,6 +303,12 @@
true
+
+ true
+
+
+ true
+
true
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index b514b62e6f..c8f1249900 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -694,6 +694,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -829,6 +835,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ 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/VisualStudio2026/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2026/AudioPerformanceTest_App.vcxproj
index 85ccd1444a..747ba1cd6e 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2026/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2026/AudioPerformanceTest_App.vcxproj
@@ -165,6 +165,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -297,6 +303,12 @@
true
+
+ true
+
+
+ true
+
true
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2026/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2026/AudioPerformanceTest_App.vcxproj.filters
index feada155bf..35f3cd9c46 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2026/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2026/AudioPerformanceTest_App.vcxproj.filters
@@ -694,6 +694,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -829,6 +835,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ 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 d643acf406..a6f2869ba6 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -92,8 +92,10 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPBytesOnGroup.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h"
@@ -191,9 +193,11 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
"../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp"
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDisconnectionListener.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoint.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h"
@@ -2591,8 +2595,10 @@ set_source_files_properties(
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPBytesOnGroup.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h"
@@ -2690,9 +2696,11 @@ set_source_files_properties(
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
"../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp"
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDisconnectionListener.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoint.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h"
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
index 61e8bb5795..526588987b 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -173,6 +173,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -305,6 +311,12 @@
true
+
+ true
+
+
+ true
+
true
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index 1868a7289a..753914dfee 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -775,6 +775,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -910,6 +916,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ 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 0777f62463..d6d2d209f3 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
@@ -173,6 +173,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -305,6 +311,12 @@
true
+
+ true
+
+
+ true
+
true
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index 67ceaecdd1..a1c4c01e23 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -775,6 +775,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -910,6 +916,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ 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/VisualStudio2026/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2026/AudioPluginHost_App.vcxproj
index afb685a2a7..482e9ea99e 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2026/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2026/AudioPluginHost_App.vcxproj
@@ -173,6 +173,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -305,6 +311,12 @@
true
+
+ true
+
+
+ true
+
true
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2026/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2026/AudioPluginHost_App.vcxproj.filters
index 2e560fba4a..30acc030c2 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2026/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2026/AudioPluginHost_App.vcxproj.filters
@@ -775,6 +775,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -910,6 +916,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ 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 981ab6a310..7e741b8b17 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -60,8 +60,10 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPBytesOnGroup.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h"
@@ -159,9 +161,11 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
"../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp"
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDisconnectionListener.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoint.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h"
@@ -2483,8 +2487,10 @@ set_source_files_properties(
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPBytesOnGroup.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConversion.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h"
+ "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp"
"../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h"
@@ -2582,9 +2588,11 @@ set_source_files_properties(
"../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
"../../../../../modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp"
"../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDisconnectionListener.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoint.h"
+ "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.cpp"
"../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h"
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
index cf370bbe38..a1de52d2d9 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
@@ -165,6 +165,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -297,6 +303,12 @@
true
+
+ true
+
+
+ true
+
true
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index 06aefe332b..dd25f812da 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -724,6 +724,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -859,6 +865,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ 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/VisualStudio2026/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2026/NetworkGraphicsDemo_App.vcxproj
index 681c8718b5..f410e70d09 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2026/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2026/NetworkGraphicsDemo_App.vcxproj
@@ -165,6 +165,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -297,6 +303,12 @@
true
+
+ true
+
+
+ true
+
true
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2026/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2026/NetworkGraphicsDemo_App.vcxproj.filters
index d544849e5d..1fa1eb4717 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2026/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2026/NetworkGraphicsDemo_App.vcxproj.filters
@@ -724,6 +724,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -859,6 +865,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ 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 52b08762a7..594cedab8c 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -181,6 +181,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -313,6 +319,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -3028,15 +3040,24 @@
true
+
+ true
+
true
true
+
+ true
+
true
+
+ true
+
true
@@ -3055,6 +3076,9 @@
true
+
+ true
+
true
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index ad5a218ed8..42ca6e4221 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -817,6 +817,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -952,6 +958,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
@@ -3820,15 +3832,24 @@
JUCE Modules\juce_javascript
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
@@ -3847,6 +3868,9 @@
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
index de6c91bc2c..28a2dda589 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
@@ -181,6 +181,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -313,6 +319,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -3028,15 +3040,24 @@
true
+
+ true
+
true
true
+
+ true
+
true
+
+ true
+
true
@@ -3055,6 +3076,9 @@
true
+
+ true
+
true
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index e35947a22c..27b9faa339 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -817,6 +817,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -952,6 +958,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
@@ -3820,15 +3832,24 @@
JUCE Modules\juce_javascript
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
@@ -3847,6 +3868,9 @@
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2026/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2026/UnitTestRunner_ConsoleApp.vcxproj
index 770dd38bf5..7392fa5003 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2026/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2026/UnitTestRunner_ConsoleApp.vcxproj
@@ -181,6 +181,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -313,6 +319,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -3028,15 +3040,24 @@
true
+
+ true
+
true
true
+
+ true
+
true
+
+ true
+
true
@@ -3055,6 +3076,9 @@
true
+
+ true
+
true
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2026/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2026/UnitTestRunner_ConsoleApp.vcxproj.filters
index d80fdb5edc..f69c79c5ef 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2026/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2026/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -817,6 +817,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -952,6 +958,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
+
+ JUCE Modules\juce_audio_devices\midi_io\ump
+
JUCE Modules\juce_audio_devices\midi_io\ump
@@ -3820,15 +3832,24 @@
JUCE Modules\juce_javascript
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
@@ -3847,6 +3868,9 @@
JUCE Modules\juce_midi_ci\ci
+
+ JUCE Modules\juce_midi_ci\ci
+
JUCE Modules\juce_midi_ci\ci
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
index af16a120ed..d96edcb8c3 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
@@ -164,6 +164,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -296,6 +302,12 @@
true
+
+ true
+
+
+ true
+
true
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
index 9c05d5ce84..534fcea5cb 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
@@ -721,6 +721,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -856,6 +862,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ 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/VisualStudio2026/WindowsDLL_DynamicLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2026/WindowsDLL_DynamicLibrary.vcxproj
index 5a29719bbe..5f95bc8edc 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2026/WindowsDLL_DynamicLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2026/WindowsDLL_DynamicLibrary.vcxproj
@@ -164,6 +164,12 @@
true
+
+ true
+
+
+ true
+
true
@@ -296,6 +302,12 @@
true
+
+ true
+
+
+ true
+
true
diff --git a/extras/WindowsDLL/Builds/VisualStudio2026/WindowsDLL_DynamicLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2026/WindowsDLL_DynamicLibrary.vcxproj.filters
index d925d1d48f..2f50bc77c8 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2026/WindowsDLL_DynamicLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2026/WindowsDLL_DynamicLibrary.vcxproj.filters
@@ -721,6 +721,12 @@
JUCE Modules\juce_audio_basics\midi\ump
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
+
+ JUCE Modules\juce_audio_basics\midi\ump
+
JUCE Modules\juce_audio_basics\midi\ump
@@ -856,6 +862,12 @@
JUCE Modules\juce_audio_devices\audio_io
+
+ 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_basics/audio_play_head/juce_AudioPlayHead.cpp b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp
index eb13e9f483..2cb3669b89 100644
--- a/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp
+++ b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp
@@ -35,6 +35,69 @@
namespace juce
{
+bool AudioPlayHead::FrameRate::operator== (const FrameRate& other) const
+{
+ const auto tie = [] (const FrameRate& x) { return std::tie (x.base, x.drop, x.pulldown); };
+ return tie (*this) == tie (other);
+}
+
+bool AudioPlayHead::TimeSignature::operator== (const TimeSignature& other) const
+{
+ const auto tie = [] (auto& x) { return std::tie (x.numerator, x.denominator); };
+ return tie (*this) == tie (other);
+}
+
+bool AudioPlayHead::LoopPoints::operator== (const LoopPoints& other) const
+{
+ const auto tie = [] (auto& x) { return std::tie (x.ppqStart, x.ppqEnd); };
+ return tie (*this) == tie (other);
+}
+
+bool AudioPlayHead::CurrentPositionInfo::operator== (const CurrentPositionInfo& other) const noexcept
+{
+ const auto tie = [] (const CurrentPositionInfo& i)
+ {
+ return std::tie (i.timeInSamples,
+ i.ppqPosition,
+ i.editOriginTime,
+ i.ppqPositionOfLastBarStart,
+ i.frameRate,
+ i.isPlaying,
+ i.isRecording,
+ i.bpm,
+ i.timeSigNumerator,
+ i.timeSigDenominator,
+ i.ppqLoopStart,
+ i.ppqLoopEnd,
+ i.isLooping);
+ };
+
+ return tie (*this) == tie (other);
+}
+
+bool AudioPlayHead::PositionInfo::operator== (const PositionInfo& other) const noexcept
+{
+ const auto tie = [] (const PositionInfo& i)
+ {
+ return std::make_tuple (i.getTimeInSamples(),
+ i.getTimeInSeconds(),
+ i.getPpqPosition(),
+ i.getEditOriginTime(),
+ i.getPpqPositionOfLastBarStart(),
+ i.getFrameRate(),
+ i.getBarCount(),
+ i.getTimeSignature(),
+ i.getBpm(),
+ i.getLoopPoints(),
+ i.getHostTimeNs(),
+ i.getIsPlaying(),
+ i.getIsRecording(),
+ i.getIsLooping());
+ };
+
+ return tie (*this) == tie (other);
+}
+
bool AudioPlayHead::canControlTransport() { return false; }
void AudioPlayHead::transportPlay ([[maybe_unused]] bool shouldStartPlaying) {}
void AudioPlayHead::transportRecord ([[maybe_unused]] bool shouldStartRecording) {}
diff --git a/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h
index 142a0eabaf..0e37fbb789 100644
--- a/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h
+++ b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h
@@ -123,11 +123,7 @@ public:
[[nodiscard]] FrameRate withPullDown (bool x = true) const { return with (&FrameRate::pulldown, x); }
/** Returns true if this instance is equal to other. */
- bool operator== (const FrameRate& other) const
- {
- const auto tie = [] (const FrameRate& x) { return std::tie (x.base, x.drop, x.pulldown); };
- return tie (*this) == tie (other);
- }
+ bool operator== (const FrameRate& other) const;
/** Returns true if this instance is not equal to other. */
bool operator!= (const FrameRate& other) const { return ! (*this == other); }
@@ -176,11 +172,7 @@ public:
/** Time signature denominator, e.g. the 4 of a 3/4 time sig */
int denominator = 4;
- bool operator== (const TimeSignature& other) const
- {
- const auto tie = [] (auto& x) { return std::tie (x.numerator, x.denominator); };
- return tie (*this) == tie (other);
- }
+ bool operator== (const TimeSignature& other) const;
bool operator!= (const TimeSignature& other) const
{
@@ -200,11 +192,7 @@ public:
/** The current cycle end position in units of quarter-notes. */
double ppqEnd = 0;
- bool operator== (const LoopPoints& other) const
- {
- const auto tie = [] (auto& x) { return std::tie (x.ppqStart, x.ppqEnd); };
- return tie (*this) == tie (other);
- }
+ bool operator== (const LoopPoints& other) const;
bool operator!= (const LoopPoints& other) const
{
@@ -279,27 +267,7 @@ public:
bool isLooping = false;
//==============================================================================
- bool operator== (const CurrentPositionInfo& other) const noexcept
- {
- const auto tie = [] (const CurrentPositionInfo& i)
- {
- return std::tie (i.timeInSamples,
- i.ppqPosition,
- i.editOriginTime,
- i.ppqPositionOfLastBarStart,
- i.frameRate,
- i.isPlaying,
- i.isRecording,
- i.bpm,
- i.timeSigNumerator,
- i.timeSigDenominator,
- i.ppqLoopStart,
- i.ppqLoopEnd,
- i.isLooping);
- };
-
- return tie (*this) == tie (other);
- }
+ bool operator== (const CurrentPositionInfo& other) const noexcept;
bool operator!= (const CurrentPositionInfo& other) const noexcept
{
@@ -425,28 +393,7 @@ public:
/** @see getIsLooping() */
void setIsLooping (bool isLoopingIn) { setFlag (flagIsLooping, isLoopingIn); }
- bool operator== (const PositionInfo& other) const noexcept
- {
- const auto tie = [] (const PositionInfo& i)
- {
- return std::make_tuple (i.getTimeInSamples(),
- i.getTimeInSeconds(),
- i.getPpqPosition(),
- i.getEditOriginTime(),
- i.getPpqPositionOfLastBarStart(),
- i.getFrameRate(),
- i.getBarCount(),
- i.getTimeSignature(),
- i.getBpm(),
- i.getLoopPoints(),
- i.getHostTimeNs(),
- i.getIsPlaying(),
- i.getIsRecording(),
- i.getIsLooping());
- };
-
- return tie (*this) == tie (other);
- }
+ bool operator== (const PositionInfo& other) const noexcept;
bool operator!= (const PositionInfo& other) const noexcept
{
diff --git a/modules/juce_audio_basics/juce_audio_basics.cpp b/modules/juce_audio_basics/juce_audio_basics.cpp
index 4357374c26..992c3d886a 100644
--- a/modules/juce_audio_basics/juce_audio_basics.cpp
+++ b/modules/juce_audio_basics/juce_audio_basics.cpp
@@ -103,6 +103,8 @@
#include "audio_play_head/juce_AudioPlayHead.cpp"
#include "utilities/juce_AudioWorkgroup.cpp"
+#include "midi/ump/juce_UMPDeviceInfo.cpp"
+#include "midi/ump/juce_UMPFactory.cpp"
#include "midi/ump/juce_UMPUtils.cpp"
#include "midi/ump/juce_UMPView.cpp"
#include "midi/ump/juce_UMPSysEx7.cpp"
diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp b/modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp
new file mode 100644
index 0000000000..06c2cf0a54
--- /dev/null
+++ b/modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.cpp
@@ -0,0 +1,53 @@
+/*
+ ==============================================================================
+
+ 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
+{
+
+auto DeviceInfo::tie() const
+{
+ return std::tie (manufacturer, family, modelNumber, revision);
+}
+
+bool DeviceInfo::operator== (const DeviceInfo& other) const
+{
+ return tie() == other.tie();
+}
+
+bool DeviceInfo::operator!= (const DeviceInfo& other) const
+{
+ return tie() != other.tie();
+}
+
+} // namespace juce::universal_midi_packets
diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h b/modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h
index 2bf5180731..1ed2d0d3d4 100644
--- a/modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h
+++ b/modules/juce_audio_basics/midi/ump/juce_UMPDeviceInfo.h
@@ -49,11 +49,11 @@ struct DeviceInfo
std::array revision;
private:
- auto tie() const { return std::tie (manufacturer, family, modelNumber, revision); }
+ auto tie() const;
public:
- bool operator== (const DeviceInfo& other) const { return tie() == other.tie(); }
- bool operator!= (const DeviceInfo& other) const { return tie() != other.tie(); }
+ bool operator== (const DeviceInfo& other) const;
+ bool operator!= (const DeviceInfo& other) const;
static constexpr auto marshallingVersion = std::nullopt;
diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp b/modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp
new file mode 100644
index 0000000000..c3593b7dba
--- /dev/null
+++ b/modules/juce_audio_basics/midi/ump/juce_UMPFactory.cpp
@@ -0,0 +1,53 @@
+/*
+ ==============================================================================
+
+ 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
+{
+
+auto EndpointInfo::tie() const
+{
+ return std::tie (versionMajor, versionMinor, numFunctionBlocks, flags);
+}
+
+bool EndpointInfo::operator== (const EndpointInfo& other) const
+{
+ return tie() == other.tie();
+}
+
+bool EndpointInfo::operator!= (const EndpointInfo& other) const
+{
+ return tie() != other.tie();
+}
+
+} // namespace juce::universal_midi_packets
diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h b/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h
index da1a8fff9b..bdbb23d93f 100644
--- a/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h
+++ b/modules/juce_audio_basics/midi/ump/juce_UMPFactory.h
@@ -86,7 +86,7 @@ private:
*/
class EndpointInfo
{
- auto tie() const { return std::tie (versionMajor, versionMinor, numFunctionBlocks, flags); }
+ auto tie() const;
public:
[[nodiscard]] EndpointInfo withVersion (uint8_t major, uint8_t minor) const
@@ -122,8 +122,8 @@ public:
/** True if this endpoint is capable of transmitting JR timestamps. */
[[nodiscard]] bool hasTransmitJRSupport() const { return getFlag (supportsTransmitJR); }
- bool operator== (const EndpointInfo& other) const { return tie() == other.tie(); }
- bool operator!= (const EndpointInfo& other) const { return tie() != other.tie(); }
+ bool operator== (const EndpointInfo& other) const;
+ bool operator!= (const EndpointInfo& other) const;
private:
enum Flags
diff --git a/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp b/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp
index bed4602954..c9a909ce70 100644
--- a/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp
+++ b/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp
@@ -220,6 +220,25 @@ void MPEZoneLayout::checkAndLimitZoneParameters (int minValue, int maxValue,
}
}
+//==============================================================================
+bool MPEZone::operator== (const MPEZone& other) const
+{
+ const auto tie = [] (auto& x)
+ {
+ return std::tie (x.zoneType,
+ x.numMemberChannels,
+ x.perNotePitchbendRange,
+ x.masterPitchbendRange);
+ };
+
+ return tie (*this) == tie (other);
+}
+
+bool MPEZone::operator!= (const MPEZone& other) const
+{
+ return ! operator== (other);
+}
+
//==============================================================================
//==============================================================================
diff --git a/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h b/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h
index d50111fcac..4ff5b40402 100644
--- a/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h
+++ b/modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h
@@ -84,23 +84,8 @@ struct MPEZone
return isUsingChannelAsMemberChannel (channel) || channel == getMasterChannel();
}
- static auto tie (const MPEZone& z)
- {
- return std::tie (z.zoneType,
- z.numMemberChannels,
- z.perNotePitchbendRange,
- z.masterPitchbendRange);
- }
-
- bool operator== (const MPEZone& other) const
- {
- return tie (*this) == tie (other);
- }
-
- bool operator!= (const MPEZone& other) const
- {
- return tie (*this) != tie (other);
- }
+ bool operator== (const MPEZone& other) const;
+ bool operator!= (const MPEZone& other) const;
//==============================================================================
static constexpr int lowerZoneMasterChannel = 1,
diff --git a/modules/juce_audio_devices/juce_audio_devices.cpp b/modules/juce_audio_devices/juce_audio_devices.cpp
index 9772450def..a38bbddadc 100644
--- a/modules/juce_audio_devices/juce_audio_devices.cpp
+++ b/modules/juce_audio_devices/juce_audio_devices.cpp
@@ -61,6 +61,7 @@
#include "midi_io/juce_WaitFreeListeners.cpp"
#include "midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp"
+#include "midi_io/ump/juce_UMPBlock.cpp"
#include "midi_io/ump/juce_UMPIOHelpers.cpp"
#include "midi_io/ump/juce_UMPInput.cpp"
#include "midi_io/ump/juce_UMPOutput.cpp"
@@ -69,6 +70,7 @@
#include "midi_io/ump/juce_UMPVirtualEndpoint.cpp"
#include "midi_io/ump/juce_UMPSession.cpp"
#include "midi_io/ump/juce_UMPEndpoints.cpp"
+#include "midi_io/ump/juce_UMPEndpointId.cpp"
#include "audio_io/juce_SampleRateHelpers.cpp"
#include "midi_io/juce_MidiDevices.cpp"
diff --git a/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp b/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp
index 4f7ddf8f25..419ebdc0f9 100644
--- a/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp
+++ b/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp
@@ -399,4 +399,10 @@ MidiDeviceInfo MidiOutput::getDeviceInfo() const noexcept
return customName.has_value() ? storedInfo.withName (*customName) : storedInfo;
}
+bool MidiDeviceInfo::operator== (const MidiDeviceInfo& other) const noexcept
+{
+ const auto tie = [] (auto& x) { return std::tuple (x.name, x.identifier); };
+ return tie (*this) == tie (other);
+}
+
} // namespace juce
diff --git a/modules/juce_audio_devices/midi_io/juce_MidiDevices.h b/modules/juce_audio_devices/midi_io/juce_MidiDevices.h
index 3d48cd64a8..38eb933fd5 100644
--- a/modules/juce_audio_devices/midi_io/juce_MidiDevices.h
+++ b/modules/juce_audio_devices/midi_io/juce_MidiDevices.h
@@ -129,11 +129,7 @@ struct MidiDeviceInfo
[[nodiscard]] MidiDeviceInfo withIdentifier (String x) const { return withMember (*this, &MidiDeviceInfo::identifier, x); }
//==============================================================================
- bool operator== (const MidiDeviceInfo& other) const noexcept
- {
- const auto tie = [] (auto& x) { return std::tuple (x.name, x.identifier); };
- return tie (*this) == tie (other);
- }
+ bool operator== (const MidiDeviceInfo& other) const noexcept;
bool operator!= (const MidiDeviceInfo& other) const noexcept { return ! operator== (other); }
};
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp b/modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp
new file mode 100644
index 0000000000..e2677d2272
--- /dev/null
+++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.cpp
@@ -0,0 +1,49 @@
+/*
+ ==============================================================================
+
+ 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
+{
+
+bool Block::operator== (const Block& other) const
+{
+ const auto tie = [] (auto& x) { return std::tuple (x.info, x.name); };
+ return tie (*this) == tie (other);
+}
+
+bool Block::operator!= (const Block& other) const
+{
+ return ! operator== (other);
+}
+
+}
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h
index a3d9542888..e396dc5249 100644
--- a/modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h
+++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPBlock.h
@@ -140,16 +140,8 @@ public:
return info == other.info;
}
- bool operator== (const Block& other) const
- {
- const auto tie = [] (auto& x) { return std::tuple (x.info, x.name); };
- return tie (*this) == tie (other);
- }
-
- bool operator!= (const Block& other) const
- {
- return ! operator== (other);
- }
+ bool operator== (const Block& other) const;
+ bool operator!= (const Block& other) const;
private:
BlockInfo info;
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp b/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp
new file mode 100644
index 0000000000..e2bb5ee39a
--- /dev/null
+++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.cpp
@@ -0,0 +1,46 @@
+/*
+ ==============================================================================
+
+ 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
+{
+
+auto EndpointId::tie() const { return std::tuple (src, dst); }
+bool EndpointId::operator== (const EndpointId& x) const { return tie() == x.tie(); }
+bool EndpointId::operator!= (const EndpointId& x) const { return tie() != x.tie(); }
+bool EndpointId::operator< (const EndpointId& x) const { return tie() < x.tie(); }
+bool EndpointId::operator<= (const EndpointId& x) const { return tie() <= x.tie(); }
+bool EndpointId::operator> (const EndpointId& x) const { return tie() > x.tie(); }
+bool EndpointId::operator>= (const EndpointId& x) const { return tie() >= x.tie(); }
+
+}
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h
index 710c90608d..62b64bd277 100644
--- a/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h
+++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpointId.h
@@ -60,7 +60,7 @@ constexpr IOKind ioKinds[] { IOKind::src, IOKind::dst };
*/
class EndpointId
{
- auto tie() const { return std::tuple (src, dst); }
+ auto tie() const;
public:
/** @internal */
@@ -68,12 +68,12 @@ public:
EndpointId() = default;
- bool operator== (const EndpointId& x) const { return tie() == x.tie(); }
- bool operator!= (const EndpointId& x) const { return tie() != x.tie(); }
- bool operator< (const EndpointId& x) const { return tie() < x.tie(); }
- bool operator<= (const EndpointId& x) const { return tie() <= x.tie(); }
- bool operator> (const EndpointId& x) const { return tie() > x.tie(); }
- bool operator>= (const EndpointId& x) const { return tie() >= x.tie(); }
+ bool operator== (const EndpointId& x) const;
+ bool operator!= (const EndpointId& x) const;
+ bool operator< (const EndpointId& x) const;
+ bool operator<= (const EndpointId& x) const;
+ bool operator> (const EndpointId& x) const;
+ bool operator>= (const EndpointId& x) const;
String get (IOKind k) const { return k == IOKind::src ? src : dst; }
diff --git a/modules/juce_graphics/colour/juce_ColourGradient.cpp b/modules/juce_graphics/colour/juce_ColourGradient.cpp
index abc0baeee7..ccc60edbf2 100644
--- a/modules/juce_graphics/colour/juce_ColourGradient.cpp
+++ b/modules/juce_graphics/colour/juce_ColourGradient.cpp
@@ -291,4 +291,24 @@ bool ColourGradient::isInvisible() const noexcept
return true;
}
+auto ColourGradient::ColourPoint::tie() const
+{
+ return std::tuple (position, colour.getPixelARGB().getNativeARGB());
+}
+
+bool ColourGradient::ColourPoint::operator== (ColourPoint other) const noexcept
+{
+ return tie() == other.tie();
+}
+
+bool ColourGradient::ColourPoint::operator!= (ColourPoint other) const noexcept
+{
+ return tie() != other.tie();
+}
+
+bool ColourGradient::ColourPoint::operator< (ColourPoint other) const noexcept
+{
+ return tie() < other.tie();
+}
+
} // namespace juce
diff --git a/modules/juce_graphics/colour/juce_ColourGradient.h b/modules/juce_graphics/colour/juce_ColourGradient.h
index 6439c2377a..f74574552f 100644
--- a/modules/juce_graphics/colour/juce_ColourGradient.h
+++ b/modules/juce_graphics/colour/juce_ColourGradient.h
@@ -233,14 +233,15 @@ private:
//==============================================================================
struct ColourPoint
{
- auto tie() const { return std::tuple (position, colour.getPixelARGB().getNativeARGB()); }
-
- bool operator== (ColourPoint other) const noexcept { return tie() == other.tie(); }
- bool operator!= (ColourPoint other) const noexcept { return tie() != other.tie(); }
- bool operator< (ColourPoint other) const noexcept { return tie() < other.tie(); }
+ bool operator== (ColourPoint other) const noexcept;
+ bool operator!= (ColourPoint other) const noexcept;
+ bool operator< (ColourPoint other) const noexcept;
double position;
Colour colour;
+
+ private:
+ auto tie() const;
};
struct ColourPointArrayComparisons;
diff --git a/modules/juce_graphics/detail/juce_SimpleShapedText.cpp b/modules/juce_graphics/detail/juce_SimpleShapedText.cpp
index 456570704c..f20f1a2ea0 100644
--- a/modules/juce_graphics/detail/juce_SimpleShapedText.cpp
+++ b/modules/juce_graphics/detail/juce_SimpleShapedText.cpp
@@ -35,6 +35,34 @@
namespace juce::detail
{
+auto ShapedTextOptions::tie() const
+{
+ return std::tie (justification,
+ readingDir,
+ wordWrapWidth,
+ alignmentWidth,
+ height,
+ fontsForRange,
+ firstLineIndent,
+ leading,
+ additiveLineSpacing,
+ baselineAtZero,
+ allowBreakingInsideWord,
+ trailingWhitespacesShouldFit,
+ maxNumLines,
+ ellipsis);
+}
+
+bool ShapedTextOptions::operator== (const ShapedTextOptions& other) const
+{
+ return tie() == other.tie();
+}
+
+bool ShapedTextOptions::operator!= (const ShapedTextOptions& other) const
+{
+ return tie() != other.tie();
+}
+
//==============================================================================
constexpr hb_script_t getScriptTag (TextScript type)
{
diff --git a/modules/juce_graphics/detail/juce_SimpleShapedText.h b/modules/juce_graphics/detail/juce_SimpleShapedText.h
index 555d89e32f..2b653b476d 100644
--- a/modules/juce_graphics/detail/juce_SimpleShapedText.h
+++ b/modules/juce_graphics/detail/juce_SimpleShapedText.h
@@ -45,27 +45,11 @@ enum class TextDirection
class ShapedTextOptions
{
private:
- auto tie() const
- {
- return std::tie (justification,
- readingDir,
- wordWrapWidth,
- alignmentWidth,
- height,
- fontsForRange,
- firstLineIndent,
- leading,
- additiveLineSpacing,
- baselineAtZero,
- allowBreakingInsideWord,
- trailingWhitespacesShouldFit,
- maxNumLines,
- ellipsis);
- }
+ auto tie() const;
public:
- bool operator== (const ShapedTextOptions& other) const { return tie() == other.tie(); }
- bool operator!= (const ShapedTextOptions& other) const { return tie() != other.tie(); }
+ bool operator== (const ShapedTextOptions& other) const;
+ bool operator!= (const ShapedTextOptions& other) const;
//==============================================================================
[[nodiscard]] ShapedTextOptions withJustification (Justification x) const
diff --git a/modules/juce_graphics/fonts/juce_FontFeatures.cpp b/modules/juce_graphics/fonts/juce_FontFeatures.cpp
index be967f4461..3a07096542 100644
--- a/modules/juce_graphics/fonts/juce_FontFeatures.cpp
+++ b/modules/juce_graphics/fonts/juce_FontFeatures.cpp
@@ -35,6 +35,42 @@
namespace juce
{
+constexpr auto FontFeatureSetting::tie() const
+{
+ return std::tuple (tag, value);
+}
+
+constexpr bool FontFeatureSetting::operator< (const FontFeatureSetting& other) const
+{
+ return tie() < other.tie();
+}
+
+constexpr bool FontFeatureSetting::operator<= (const FontFeatureSetting& other) const
+{
+ return tie() <= other.tie();
+}
+
+constexpr bool FontFeatureSetting::operator> (const FontFeatureSetting& other) const
+{
+ return tie() > other.tie();
+}
+
+constexpr bool FontFeatureSetting::operator>= (const FontFeatureSetting& other) const
+{
+ return tie() >= other.tie();
+}
+
+constexpr bool FontFeatureSetting::operator== (const FontFeatureSetting& other) const
+{
+ return tie() == other.tie();
+}
+
+constexpr bool FontFeatureSetting::operator!= (const FontFeatureSetting& other) const
+{
+ return tie() != other.tie();
+}
+
+//==============================================================================
FontFeatureTag FontFeatureTag::fromString (const String& string)
{
if (string.getNumBytesAsUTF8() != 4)
diff --git a/modules/juce_graphics/fonts/juce_FontFeatures.h b/modules/juce_graphics/fonts/juce_FontFeatures.h
index 8a1eee109b..5224199be2 100644
--- a/modules/juce_graphics/fonts/juce_FontFeatures.h
+++ b/modules/juce_graphics/fonts/juce_FontFeatures.h
@@ -107,7 +107,7 @@ private:
*/
class JUCE_API FontFeatureSetting final
{
- constexpr auto tie() const { return std::tuple (tag, value); }
+ constexpr auto tie() const;
public:
/** Common feature values for convenience. */
@@ -123,12 +123,12 @@ public:
{
}
- [[nodiscard]] constexpr bool operator< (const FontFeatureSetting& other) const { return tie() < other.tie(); }
- [[nodiscard]] constexpr bool operator<= (const FontFeatureSetting& other) const { return tie() <= other.tie(); }
- [[nodiscard]] constexpr bool operator> (const FontFeatureSetting& other) const { return tie() > other.tie(); }
- [[nodiscard]] constexpr bool operator>= (const FontFeatureSetting& other) const { return tie() >= other.tie(); }
- [[nodiscard]] constexpr bool operator== (const FontFeatureSetting& other) const { return tie() == other.tie(); }
- [[nodiscard]] constexpr bool operator!= (const FontFeatureSetting& other) const { return tie() != other.tie(); }
+ [[nodiscard]] constexpr bool operator< (const FontFeatureSetting& other) const;
+ [[nodiscard]] constexpr bool operator<= (const FontFeatureSetting& other) const;
+ [[nodiscard]] constexpr bool operator> (const FontFeatureSetting& other) const;
+ [[nodiscard]] constexpr bool operator>= (const FontFeatureSetting& other) const;
+ [[nodiscard]] constexpr bool operator== (const FontFeatureSetting& other) const;
+ [[nodiscard]] constexpr bool operator!= (const FontFeatureSetting& other) const;
/** The OpenType feature tag. */
FontFeatureTag tag;
diff --git a/modules/juce_midi_ci/ci/juce_CIChannelAddress.cpp b/modules/juce_midi_ci/ci/juce_CIChannelAddress.cpp
new file mode 100644
index 0000000000..16175644ef
--- /dev/null
+++ b/modules/juce_midi_ci/ci/juce_CIChannelAddress.cpp
@@ -0,0 +1,44 @@
+/*
+ ==============================================================================
+
+ 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::midi_ci
+{
+ auto ChannelAddress::tie() const { return std::tie (group, channel); }
+ bool ChannelAddress::operator< (const ChannelAddress& other) const { return tie() < other.tie(); }
+ bool ChannelAddress::operator<= (const ChannelAddress& other) const { return tie() <= other.tie(); }
+ bool ChannelAddress::operator> (const ChannelAddress& other) const { return tie() > other.tie(); }
+ bool ChannelAddress::operator>= (const ChannelAddress& other) const { return tie() >= other.tie(); }
+ bool ChannelAddress::operator== (const ChannelAddress& other) const { return tie() == other.tie(); }
+ bool ChannelAddress::operator!= (const ChannelAddress& other) const { return ! operator== (other); }
+} // namespace juce::midi_ci
diff --git a/modules/juce_midi_ci/ci/juce_CIChannelAddress.h b/modules/juce_midi_ci/ci/juce_CIChannelAddress.h
index c7f47faf23..98f89eff1e 100644
--- a/modules/juce_midi_ci/ci/juce_CIChannelAddress.h
+++ b/modules/juce_midi_ci/ci/juce_CIChannelAddress.h
@@ -46,7 +46,7 @@ private:
uint8_t group{}; ///< A group within a MIDI endpoint, where 0 <= group && group < 16
ChannelInGroup channel{}; ///< A set of channels related to specified group
- auto tie() const { return std::tie (group, channel); }
+ auto tie() const;
public:
/** Returns a copy of this object with the specified group. */
@@ -81,12 +81,12 @@ public:
/** Returns true if this address refers to a single channel. */
bool isSingleChannel() const { return ! isBlock() && ! isGroup(); }
- bool operator< (const ChannelAddress& other) const { return tie() < other.tie(); }
- bool operator<= (const ChannelAddress& other) const { return tie() <= other.tie(); }
- bool operator> (const ChannelAddress& other) const { return tie() > other.tie(); }
- bool operator>= (const ChannelAddress& other) const { return tie() >= other.tie(); }
- bool operator== (const ChannelAddress& other) const { return tie() == other.tie(); }
- bool operator!= (const ChannelAddress& other) const { return ! operator== (other); }
+ bool operator< (const ChannelAddress& other) const;
+ bool operator<= (const ChannelAddress& other) const;
+ bool operator> (const ChannelAddress& other) const;
+ bool operator>= (const ChannelAddress& other) const;
+ bool operator== (const ChannelAddress& other) const;
+ bool operator!= (const ChannelAddress& other) const;
};
} // namespace juce::midi_ci
diff --git a/modules/juce_midi_ci/ci/juce_CIMessages.cpp b/modules/juce_midi_ci/ci/juce_CIMessages.cpp
new file mode 100644
index 0000000000..71b07cb926
--- /dev/null
+++ b/modules/juce_midi_ci/ci/juce_CIMessages.cpp
@@ -0,0 +1,325 @@
+/*
+ ==============================================================================
+
+ 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::midi_ci::Message
+{
+
+//==============================================================================
+auto Header::tie() const
+{
+ return std::tuple (deviceID, category, version, source, destination);
+}
+
+bool Header::operator== (const Header& x) const { return tie() == x.tie(); }
+bool Header::operator!= (const Header& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto DiscoveryResponse::tie() const
+{
+ return std::tuple (device, capabilities, maximumSysexSize, outputPathID, functionBlock);
+}
+
+bool DiscoveryResponse::operator== (const DiscoveryResponse& x) const { return tie() == x.tie(); }
+bool DiscoveryResponse::operator!= (const DiscoveryResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto Discovery::tie() const
+{
+ return std::tuple (device, capabilities, maximumSysexSize, outputPathID);
+}
+
+bool Discovery::operator== (const Discovery& x) const { return tie() == x.tie(); }
+bool Discovery::operator!= (const Discovery& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto EndpointInquiryResponse::tie() const
+{
+ return std::tuple (status, makeComparableRange (data));
+}
+
+bool EndpointInquiryResponse::operator== (const EndpointInquiryResponse& x) const { return tie() == x.tie(); }
+bool EndpointInquiryResponse::operator!= (const EndpointInquiryResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto EndpointInquiry::tie() const
+{
+ return std::tuple (status);
+}
+
+bool EndpointInquiry::operator== (const EndpointInquiry& x) const { return tie() == x.tie(); }
+bool EndpointInquiry::operator!= (const EndpointInquiry& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto InvalidateMUID::tie() const
+{
+ return std::tuple (target);
+}
+
+bool InvalidateMUID::operator== (const InvalidateMUID& x) const { return tie() == x.tie(); }
+bool InvalidateMUID::operator!= (const InvalidateMUID& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ACK::tie() const
+{
+ return std::tuple (originalCategory, statusCode, statusData, details, makeComparableRange (messageText));
+}
+
+bool ACK::operator== (const ACK& x) const { return tie() == x.tie(); }
+bool ACK::operator!= (const ACK& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto NAK::tie() const
+{
+ return std::tuple (originalCategory, statusCode, statusData, details, makeComparableRange (messageText));
+}
+
+bool NAK::operator== (const NAK& x) const { return tie() == x.tie(); }
+bool NAK::operator!= (const NAK& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileInquiryResponse::tie() const
+{
+ return std::tuple (makeComparableRange (enabledProfiles), makeComparableRange (disabledProfiles));
+}
+
+bool ProfileInquiryResponse::operator== (const ProfileInquiryResponse& x) const { return tie() == x.tie(); }
+bool ProfileInquiryResponse::operator!= (const ProfileInquiryResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileInquiry::tie() const
+{
+ return std::tuple<>();
+}
+
+bool ProfileInquiry::operator== (const ProfileInquiry& x) const { return tie() == x.tie(); }
+bool ProfileInquiry::operator!= (const ProfileInquiry& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileAdded::tie() const
+{
+ return std::tuple (profile);
+}
+
+bool ProfileAdded::operator== (const ProfileAdded& x) const { return tie() == x.tie(); }
+bool ProfileAdded::operator!= (const ProfileAdded& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileRemoved::tie() const
+{
+ return std::tuple (profile);
+}
+
+bool ProfileRemoved::operator== (const ProfileRemoved& x) const { return tie() == x.tie(); }
+bool ProfileRemoved::operator!= (const ProfileRemoved& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileDetailsResponse::tie() const
+{
+ return std::tuple (profile, target, makeComparableRange (data));
+}
+
+bool ProfileDetailsResponse::operator== (const ProfileDetailsResponse& x) const { return tie() == x.tie(); }
+bool ProfileDetailsResponse::operator!= (const ProfileDetailsResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileDetails::tie() const
+{
+ return std::tuple (profile, target);
+}
+
+bool ProfileDetails::operator== (const ProfileDetails& x) const { return tie() == x.tie(); }
+bool ProfileDetails::operator!= (const ProfileDetails& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileOn::tie() const
+{
+ return std::tuple (profile, numChannels);
+}
+
+bool ProfileOn::operator== (const ProfileOn& x) const { return tie() == x.tie(); }
+bool ProfileOn::operator!= (const ProfileOn& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileOff::tie() const
+{
+ return std::tuple (profile);
+}
+
+bool ProfileOff::operator== (const ProfileOff& x) const { return tie() == x.tie(); }
+bool ProfileOff::operator!= (const ProfileOff& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileEnabledReport::tie() const
+{
+ return std::tuple (profile, numChannels);
+}
+
+bool ProfileEnabledReport::operator== (const ProfileEnabledReport& x) const { return tie() == x.tie(); }
+bool ProfileEnabledReport::operator!= (const ProfileEnabledReport& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileDisabledReport::tie() const
+{
+ return std::tuple (profile, numChannels);
+}
+
+bool ProfileDisabledReport::operator== (const ProfileDisabledReport& x) const { return tie() == x.tie(); }
+bool ProfileDisabledReport::operator!= (const ProfileDisabledReport& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProfileSpecificData::tie() const
+{
+ return std::tuple (profile, makeComparableRange (data));
+}
+
+bool ProfileSpecificData::operator== (const ProfileSpecificData& x) const { return tie() == x.tie(); }
+bool ProfileSpecificData::operator!= (const ProfileSpecificData& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto PropertyExchangeCapabilitiesResponse::tie() const
+{
+ return std::tuple (numSimultaneousRequestsSupported, majorVersion, minorVersion);
+}
+
+bool PropertyExchangeCapabilitiesResponse::operator== (const PropertyExchangeCapabilitiesResponse& x) const { return tie() == x.tie(); }
+bool PropertyExchangeCapabilitiesResponse::operator!= (const PropertyExchangeCapabilitiesResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto PropertyExchangeCapabilities::tie() const
+{
+ return std::tuple (numSimultaneousRequestsSupported, majorVersion, minorVersion);
+}
+
+bool PropertyExchangeCapabilities::operator== (const PropertyExchangeCapabilities& x) const { return tie() == x.tie(); }
+bool PropertyExchangeCapabilities::operator!= (const PropertyExchangeCapabilities& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto StaticSizePropertyExchange::tie() const
+{
+ return std::tuple (requestID, makeComparableRange (header));
+}
+
+//==============================================================================
+auto DynamicSizePropertyExchange::tie() const
+{
+ return std::tuple (requestID,
+ makeComparableRange (header),
+ totalNumChunks,
+ thisChunkNum,
+ makeComparableRange (data));
+}
+
+//==============================================================================
+bool PropertyGetDataResponse::operator== (const PropertyGetDataResponse& x) const { return tie() == x.tie(); }
+bool PropertyGetDataResponse::operator!= (const PropertyGetDataResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+bool PropertyGetData::operator== (const PropertyGetData& x) const { return tie() == x.tie(); }
+bool PropertyGetData::operator!= (const PropertyGetData& x) const { return ! operator== (x); }
+
+//==============================================================================
+bool PropertySetDataResponse::operator== (const PropertySetDataResponse& x) const { return tie() == x.tie(); }
+bool PropertySetDataResponse::operator!= (const PropertySetDataResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+bool PropertySetData::operator== (const PropertySetData& x) const { return tie() == x.tie(); }
+bool PropertySetData::operator!= (const PropertySetData& x) const { return ! operator== (x); }
+
+//==============================================================================
+bool PropertySubscribeResponse::operator== (const PropertySubscribeResponse& x) const { return tie() == x.tie(); }
+bool PropertySubscribeResponse::operator!= (const PropertySubscribeResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+bool PropertySubscribe::operator== (const PropertySubscribe& x) const { return tie() == x.tie(); }
+bool PropertySubscribe::operator!= (const PropertySubscribe& x) const { return ! operator== (x); }
+
+//==============================================================================
+bool PropertyNotify::operator== (const PropertyNotify& x) const { return tie() == x.tie(); }
+bool PropertyNotify::operator!= (const PropertyNotify& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProcessInquiryResponse::tie() const
+{
+ return std::tuple (supportedFeatures);
+}
+
+bool ProcessInquiryResponse::operator== (const ProcessInquiryResponse& x) const { return tie() == x.tie(); }
+bool ProcessInquiryResponse::operator!= (const ProcessInquiryResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProcessInquiry::tie() const
+{
+ return std::tuple<>();
+}
+
+bool ProcessInquiry::operator== (const ProcessInquiry& x) const { return tie() == x.tie(); }
+bool ProcessInquiry::operator!= (const ProcessInquiry& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProcessMidiMessageReportResponse::tie() const
+{
+ return std::tuple (messageDataControl, requestedMessages, channelControllerMessages, noteDataMessages);
+}
+
+bool ProcessMidiMessageReportResponse::operator== (const ProcessMidiMessageReportResponse& x) const { return tie() == x.tie(); }
+bool ProcessMidiMessageReportResponse::operator!= (const ProcessMidiMessageReportResponse& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProcessMidiMessageReport::tie() const
+{
+ return std::tuple (messageDataControl, requestedMessages, channelControllerMessages, noteDataMessages);
+}
+
+bool ProcessMidiMessageReport::operator== (const ProcessMidiMessageReport& x) const { return tie() == x.tie(); }
+bool ProcessMidiMessageReport::operator!= (const ProcessMidiMessageReport& x) const { return ! operator== (x); }
+
+//==============================================================================
+auto ProcessEndMidiMessageReport::tie() const
+{
+ return std::tuple<>();
+}
+
+bool ProcessEndMidiMessageReport::operator== (const ProcessEndMidiMessageReport& x) const { return tie() == x.tie(); }
+bool ProcessEndMidiMessageReport::operator!= (const ProcessEndMidiMessageReport& x) const { return ! operator== (x); }
+
+//==============================================================================
+bool Parsed::operator== (const Parsed& other) const
+{
+ const auto tie = [] (const auto& x) { return std::tie (x.header, x.body); };
+ return tie (*this) == tie (other);
+}
+
+bool Parsed::operator!= (const Parsed& other) const { return ! operator== (other); }
+
+} // namespace juce::midi_ci::Message
diff --git a/modules/juce_midi_ci/ci/juce_CIMessages.h b/modules/juce_midi_ci/ci/juce_CIMessages.h
index 0be935c83d..910441e8dd 100644
--- a/modules/juce_midi_ci/ci/juce_CIMessages.h
+++ b/modules/juce_midi_ci/ci/juce_CIMessages.h
@@ -131,13 +131,10 @@ namespace Message
MUID source = MUID::makeUnchecked (0);
MUID destination = MUID::makeUnchecked (0);
- auto tie() const
- {
- return std::tuple (deviceID, category, version, source, destination);
- }
+ auto tie() const;
- bool operator== (const Header& x) const { return tie() == x.tie(); }
- bool operator!= (const Header& x) const { return ! operator== (x); }
+ bool operator== (const Header& x) const;
+ bool operator!= (const Header& x) const;
};
/**
@@ -164,13 +161,10 @@ namespace Message
std::byte outputPathID{}; /**< Only valid if the message header specifies version 0x02 or greater. */
std::byte functionBlock{}; /**< Only valid if the message header specifies version 0x02 or greater. */
- auto tie() const
- {
- return std::tuple (device, capabilities, maximumSysexSize, outputPathID, functionBlock);
- }
+ auto tie() const;
- bool operator== (const DiscoveryResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const DiscoveryResponse& x) const { return ! operator== (x); }
+ bool operator== (const DiscoveryResponse& x) const;
+ bool operator!= (const DiscoveryResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -184,13 +178,10 @@ namespace Message
uint32_t maximumSysexSize{};
std::byte outputPathID{}; /**< Only valid if the message header specifies version 0x02 or greater. */
- auto tie() const
- {
- return std::tuple (device, capabilities, maximumSysexSize, outputPathID);
- }
+ auto tie() const;
- bool operator== (const Discovery& x) const { return tie() == x.tie(); }
- bool operator!= (const Discovery& x) const { return ! operator== (x); }
+ bool operator== (const Discovery& x) const;
+ bool operator!= (const Discovery& x) const;
};
/** See the MIDI-CI specification.
@@ -202,13 +193,10 @@ namespace Message
std::byte status;
Span data;
- auto tie() const
- {
- return std::tuple (status, makeComparableRange (data));
- }
+ auto tie() const;
- bool operator== (const EndpointInquiryResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const EndpointInquiryResponse& x) const { return ! operator== (x); }
+ bool operator== (const EndpointInquiryResponse& x) const;
+ bool operator!= (const EndpointInquiryResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -219,13 +207,10 @@ namespace Message
{
std::byte status;
- auto tie() const
- {
- return std::tuple (status);
- }
+ auto tie() const;
- bool operator== (const EndpointInquiry& x) const { return tie() == x.tie(); }
- bool operator!= (const EndpointInquiry& x) const { return ! operator== (x); }
+ bool operator== (const EndpointInquiry& x) const;
+ bool operator!= (const EndpointInquiry& x) const;
};
/** See the MIDI-CI specification.
@@ -236,13 +221,10 @@ namespace Message
{
MUID target = MUID::makeUnchecked (0);
- auto tie() const
- {
- return std::tuple (target);
- }
+ auto tie() const;
- bool operator== (const InvalidateMUID& x) const { return tie() == x.tie(); }
- bool operator!= (const InvalidateMUID& x) const { return ! operator== (x); }
+ bool operator== (const InvalidateMUID& x) const;
+ bool operator!= (const InvalidateMUID& x) const;
};
/** See the MIDI-CI specification.
@@ -263,13 +245,10 @@ namespace Message
return Encodings::stringFrom7BitText (messageText);
}
- auto tie() const
- {
- return std::tuple (originalCategory, statusCode, statusData, details, makeComparableRange (messageText));
- }
+ auto tie() const;
- bool operator== (const ACK& x) const { return tie() == x.tie(); }
- bool operator!= (const ACK& x) const { return ! operator== (x); }
+ bool operator== (const ACK& x) const;
+ bool operator!= (const ACK& x) const;
};
/** See the MIDI-CI specification.
@@ -290,13 +269,10 @@ namespace Message
return Encodings::stringFrom7BitText (messageText);
}
- auto tie() const
- {
- return std::tuple (originalCategory, statusCode, statusData, details, makeComparableRange (messageText));
- }
+ auto tie() const;
- bool operator== (const NAK& x) const { return tie() == x.tie(); }
- bool operator!= (const NAK& x) const { return ! operator== (x); }
+ bool operator== (const NAK& x) const;
+ bool operator!= (const NAK& x) const;
};
/** See the MIDI-CI specification.
@@ -308,13 +284,10 @@ namespace Message
Span enabledProfiles;
Span disabledProfiles;
- auto tie() const
- {
- return std::tuple (makeComparableRange (enabledProfiles), makeComparableRange (disabledProfiles));
- }
+ auto tie() const;
- bool operator== (const ProfileInquiryResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileInquiryResponse& x) const { return ! operator== (x); }
+ bool operator== (const ProfileInquiryResponse& x) const;
+ bool operator!= (const ProfileInquiryResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -323,13 +296,10 @@ namespace Message
*/
struct ProfileInquiry
{
- auto tie() const
- {
- return std::tuple<>();
- }
+ auto tie() const;
- bool operator== (const ProfileInquiry& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileInquiry& x) const { return ! operator== (x); }
+ bool operator== (const ProfileInquiry& x) const;
+ bool operator!= (const ProfileInquiry& x) const;
};
/** See the MIDI-CI specification.
@@ -340,13 +310,10 @@ namespace Message
{
Profile profile{};
- auto tie() const
- {
- return std::tuple (profile);
- }
+ auto tie() const;
- bool operator== (const ProfileAdded& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileAdded& x) const { return ! operator== (x); }
+ bool operator== (const ProfileAdded& x) const;
+ bool operator!= (const ProfileAdded& x) const;
};
/** See the MIDI-CI specification.
@@ -357,13 +324,10 @@ namespace Message
{
Profile profile{};
- auto tie() const
- {
- return std::tuple (profile);
- }
+ auto tie() const;
- bool operator== (const ProfileRemoved& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileRemoved& x) const { return ! operator== (x); }
+ bool operator== (const ProfileRemoved& x) const;
+ bool operator!= (const ProfileRemoved& x) const;
};
/** See the MIDI-CI specification.
@@ -376,13 +340,10 @@ namespace Message
std::byte target{};
Span data;
- auto tie() const
- {
- return std::tuple (profile, target, makeComparableRange (data));
- }
+ auto tie() const;
- bool operator== (const ProfileDetailsResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileDetailsResponse& x) const { return ! operator== (x); }
+ bool operator== (const ProfileDetailsResponse& x) const;
+ bool operator!= (const ProfileDetailsResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -394,13 +355,10 @@ namespace Message
Profile profile{};
std::byte target{};
- auto tie() const
- {
- return std::tuple (profile, target);
- }
+ auto tie() const;
- bool operator== (const ProfileDetails& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileDetails& x) const { return ! operator== (x); }
+ bool operator== (const ProfileDetails& x) const;
+ bool operator!= (const ProfileDetails& x) const;
};
/** See the MIDI-CI specification.
@@ -412,13 +370,10 @@ namespace Message
Profile profile{};
uint16_t numChannels{}; /**< Only valid if the message header specifies version 0x02 or greater. */
- auto tie() const
- {
- return std::tuple (profile, numChannels);
- }
+ auto tie() const;
- bool operator== (const ProfileOn& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileOn& x) const { return ! operator== (x); }
+ bool operator== (const ProfileOn& x) const;
+ bool operator!= (const ProfileOn& x) const;
};
/** See the MIDI-CI specification.
@@ -429,13 +384,10 @@ namespace Message
{
Profile profile{};
- auto tie() const
- {
- return std::tuple (profile);
- }
+ auto tie() const;
- bool operator== (const ProfileOff& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileOff& x) const { return ! operator== (x); }
+ bool operator== (const ProfileOff& x) const;
+ bool operator!= (const ProfileOff& x) const;
};
/** See the MIDI-CI specification.
@@ -447,13 +399,10 @@ namespace Message
Profile profile{};
uint16_t numChannels{}; /**< Only valid if the message header specifies version 0x02 or greater. */
- auto tie() const
- {
- return std::tuple (profile, numChannels);
- }
+ auto tie() const;
- bool operator== (const ProfileEnabledReport& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileEnabledReport& x) const { return ! operator== (x); }
+ bool operator== (const ProfileEnabledReport& x) const;
+ bool operator!= (const ProfileEnabledReport& x) const;
};
/** See the MIDI-CI specification.
@@ -465,13 +414,10 @@ namespace Message
Profile profile{};
uint16_t numChannels{}; /**< Only valid if the message header specifies version 0x02 or greater. */
- auto tie() const
- {
- return std::tuple (profile, numChannels);
- }
+ auto tie() const;
- bool operator== (const ProfileDisabledReport& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileDisabledReport& x) const { return ! operator== (x); }
+ bool operator== (const ProfileDisabledReport& x) const;
+ bool operator!= (const ProfileDisabledReport& x) const;
};
/** See the MIDI-CI specification.
@@ -483,13 +429,10 @@ namespace Message
Profile profile{};
Span data;
- auto tie() const
- {
- return std::tuple (profile, makeComparableRange (data));
- }
+ auto tie() const;
- bool operator== (const ProfileSpecificData& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileSpecificData& x) const { return ! operator== (x); }
+ bool operator== (const ProfileSpecificData& x) const;
+ bool operator!= (const ProfileSpecificData& x) const;
};
/** See the MIDI-CI specification.
@@ -502,13 +445,10 @@ namespace Message
std::byte majorVersion{}; /**< Only valid if the message header specifies version 0x02 or greater. */
std::byte minorVersion{}; /**< Only valid if the message header specifies version 0x02 or greater. */
- auto tie() const
- {
- return std::tuple (numSimultaneousRequestsSupported, majorVersion, minorVersion);
- }
+ auto tie() const;
- bool operator== (const PropertyExchangeCapabilitiesResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const PropertyExchangeCapabilitiesResponse& x) const { return ! operator== (x); }
+ bool operator== (const PropertyExchangeCapabilitiesResponse& x) const;
+ bool operator!= (const PropertyExchangeCapabilitiesResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -521,13 +461,10 @@ namespace Message
std::byte majorVersion{}; /**< Only valid if the message header specifies version 0x02 or greater. */
std::byte minorVersion{}; /**< Only valid if the message header specifies version 0x02 or greater. */
- auto tie() const
- {
- return std::tuple (numSimultaneousRequestsSupported, majorVersion, minorVersion);
- }
+ auto tie() const;
- bool operator== (const PropertyExchangeCapabilities& x) const { return tie() == x.tie(); }
- bool operator!= (const PropertyExchangeCapabilities& x) const { return ! operator== (x); }
+ bool operator== (const PropertyExchangeCapabilities& x) const;
+ bool operator!= (const PropertyExchangeCapabilities& x) const;
};
/** A property-exchange message that has no payload, and must therefore
@@ -540,10 +477,7 @@ namespace Message
std::byte requestID{};
Span header;
- auto tie() const
- {
- return std::tuple (requestID, makeComparableRange (header));
- }
+ auto tie() const;
};
/** A property-exchange message that may form part of a multi-chunk
@@ -559,14 +493,7 @@ namespace Message
uint16_t thisChunkNum{};
Span data;
- auto tie() const
- {
- return std::tuple (requestID,
- makeComparableRange (header),
- totalNumChunks,
- thisChunkNum,
- makeComparableRange (data));
- }
+ auto tie() const;
};
/** See the MIDI-CI specification.
@@ -575,8 +502,8 @@ namespace Message
*/
struct PropertyGetDataResponse : public DynamicSizePropertyExchange
{
- bool operator== (const PropertyGetDataResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const PropertyGetDataResponse& x) const { return ! operator== (x); }
+ bool operator== (const PropertyGetDataResponse& x) const;
+ bool operator!= (const PropertyGetDataResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -585,8 +512,8 @@ namespace Message
*/
struct PropertyGetData : public StaticSizePropertyExchange
{
- bool operator== (const PropertyGetData& x) const { return tie() == x.tie(); }
- bool operator!= (const PropertyGetData& x) const { return ! operator== (x); }
+ bool operator== (const PropertyGetData& x) const;
+ bool operator!= (const PropertyGetData& x) const;
};
/** See the MIDI-CI specification.
@@ -595,8 +522,8 @@ namespace Message
*/
struct PropertySetDataResponse : public StaticSizePropertyExchange
{
- bool operator== (const PropertySetDataResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const PropertySetDataResponse& x) const { return ! operator== (x); }
+ bool operator== (const PropertySetDataResponse& x) const;
+ bool operator!= (const PropertySetDataResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -605,8 +532,8 @@ namespace Message
*/
struct PropertySetData : public DynamicSizePropertyExchange
{
- bool operator== (const PropertySetData& x) const { return tie() == x.tie(); }
- bool operator!= (const PropertySetData& x) const { return ! operator== (x); }
+ bool operator== (const PropertySetData& x) const;
+ bool operator!= (const PropertySetData& x) const;
};
/** See the MIDI-CI specification.
@@ -615,8 +542,8 @@ namespace Message
*/
struct PropertySubscribeResponse : public DynamicSizePropertyExchange
{
- bool operator== (const PropertySubscribeResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const PropertySubscribeResponse& x) const { return ! operator== (x); }
+ bool operator== (const PropertySubscribeResponse& x) const;
+ bool operator!= (const PropertySubscribeResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -625,8 +552,8 @@ namespace Message
*/
struct PropertySubscribe : public DynamicSizePropertyExchange
{
- bool operator== (const PropertySubscribe& x) const { return tie() == x.tie(); }
- bool operator!= (const PropertySubscribe& x) const { return ! operator== (x); }
+ bool operator== (const PropertySubscribe& x) const;
+ bool operator!= (const PropertySubscribe& x) const;
};
/** See the MIDI-CI specification.
@@ -635,8 +562,8 @@ namespace Message
*/
struct PropertyNotify : public DynamicSizePropertyExchange
{
- bool operator== (const PropertyNotify& x) const { return tie() == x.tie(); }
- bool operator!= (const PropertyNotify& x) const { return ! operator== (x); }
+ bool operator== (const PropertyNotify& x) const;
+ bool operator!= (const PropertyNotify& x) const;
};
/** See the MIDI-CI specification.
@@ -647,13 +574,10 @@ namespace Message
{
std::byte supportedFeatures{};
- auto tie() const
- {
- return std::tuple (supportedFeatures);
- }
+ auto tie() const;
- bool operator== (const ProcessInquiryResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const ProcessInquiryResponse& x) const { return ! operator== (x); }
+ bool operator== (const ProcessInquiryResponse& x) const;
+ bool operator!= (const ProcessInquiryResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -662,13 +586,10 @@ namespace Message
*/
struct ProcessInquiry
{
- auto tie() const
- {
- return std::tuple<>();
- }
+ auto tie() const;
- bool operator== (const ProcessInquiry& x) const { return tie() == x.tie(); }
- bool operator!= (const ProcessInquiry& x) const { return ! operator== (x); }
+ bool operator== (const ProcessInquiry& x) const;
+ bool operator!= (const ProcessInquiry& x) const;
};
/** See the MIDI-CI specification.
@@ -682,13 +603,10 @@ namespace Message
std::byte channelControllerMessages{};
std::byte noteDataMessages{};
- auto tie() const
- {
- return std::tuple (messageDataControl, requestedMessages, channelControllerMessages, noteDataMessages);
- }
+ auto tie() const;
- bool operator== (const ProcessMidiMessageReportResponse& x) const { return tie() == x.tie(); }
- bool operator!= (const ProcessMidiMessageReportResponse& x) const { return ! operator== (x); }
+ bool operator== (const ProcessMidiMessageReportResponse& x) const;
+ bool operator!= (const ProcessMidiMessageReportResponse& x) const;
};
/** See the MIDI-CI specification.
@@ -702,13 +620,10 @@ namespace Message
std::byte channelControllerMessages{};
std::byte noteDataMessages{};
- auto tie() const
- {
- return std::tuple (messageDataControl, requestedMessages, channelControllerMessages, noteDataMessages);
- }
+ auto tie() const;
- bool operator== (const ProcessMidiMessageReport& x) const { return tie() == x.tie(); }
- bool operator!= (const ProcessMidiMessageReport& x) const { return ! operator== (x); }
+ bool operator== (const ProcessMidiMessageReport& x) const;
+ bool operator!= (const ProcessMidiMessageReport& x) const;
};
/** See the MIDI-CI specification.
@@ -717,13 +632,10 @@ namespace Message
*/
struct ProcessEndMidiMessageReport
{
- auto tie() const
- {
- return std::tuple<>();
- }
+ auto tie() const;
- bool operator== (const ProcessEndMidiMessageReport& x) const { return tie() == x.tie(); }
- bool operator!= (const ProcessEndMidiMessageReport& x) const { return ! operator== (x); }
+ bool operator== (const ProcessEndMidiMessageReport& x) const;
+ bool operator!= (const ProcessEndMidiMessageReport& x) const;
};
/**
@@ -773,13 +685,8 @@ namespace Message
Header header;
Body body;
- bool operator== (const Parsed& other) const
- {
- const auto tie = [] (const auto& x) { return std::tie (x.header, x.body); };
- return tie (*this) == tie (other);
- }
-
- bool operator!= (const Parsed& other) const { return ! operator== (other); }
+ bool operator== (const Parsed& other) const;
+ bool operator!= (const Parsed& other) const;
};
}
diff --git a/modules/juce_midi_ci/ci/juce_CIProfileAtAddress.cpp b/modules/juce_midi_ci/ci/juce_CIProfileAtAddress.cpp
new file mode 100644
index 0000000000..b7ae8b6a36
--- /dev/null
+++ b/modules/juce_midi_ci/ci/juce_CIProfileAtAddress.cpp
@@ -0,0 +1,48 @@
+/*
+ ==============================================================================
+
+ 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::midi_ci
+{
+
+auto ProfileAtAddress::tie() const { return std::tie (profile, address); }
+
+bool ProfileAtAddress::operator== (const ProfileAtAddress& x) const { return tie() == x.tie(); }
+bool ProfileAtAddress::operator!= (const ProfileAtAddress& x) const { return tie() != x.tie(); }
+
+bool ProfileAtAddress::operator< (const ProfileAtAddress& x) const { return tie() < x.tie(); }
+bool ProfileAtAddress::operator<= (const ProfileAtAddress& x) const { return tie() <= x.tie(); }
+bool ProfileAtAddress::operator> (const ProfileAtAddress& x) const { return tie() > x.tie(); }
+bool ProfileAtAddress::operator>= (const ProfileAtAddress& x) const { return tie() >= x.tie(); }
+
+} // namespace juce::midi_ci
diff --git a/modules/juce_midi_ci/ci/juce_CIProfileAtAddress.h b/modules/juce_midi_ci/ci/juce_CIProfileAtAddress.h
index dca21d5974..d5cc8ed748 100644
--- a/modules/juce_midi_ci/ci/juce_CIProfileAtAddress.h
+++ b/modules/juce_midi_ci/ci/juce_CIProfileAtAddress.h
@@ -42,19 +42,19 @@ namespace juce::midi_ci
*/
class ProfileAtAddress
{
- auto tie() const { return std::tie (profile, address); }
+ auto tie() const;
public:
Profile profile; ///< The id of a MIDI-CI profile
ChannelAddress address; ///< A group and channel
- bool operator== (const ProfileAtAddress& x) const { return tie() == x.tie(); }
- bool operator!= (const ProfileAtAddress& x) const { return tie() != x.tie(); }
+ bool operator== (const ProfileAtAddress& x) const;
+ bool operator!= (const ProfileAtAddress& x) const;
- bool operator< (const ProfileAtAddress& x) const { return tie() < x.tie(); }
- bool operator<= (const ProfileAtAddress& x) const { return tie() <= x.tie(); }
- bool operator> (const ProfileAtAddress& x) const { return tie() > x.tie(); }
- bool operator>= (const ProfileAtAddress& x) const { return tie() >= x.tie(); }
+ bool operator< (const ProfileAtAddress& x) const;
+ bool operator<= (const ProfileAtAddress& x) const;
+ bool operator> (const ProfileAtAddress& x) const;
+ bool operator>= (const ProfileAtAddress& x) const;
};
} // namespace juce::midi_ci
diff --git a/modules/juce_midi_ci/ci/juce_CIPropertyHost.cpp b/modules/juce_midi_ci/ci/juce_CIPropertyHost.cpp
index b6fa152fa2..9c9784f2ea 100644
--- a/modules/juce_midi_ci/ci/juce_CIPropertyHost.cpp
+++ b/modules/juce_midi_ci/ci/juce_CIPropertyHost.cpp
@@ -420,4 +420,26 @@ PropertyHost::SubscriptionToken PropertyHost::findUnusedSubscribeId (const std::
return ! used.empty() ? SubscriptionToken { std::prev (used.end())->first.uid + 1 } : SubscriptionToken { 0 };
}
+auto RequestKey::tie() const
+{
+ return std::tuple (m, v);
+}
+
+bool RequestKey::operator== (const RequestKey& other) const
+{
+ return tie() == other.tie();
+}
+
+/** Inequality operator. */
+bool RequestKey::operator!= (const RequestKey& other) const
+{
+ return tie() != other.tie();
+}
+
+/** Less-than operator. */
+bool RequestKey::operator< (const RequestKey& other) const
+{
+ return tie() < other.tie();
+}
+
} // namespace juce::midi_ci
diff --git a/modules/juce_midi_ci/ci/juce_CIPropertyHost.h b/modules/juce_midi_ci/ci/juce_CIPropertyHost.h
index 6ce98b268f..438e73e67f 100644
--- a/modules/juce_midi_ci/ci/juce_CIPropertyHost.h
+++ b/modules/juce_midi_ci/ci/juce_CIPropertyHost.h
@@ -42,7 +42,7 @@ namespace juce::midi_ci
*/
class RequestKey
{
- auto tie() const { return std::tuple (m, v); }
+ auto tie() const;
public:
/** Constructor. */
@@ -55,13 +55,13 @@ public:
Token64 getKey() const { return v; }
/** Equality operator. */
- bool operator== (const RequestKey& other) const { return tie() == other.tie(); }
+ bool operator== (const RequestKey& other) const;
/** Inequality operator. */
- bool operator!= (const RequestKey& other) const { return tie() != other.tie(); }
+ bool operator!= (const RequestKey& other) const;
/** Less-than operator. */
- bool operator< (const RequestKey& other) const { return tie() < other.tie(); }
+ bool operator< (const RequestKey& other) const;
private:
MUID m;
diff --git a/modules/juce_midi_ci/ci/juce_CISubscription.cpp b/modules/juce_midi_ci/ci/juce_CISubscription.cpp
new file mode 100644
index 0000000000..635f76716d
--- /dev/null
+++ b/modules/juce_midi_ci/ci/juce_CISubscription.cpp
@@ -0,0 +1,44 @@
+/*
+ ==============================================================================
+
+ 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::midi_ci
+{
+
+bool Subscription::operator== (const Subscription& other) const
+{
+ const auto tie = [] (const auto& x) { return std::tie (x.subscribeId, x.resource); };
+ return tie (*this) == tie (other);
+}
+
+} // namespace juce::midi_ci
diff --git a/modules/juce_midi_ci/ci/juce_CISubscription.h b/modules/juce_midi_ci/ci/juce_CISubscription.h
index f27d59dc78..91de40e182 100644
--- a/modules/juce_midi_ci/ci/juce_CISubscription.h
+++ b/modules/juce_midi_ci/ci/juce_CISubscription.h
@@ -51,12 +51,7 @@ struct Subscription
bool operator> (const Subscription& other) const { return subscribeId > other.subscribeId; }
bool operator>= (const Subscription& other) const { return subscribeId >= other.subscribeId; }
- bool operator== (const Subscription& other) const
- {
- const auto tie = [] (const auto& x) { return std::tie (x.subscribeId, x.resource); };
- return tie (*this) == tie (other);
- }
-
+ bool operator== (const Subscription& other) const;
bool operator!= (const Subscription& other) const { return ! operator== (other); }
};
diff --git a/modules/juce_midi_ci/ci/juce_CISubscriptionManager.cpp b/modules/juce_midi_ci/ci/juce_CISubscriptionManager.cpp
index fdfca68614..72e1600d76 100644
--- a/modules/juce_midi_ci/ci/juce_CISubscriptionManager.cpp
+++ b/modules/juce_midi_ci/ci/juce_CISubscriptionManager.cpp
@@ -502,6 +502,26 @@ bool SubscriptionManager::sendPendingMessages()
return pimpl->sendPendingMessages();
}
+auto SubscriptionKey::tie() const
+{
+ return std::tie (m, v);
+}
+
+bool SubscriptionKey::operator== (const SubscriptionKey& other) const
+{
+ return tie() == other.tie();
+}
+
+bool SubscriptionKey::operator!= (const SubscriptionKey& other) const
+{
+ return tie() != other.tie();
+}
+
+bool SubscriptionKey::operator< (const SubscriptionKey& other) const
+{
+ return tie() < other.tie();
+}
+
//==============================================================================
//==============================================================================
#if JUCE_UNIT_TESTS
diff --git a/modules/juce_midi_ci/ci/juce_CISubscriptionManager.h b/modules/juce_midi_ci/ci/juce_CISubscriptionManager.h
index 77e1b433b0..3c8c3f354f 100644
--- a/modules/juce_midi_ci/ci/juce_CISubscriptionManager.h
+++ b/modules/juce_midi_ci/ci/juce_CISubscriptionManager.h
@@ -42,7 +42,7 @@ namespace juce::midi_ci
*/
class SubscriptionKey
{
- auto tie() const { return std::tuple (m, v); }
+ auto tie() const;
public:
/** Constructor */
@@ -58,13 +58,13 @@ public:
Token64 getKey() const { return v; }
/** Equality operator. */
- bool operator== (const SubscriptionKey& other) const { return tie() == other.tie(); }
+ bool operator== (const SubscriptionKey& other) const;
/** Inequality operator. */
- bool operator!= (const SubscriptionKey& other) const { return tie() != other.tie(); }
+ bool operator!= (const SubscriptionKey& other) const;
/** Less-than operator. */
- bool operator< (const SubscriptionKey& other) const { return tie() < other.tie(); }
+ bool operator< (const SubscriptionKey& other) const;
private:
MUID m = MUID::getBroadcast();
diff --git a/modules/juce_midi_ci/detail/juce_CIPropertyDataMessageChunker.cpp b/modules/juce_midi_ci/detail/juce_CIPropertyDataMessageChunker.cpp
index f120edf6eb..5fa31ce9c3 100644
--- a/modules/juce_midi_ci/detail/juce_CIPropertyDataMessageChunker.cpp
+++ b/modules/juce_midi_ci/detail/juce_CIPropertyDataMessageChunker.cpp
@@ -159,4 +159,19 @@ void PropertyDataMessageChunker::populateStorage() const
storage->resize (storage->size() + numBytesRead - room);
}
+auto PropertyDataMessageChunker::tie() const
+{
+ return std::tie (storage, body, source, dest, chunkSize, messageKind, requestId);
+}
+
+bool PropertyDataMessageChunker::operator== (const PropertyDataMessageChunker& other) const noexcept
+{
+ return tie() == other.tie();
+}
+
+bool PropertyDataMessageChunker::operator!= (const PropertyDataMessageChunker& other) const noexcept
+{
+ return tie() != other.tie();
+}
+
} // namespace juce::midi_ci::detail
diff --git a/modules/juce_midi_ci/detail/juce_CIPropertyDataMessageChunker.h b/modules/juce_midi_ci/detail/juce_CIPropertyDataMessageChunker.h
index 692757585c..fcc0aad2c1 100644
--- a/modules/juce_midi_ci/detail/juce_CIPropertyDataMessageChunker.h
+++ b/modules/juce_midi_ci/detail/juce_CIPropertyDataMessageChunker.h
@@ -43,7 +43,7 @@ namespace juce::midi_ci::detail
*/
class PropertyDataMessageChunker
{
- auto tie() const { return std::tie (storage, body, source, dest, chunkSize, messageKind, requestId); }
+ auto tie() const;
public:
/* Constructs a chunker instance.
@@ -79,8 +79,8 @@ public:
PropertyDataMessageChunker& operator++() noexcept;
/* Checks whether the state of this chunker matches the state of another chunker, enabling foreach usage. */
- bool operator== (const PropertyDataMessageChunker& other) const noexcept { return tie() == other.tie(); }
- bool operator!= (const PropertyDataMessageChunker& other) const noexcept { return tie() != other.tie(); }
+ bool operator== (const PropertyDataMessageChunker& other) const noexcept;
+ bool operator!= (const PropertyDataMessageChunker& other) const noexcept;
/* Returns a span over the valid bytes in the output buffer. */
Span operator*() const noexcept;
diff --git a/modules/juce_midi_ci/juce_midi_ci.cpp b/modules/juce_midi_ci/juce_midi_ci.cpp
index c735fd362e..7dc4ba4491 100644
--- a/modules/juce_midi_ci/juce_midi_ci.cpp
+++ b/modules/juce_midi_ci/juce_midi_ci.cpp
@@ -53,13 +53,17 @@
#include
#include
+#include
#include
#include
+#include
#include
+#include
#include
#include
#include
#include
#include
#include
+#include
#include