Skip to content

CoreMIDI watchOS xcode16.0 b1

Rolf Bjarne Kvinge edited this page Jun 27, 2024 · 2 revisions

#CoreMIDI.framework

Rolf

diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h	2024-04-13 13:31:06
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h	2024-05-30 05:07:40
@@ -22,12 +22,23 @@
 #include <CoreMIDI/MIDIMessages.h>
 #include <CoreMIDI/MIDIBluetoothConnection.h>
 
+#include <CoreMIDI/MIDIUMPCI.h>
+
 #if __OBJC__
 #import <CoreMIDI/MIDINetworkSession.h>
 #endif
 
 #if __OBJC2__
+#import <CoreMIDI/MIDIUMPEndpoint.h>
+#import <CoreMIDI/MIDIUMPEndpointManager.h>
+#import <CoreMIDI/MIDIUMPFunctionBlock.h>
+#import <CoreMIDI/MIDIUMPMutableEndpoint.h>
+#import <CoreMIDI/MIDIUMPMutableFunctionBlock.h>
+
+#import <CoreMIDI/MIDICIDevice.h>
+#import <CoreMIDI/MIDICIDeviceManager.h>
 #import <CoreMIDI/MIDICapabilityInquiry.h>
+#import <CoreMIDI/MIDIUMPCIProfile.h>
 #endif
 
 #endif
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDevice.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDevice.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDevice.h	1970-01-01 01:00:00
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDevice.h	2024-05-30 10:34:48
@@ -0,0 +1,124 @@
+/*
+ File:		CoreMIDI/MIDICIDevice.h
+
+ Contains:	API for discovered MIDI Capability Inquiry (MIDI-CI) devices.
+
+ Copyright:	(c) 2024 by Apple Inc., all rights reserved.
+
+ Bugs?:		For bug reports, consult the following page on
+ the World Wide Web:
+
+ http://feedbackassistant.apple.com/
+ */
+
+#if !defined(MIDICIDevice_h)
+#define MIDICIDevice_h
+
+/*!
+	@header MIDICIDevice.h
+
+	This is the header file for MIDI-CI device support.
+
+	API Overview
+	------------
+	The MIDI server automatically discovers Universal MIDI Packet (UMP) Endpoints (MIDIUMPEndpoint)
+	and Function Blocks (MIDIUMPFunctionBlock), and it performs MIDI-CI Discovery. When a client process
+	retrieves the process instance of the MIDI-CI device manager (MIDICIDeviceManager), the manager
+	makes a copy of the system-wide MIDI-CI device cache. Each Responder to a MIDI-CI Discovery request
+	is enumerated as a MIDICIDevice object. UMP-native MIDI-CI Devices are typically Function Blocks on
+	a UMP Endpoint.
+
+	MIDICIDevice is a UMP-native MIDI 2.0 API, and CI device objects are always associated with enabled,
+	bidirectional Function Blocks. If a discovered UMP Endpoint does not explictly declare any Function
+	Blocks, it will be assigned an implicit bidirectional Function Block spanning all 16 UMP Groups. In this
+	API, MIDICIDevice always extends the Capabilities of a Function Block, explicit or implicit.
+
+	Legacy MIDI 1.0 CI devices are also discovered by the MIDI server. Since the server automatically
+	converts UMP to legacy MIDI 1.0 protocol prior to delivery whenever necessary, the MIDI 1.0 source and
+	destination pair is treated as a UMP Endpoint with a bidirectional Function Block spanning only Group 0.
+	The actual type of MIDI-CI device, if known, is indicated in the object's MIDICIDeviceType.
+
+	Implementation overview
+	-----------------------
+	To view the MIDI-CI devices discovered by the MIDI server, retrieve the local process instance of the
+	MIDI-CI device manager (MIDICIDeviceManager) and retrieve a copy of the discovered device Array.
+	Any discovered Capabilities that are cached by the server can be viewed by investigating the CI device
+	properties and by using the associated API.
+
+	Please visit http://www.midi.org/specifications for more information on MIDI 2.0, Universal
+	MIDI Packet and MIDI Capability Inquiry..
+*/
+
+#import <CoreMIDI/MIDIUMPCI.h>
+#import <CoreMIDI/MIDIUMPEndpoint.h>
+#import <CoreMIDI/MIDIUMPFunctionBlock.h>
+
+// This API requires the modern Objective-C runtime.
+#if defined(__OBJC2__)
+#import <Foundation/Foundation.h>
+#import <stdint.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class MIDIUMPCIProfile;
+
+#pragma mark MIDICIDevice
+
+/*!
+	@class		MIDICIDevice
+	@brief  	An object representing a MIDI-CI Device.
+
+	@discussion	The client instance MIDICIDeviceManager maintains a list of discovered CI devices.
+				MIDICIDevice objects are not constructible via API.
+*/
+MIDIUMP1_1
+@interface MIDICIDevice : NSObject
+
+/// @property   deviceInfo
+/// @brief      The basic information describing the CI device.
+@property (nonatomic, readonly) MIDI2DeviceInfo* deviceInfo;
+
+///	@property	MUID
+///	@brief		The MIDI unique identifier (MUID) assigned to the CI device.
+@property (nonatomic, readonly) MIDICIMUID MUID;
+
+///	@property	supportsProtocolNegotiation
+///	@brief		MIDI-CI Protocol Negotiation capability.
+@property (nonatomic, readonly) BOOL supportsProtocolNegotiation;
+
+///	@property	supportsProfileConfiguration
+///	@brief		MIDI-CI Profile Configuration capability.
+@property (nonatomic, readonly) BOOL supportsProfileConfiguration;
+
+///	@property	supportsPropertyExchange
+///	@brief		MIDI-CI Property Exchange capability.
+@property (nonatomic, readonly) BOOL supportsPropertyExchange;
+
+///	@property	supportsProcessInquiry
+///	@brief		MIDI-CI Process Inquiry capability.
+@property (nonatomic, readonly) BOOL supportsProcessInquiry;
+
+///	@property 	maxSysExSize
+///	@brief		The maximum receivable MIDI System Exclusive size for this CI device.
+@property (nonatomic, readonly) NSUInteger maxSysExSize;
+
+///	@property 	maxPropertyExchangeRequests
+///	@brief		The maximum number of simultaneous Property Exchange requests, if supported.
+@property (nonatomic, readonly) NSUInteger maxPropertyExchangeRequests;
+
+///	@property 	deviceType
+///	@brief		The type of MIDI-CI device.
+@property (nonatomic, readonly) MIDICIDeviceType deviceType;
+
+///	@property	profiles
+///	@brief		The MIDI-CI Profiles that are registered to the  Function Block.
+@property (nonatomic, readonly) NSArray<MIDIUMPCIProfile*>* profiles;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
+#endif
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDeviceManager.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDeviceManager.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDeviceManager.h	1970-01-01 01:00:00
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDeviceManager.h	2024-05-30 02:32:41
@@ -0,0 +1,141 @@
+/*
+ File:		CoreMIDI/MIDICIDeviceManager.h
+
+ Contains:	API for MIDI Capability Inquiry (MIDI-CI) Device Manager
+
+ Copyright:	(c) 2024 by Apple Inc., all rights reserved.
+
+ Bugs?:		For bug reports, consult the following page on the World Wide Web:
+
+ http://feedbackassistant.apple.com/
+ */
+
+#if !defined(MIDICIDeviceManager_h)
+#define MIDICIDeviceManager_h
+
+/*!
+	@header MIDICIDeviceManager.h
+
+	This is the header file for MIDI-CI Device manager system services.
+
+	API Overview
+	------------
+	The singleton object MIDICIDeviceManager maintains a local copy of the system-wide MIDI-CI device
+	cache. Various notifications can be observed from the shared MIDICIDeviceManager object which are
+	posted when changes to the cache are made by the MIDI server. (Note that in environments where virtual
+	MIDI endpoint creation is not allowed (for example, on iOS, if your app doesn't list 'audio' in UIBackgroundModes), 	notifications will only be posted when the client process is not suspended.)
+
+	Implementation overview
+	-----------------------
+	To investigate the local copy of the MIDI-CI Device cache, retrieve the local instance of the UMPCI manager
+	object and examine the manager's properties.
+
+	This API is not realtime-safe. The local cache is updated on the client process main thread and all interaction with
+	the manager should be done on the main thread.
+
+	Please visit http://www.midi.org/specifications for more information on MIDI 2.0 and UMP.
+*/
+
+#import <CoreMIDI/MIDIUMPCI.h>
+#import <CoreMIDI/MIDIUMPCIProfile.h>
+
+// This API requires the modern Objective-C runtime.
+#if defined(__OBJC2__)
+#import <Foundation/Foundation.h>
+#import <stdint.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class MIDICIDevice;
+
+#pragma mark MIDICIDeviceManager Notifications
+
+/*!
+	@constant		MIDICIDeviceWasAddedNotification
+	@brief			A notification posted when a MIDI-CI Device has been added to the subsystem.
+
+	@discussion		The userInfo dictionary will contain a MIDICIDeviceObjectKey with the
+					MIDI-CI Device which has been added to the subsystem.
+*/
+OS_EXPORT NSNotificationName const MIDICIDeviceWasAddedNotification MIDIUMP1_1;
+
+/*!
+	@constant		MIDICIDeviceWasRemovedNotification
+	@brief			A notification posted when a MIDI-CI Device has been removed or has had its MUID invalidated.
+
+	@discussion		Any previously discovered MIDICIDevice that fails to respond to a discovery message
+					will be removed. The userInfo dictionary will contain a MIDICIDeviceObjectKey with the
+					MIDI-CI Device which has been removed or has had its MUID invalidated.
+*/
+OS_EXPORT NSNotificationName const MIDICIDeviceWasRemovedNotification MIDIUMP1_1;
+
+/*!
+	@constant		MIDICIProfileStateChangedNotification
+	@brief			A notification posted when a MIDI-CI Device has been enabled/disabled.
+
+	@discussion		The userInfo dictionary will contain a MIDICIDeviceObjectKey and
+					MIDICIProfileObjectKey with the MIDICIDevice and MIDI-CI Profile which
+					was recently enabled or disabled.
+*/
+OS_EXPORT NSNotificationName const MIDICIProfileStateChangedNotification MIDIUMP1_1;
+
+/*!
+	@constant		MIDICIProfileWasRemovedNotification
+	@brief			A notification posted when a MIDI-CI Device has been removed.
+
+	@discussion 	The userInfo dictionary will contain a MIDICIDeviceObjectKey and
+					MIDICIProfileObjectKey with the MIDICIDevice and MIDI-CI Profile which
+					has been removed.
+*/
+OS_EXPORT NSNotificationName const MIDICIProfileWasRemovedNotification MIDIUMP1_1;
+
+#pragma mark Keys for NSNotification userInfo dictionaries
+
+/*!
+	@constant		MIDICIDeviceObjectKey
+	@brief			Value is an MIDIUMPEndpoint.
+*/
+OS_EXPORT NSString* const MIDICIDeviceObjectKey MIDIUMP1_1;
+
+/*!
+	@constant		MIDICIProfileObjectKey
+	@brief			Value is an MIDIUMPCIProfile
+*/
+OS_EXPORT NSString* const MIDICIProfileObjectKey MIDIUMP1_1;
+
+#pragma mark MIDICIDeviceManager
+
+/*!
+	@class		MIDICIDeviceManager
+	@brief		A singleton object that performs system-wide MIDI-CI Device bookkeeping.
+
+	@discussion	MIDICIDeviceManager is used to retrieve information about MIDI-CI devices that
+				to MIDI-CI Discovery.
+*/
+MIDIUMP1_1
+@interface MIDICIDeviceManager : NSObject
+
+/*!
+	@property   sharedInstance
+	@brief		Retrieve the shared MIDI-CI device manager for the client process.
+
+	@discussion	After the first access of the property, the client process may observe notifications which are
+				posted when the system-wide cache changes. In environments where virtual MIDI endpoint
+				creation is not allowed, callbacks are only invoked when the process is not suspended.
+				However, any suspended process will receive an updated copy of the cache when it
+				resumes its running state.
+ */
+@property (class, nonatomic, readonly) MIDICIDeviceManager* sharedInstance;
+
+/*!
+	@property	discoveredCIDevices
+	@brief		A list of MIDICIDevices that responded to the last MIDI-CI discovery request.
+ */
+@property (nonatomic, readonly, copy) NSArray<MIDICIDevice*>* discoveredCIDevices;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
+#endif
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICapabilityInquiry.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICapabilityInquiry.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICapabilityInquiry.h	2024-04-13 20:16:20
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICapabilityInquiry.h	2024-05-30 03:38:46
@@ -1,167 +1,127 @@
 /*
  File:       CoreMIDI/MIDICapabilityInquiry.h
- 
- Contains:   API for MIDI Capability Inquiry (MIDI-CI)
- 
- Copyright:  (c) 2018-2020 by Apple Inc., all rights reserved.
- 
+
+ Contains:   Deprecated beta API for MIDI Capability Inquiry (MIDI-CI)
+
+ Copyright:  (c) 2024 by Apple Inc., all rights reserved.
+
  Bugs?:      For bug reports, consult the following page on
  the World Wide Web:
- 
+
  http://feedbackassistant.apple.com/
- */
+*/
 
-// This API requires the modern Objective-C runtime.
 #if !defined(MIDICapabilityInquiry_h)
 #define MIDICapabilityInquiry_h
 
-/*!
-    @header MIDICapabilityInquiry.h
+/*
+	@header MIDICapabilityInquiry.h
 
-    This is the header file for MIDI Capability Inquiry (MIDI-CI) system services.
+	This is the header file for deprecated MIDI Capability Inquiry (MIDI-CI) system services.
 
-	API Overview
-	------------
-	
-    MIDI-CI is the portion of MIDI 2.0 that allows for the selection of data protocol and the
-    advertisement and manipulation of profiles and properties. These three capabilities are
-    sometimes referred to as the three P's. MIDI 2.0 (and specifically MIDI-CI) are bidirectional
-    protocols, unlike MIDI 1.0 which could be unidirectional or bidirectional.
-
-    The two sides of MIDI-CI communication are the Initiator and Responder. Most MIDI-CI messages
-    can only be sent from the Initiator or from the Responder, but a small number of messages could
-    originate from the Initiator or the Responder.
-
-    MIDI client processes playing the Initiator roles of a MIDI-CI connection use the MIDICISession
-    API, which allows for profile and property manipulation on the associated responder. MIDI client
-    processes that wish to advertise their own profile and property capabilities use the MIDICIResponder
-    API, which is capable of sending Responder-originated MIDI-CI messages to Initiators.
-
-	Implementation overview
-	-----------------------
-	
-    With MIDI-CI beta enabled, Universal MIDI System Exclusive (SysEx) messages are filtered from the
-    I/O stream and sent to the MIDI-CI subsystem for routing and handling. Other SysEx messages are
-    untouched. In the release API, filtering will be on by default, and Universal MIDI SysEx messages
-    with associated CoreMIDI API will only be received and routed by the MIDI-CI subsystem.
- 
-    Discovering MIDI-CI capable nodes managed by CoreMIDI is accomplished with MIDICIDiscoveryManager,
-    which sends a MIDI-CI discovery message to all MIDI destinations in the system and aggregates the
-    respondents as MIDICIDiscoveredNode objects.
-        
-    After MIDI-CI discovery has been performed, a MIDI client process may act as Initiator by creating
-    a MIDICISession using a MIDICIDiscoveredNode. The MIDICISession is synchronously returned prior to
-    capability inquiry, and the supplied handler is invoked once the results are received or after
-    timeout. Any available profiles may then be examined/toggled for each channel and the whole port
-    (represented  by MIDI channel 0x7F).
-    
-    No API for protocol negotiation is currently supplied. CoreMIDI is MIDI 2.0-capable system-wide
-    and will not only select the appropriate protocol for connected hardware but will also automatically
-    convert between MIDI 1.0 and MIDI 2.0 protocol as needed. See MIDIServices.h for API guidelines and
-    usage for MIDI 2.0 protocol and Universal MIDI Packets (UMP).
-    
-    Additionally, no explicit property exchange API is provided. However, property exchange can be
-    accomplished by performing first performing MIDI-CI discovery and then sending the appropriate
-    Universal MIDI SysEx messages to the supplied destination and monitoring the MIDICISession's
-    supplied source. Responses to Has Property, Get Property, Set Property, and Subscribe to
-    Property messages are not filtered by the MIDI-CI subsystem and can be received by any MIDI client.
-    However, Property Exchange capabilities must still be discovered using API first since the
-    Inquiry: Property Exchange Capabilities (msg ID 0x30) and Reply to Property Exchange Capabilities
-    (msg ID 0x31) are reserved by CoreMIDI.
-     
-    A MIDI client process may also/instead play the role of responder by creating a MIDICIResponderDelegate
-    and then a MIDICIResponder. Similarly to MIDICISession, a MIDICIResponder may advertise property
-    capabilities, but the details of property exchange rely on the implementation.
- 
-    Please visit http://www.midi.org/specifications for more information on MIDI Capability Inquiry
-    and a list of currently defined capabilities.
+	Please visit http://www.midi.org/specifications for more information on MIDI Capability Inquiry
+	and a list of currently defined capabilities.
 */
 
+#import "MIDIUMPCI.h"
+#import <CoreMIDI/MIDIMessages.h>
 
-#import <CoreMIDI/MIDIServices.h>
-
-/// MIDI Channel, 0~15 (channels 1 through 16, respectively), or MIDIChannelsWholePort.
-/// Per the MIDI-CI specification, this is always a single byte.
-typedef uint8_t MIDIChannelNumber;
-
-/// All MIDI-CI methods involving a channel number use 0x7f to mean "the whole port", i.e. all
-/// channels.
-static const MIDIChannelNumber MIDIChannelsWholePort = 0x7f;
-
-/*!
+/*
  @struct MIDICIDeviceIdentification
  @brief  struct describing a MIDI-CI device.
- */
-struct MIDICIDeviceIdentification {
-    uint8_t manufacturer[3];
-    uint8_t family[2];
-    uint8_t modelNumber[2];
-    uint8_t revisionLevel[4];
-    uint8_t reserved[5];		// always zero
+*/
+struct MIDICIDeviceIdentification
+{
+	uint8_t manufacturer[3];
+	uint8_t family[2];
+	uint8_t modelNumber[2];
+	uint8_t revisionLevel[4];
+	uint8_t reserved[5]; // always zero
 };
 typedef struct MIDICIDeviceIdentification MIDICIDeviceIdentification;
 
+/*!
+	@constant 	MIDIChannelsWholePort
+	@brief		An outdated MIDI-CI constant indicating "the whole port", i.e. all channels.
+ */
+static const MIDIChannelNumber MIDIChannelsWholePort = 0x7f;
+
+
+// This API requires the modern Objective-C runtime.
 #if defined(__OBJC2__)
 #import <Foundation/Foundation.h>
 #import <stdint.h>
 
-#define MIDICI1_0_AVAILABILITY API_AVAILABLE(macos(10.14), ios(12.0)) API_UNAVAILABLE(watchos, tvos)
-#define MIDICI1_1_AVAILABILITY API_AVAILABLE(macos(11.0), ios(14.0)) API_UNAVAILABLE(watchos, tvos)
-
 NS_ASSUME_NONNULL_BEGIN
 
-// Forward declarations.
 @class MIDICISession;
-@class MIDICIProfile;
 @class MIDICIProfileState;
-@class MIDICIResponder;
-@class MIDICIDiscoveredNode;
 
-//! The unique MIDI-CI negotiation identifier (MUID) used for a MIDICIResponder connection.
-//! Per the MIDI-CI specification, this is a randomly assigned 28-bit integer.
-typedef NSNumber * MIDICIInitiatiorMUID;
+// The unique MIDI-CI negotiation identifier (MUID) used for a MIDICIResponder connection.
+// Per the MIDI-CI specification, this is a randomly assigned 28-bit integer.
+typedef NSNumber* MIDICIInitiatiorMUID;
 
-//! An array of MIDICIProfileState objects that describes the profile
-//! configuration for all channels for a reachable MIDI-CI node.
-typedef NSArray<MIDICIProfileState *> MIDICIProfileStateList;
+// An array of MIDICIProfileState objects that describes the profile
+// configuration for all channels for a reachable MIDI-CI node.
+typedef NSArray<MIDICIProfileState*> MIDICIProfileStateList;
 
-// =================================================================================================
+#pragma mark MIDICIDeviceInfo (deprecated)
 
-/*!
- 	@class		MIDICIDeviceInfo
- 	@brief  	An NSObject containing basic information about a MIDI-CI-capable node.
+/*
+	@class		MIDICIDeviceInfo
+	@brief  	An NSObject containing basic information about a MIDI-CI-capable node.
 */
-MIDICI1_1_AVAILABILITY
+MIDICI1_0_DEPRECATED
 @interface MIDICIDeviceInfo : NSObject <NSSecureCoding>
 
-/// The MIDI System Exclusive ID of the device manufacturer, 3 bytes long. One-byte SysEx IDs are
-/// padded with trailing zeroes (e.g., Apple's System Exclusive ID, 0x11, would be expressed as 0x110000).
-@property (nonatomic, readonly) NSData *manufacturerID;		// 3 bytes
+// The MIDI System Exclusive ID of the device manufacturer, 3 bytes long. One-byte SysEx IDs are
+// padded with trailing zeroes (e.g., Apple's System Exclusive ID, 0x11, would be expressed as 0x110000).
+@property (nonatomic, readonly) NSData* manufacturerID; // 3 bytes
 
-/// The group of models to which the device belongs, 2 bytes.
-@property (nonatomic, readonly) NSData *family;				// 2 bytes
+// The group of models to which the device belongs, 2 bytes.
+@property (nonatomic, readonly) NSData* family; // 2 bytes
 
-/// The specific model from the device manufacturer, 2 bytes.
-@property (nonatomic, readonly) NSData *modelNumber;		// 2 bytes
+// The specific model from the device manufacturer, 2 bytes.
+@property (nonatomic, readonly) NSData* modelNumber; // 2 bytes
 
-/// The version number of a device model number, 2 bytes.
-@property (nonatomic, readonly) NSData *revisionLevel;		// 4 bytes
+// The version number of a device model number, 2 bytes.
+@property (nonatomic, readonly) NSData* revisionLevel; // 4 bytes
 
-/// The MIDI destination used by device's MIDI entity for capability inquiries.
+// The MIDI destination used by device's MIDI entity for capability inquiries.
 @property (nonatomic, readonly) MIDIEndpointRef midiDestination;
 
 - (instancetype)init NS_UNAVAILABLE;
-- (instancetype)initWithDestination:(MIDIEntityRef)midiDestination manufacturer:(NSData *)manufacturer family:(NSData *)family model:(NSData *)modelNumber revision:(NSData *)revisionLevel;
+- (instancetype)initWithDestination:(MIDIEntityRef)midiDestination manufacturer:(NSData*)manufacturer family:(NSData*)family model:(NSData*)modelNumber revision:(NSData*)revisionLevel;
 @end
 
+#pragma mark MIDICIDiscoveredNode (deprecated)
+
+/*
+	 @class    MIDICIDiscoveredNode
+	 @brief     An object created during MIDI-CI discovery representing a MIDI destination with an
+				 associated MIDI source that responds to capability inquiries.
+*/
+MIDICI1_1_DEPRECATED
+@interface MIDICIDiscoveredNode : NSObject <NSSecureCoding>
+@property (nonatomic, readonly) MIDIEntityRef destination;
+@property (nonatomic, readonly) MIDICIDeviceInfo* deviceInfo;
+@property (nonatomic, readonly) BOOL supportsProfiles;
+@property (nonatomic, readonly) BOOL supportsProperties;
+@property (nonatomic, readonly) NSNumber* maximumSysExSize;
+
+- (instancetype)init NS_UNAVAILABLE;
+@end
+
+#pragma mark MIDICIProfile
+
 // =================================================================================================
 
 /*!
- 	@class		MIDICIProfile
- 	@abstract  	An NSObject representing Capability Inquiry profile. MIDI-CI profiles describe a mapping
+	@class		MIDICIProfile
+	@abstract  	An NSObject representing Capability Inquiry profile. MIDI-CI profiles describe a mapping
 				of MIDI messages to specific sounds and synthesis behaviors, e.g. General MIDI, a drawbar organ,
 				etc. A MIDI-CI profile may be a standard registered profile or vendor-specific.
- 
+
 								Standard Profile				Vendor-Specific Profile
 				Profile ID Byte 1:	0x7E Standard Profile			Manufacturer SysEx ID 1 Profile
 				Profile ID Byte 2:	Profile Bank				Manufacturer SysEx ID 2 Profile
@@ -173,110 +133,90 @@
 @interface MIDICIProfile : NSObject <NSSecureCoding>
 
 /// An NSString describing the profile.
-@property (nonatomic, readonly) NSString *name;
+@property (nonatomic, readonly) NSString* name;
 
 /// The unique 5-byte profile identifier representing the profile.
-@property (nonatomic, readonly) NSData *profileID;	// always 5 bytes
+@property (nonatomic, readonly) NSData* profileID; // always 5 bytes
 
 - (instancetype)init NS_UNAVAILABLE;
-- (instancetype)initWithData:(NSData *)data MIDICI1_1_AVAILABILITY;
-- (instancetype)initWithData:(NSData *)data name:(NSString *)inName;
+- (instancetype)initWithData:(NSData*)data MIDICI1_1;
+- (instancetype)initWithData:(NSData*)data name:(NSString*)inName;
 @end
 
-// =================================================================================================
+#pragma mark MIDICIProfileState
 
-/*!
- 	@class	MIDICIProfileState
- 	@brief  Lists the enabled and disabled profiles for a MIDI channel or port on a device.
+/*
+	@class	MIDICIProfileState
+	@brief  A list of the enabled and/or disabled profiles for a MIDI channel or port on a device.
 */
 MIDICI1_0_AVAILABILITY
 @interface MIDICIProfileState : NSObject <NSSecureCoding>
 @property (nonatomic, readonly) MIDIChannelNumber midiChannel;
-@property (nonatomic, readonly) NSArray<MIDICIProfile *> *enabledProfiles;
-@property (nonatomic, readonly) NSArray<MIDICIProfile *> *disabledProfiles;
+@property (nonatomic, readonly) NSArray<MIDICIProfile*>* enabledProfiles;
+@property (nonatomic, readonly) NSArray<MIDICIProfile*>* disabledProfiles;
 
 - (instancetype)init NS_UNAVAILABLE;
-- (instancetype)initWithChannel:(MIDIChannelNumber)midiChannelNum enabledProfiles:(NSArray<MIDICIProfile *> *)enabled disabledProfiles:(NSArray<MIDICIProfile *> *)disabled MIDICI1_1_AVAILABILITY;
-- (instancetype)initWithEnabledProfiles:(NSArray<MIDICIProfile *> *)enabled disabledProfiles:(NSArray<MIDICIProfile *> *)disabled API_DEPRECATED_WITH_REPLACEMENT("initWithChannel:enabledProfiles:disabledProfiles", macos(10.14, API_TO_BE_DEPRECATED), ios(12.0, API_TO_BE_DEPRECATED));
+- (instancetype)initWithChannel:(MIDIChannelNumber)midiChannelNum enabledProfiles:(NSArray<MIDICIProfile*>*)enabled disabledProfiles:(NSArray<MIDICIProfile*>*)disabled API_DEPRECATED_WITH_REPLACEMENT("initWithEnabledProfiles:", macos(10.14, 15.0), ios(12.0, 18.0));
+- (instancetype)initWithEnabledProfiles:(NSArray<MIDICIProfile*>*)enabled disabledProfiles:(NSArray<MIDICIProfile*>*)disabled MIDICI1_1;
 @end
 
-// =================================================================================================
-
-/*!
-     @class    MIDICIDiscoveredNode
-     @brief     An object created during MIDI-CI discovery representing a MIDI destination with an
-                 associated MIDI source that responds to capability inquiries.
+/*
+	@fn     MIDICIProfileChangedBlock
+	@brief  A block called when a device notifies that a profile has been enabled or disabled.
 */
-MIDICI1_1_AVAILABILITY
-@interface MIDICIDiscoveredNode : NSObject <NSSecureCoding>
-@property (nonatomic, readonly) MIDIEntityRef 		destination;
-@property (nonatomic, readonly) MIDICIDeviceInfo *	deviceInfo;
-@property (nonatomic, readonly) BOOL 				supportsProfiles;
-@property (nonatomic, readonly) BOOL 				supportsProperties;
-@property (nonatomic, readonly) NSNumber *          maximumSysExSize;
-
--(instancetype)init NS_UNAVAILABLE;
-@end
-
-// =================================================================================================
-
-/*!
- 	@fn     MIDICIProfileChangedBlock
- 	@brief  A block called when a device notifies that a profile has been enabled or disabled.
-*/
 typedef void (^MIDICIProfileChangedBlock)(
-				MIDICISession *session, MIDIChannelNumber channel, MIDICIProfile *profile, BOOL enabled) MIDICI1_1_AVAILABILITY;
+	MIDICISession* session, MIDIChannelNumber channel, MIDICIProfile* profile, BOOL enabled) MIDICI1_1_DEPRECATED;
 
-/*!
-     @fn     MIDICISessionDisconnectBlock
-     @brief  A block called when a MIDICISession has been disconnected. If called, the MIDICISession should be destroyed.
+/*
+	 @fn     MIDICISessionDisconnectBlock
+	 @brief  A block called when a MIDICISession has been disconnected. If called, the MIDICISession should be destroyed.
 */
 typedef void (^MIDICISessionDisconnectBlock)(
-                MIDICISession *session, NSError *error) MIDICI1_1_AVAILABILITY;
+	MIDICISession* session, NSError* error) MIDICI1_1_DEPRECATED;
 
-/*!
-     @fn     MIDICIProfileSpecificDataBlock
-     @brief  A block called when a MIDICISession or MIDICIResponder receives profile-specific data.
+/*
+	 @fn     MIDICIProfileSpecificDataBlock
+	 @brief  A block called when a MIDICISession or MIDICIResponder receives profile-specific data.
 */
 typedef void (^MIDICIProfileSpecificDataBlock)(
-                MIDICISession *session, MIDIChannelNumber channel, MIDICIProfile *profile, NSData *profileSpecificData) MIDICI1_1_AVAILABILITY;
+	MIDICISession* session, MIDIChannelNumber channel, MIDICIProfile* profile, NSData* profileSpecificData) MIDICI1_1_DEPRECATED;
 
-/*!
-     @fn     MIDICIDiscoveryResponseBlock
-     @brief  A block called when a MIDI-CI node discovery is complete.
+/*
+	 @fn     MIDICIDiscoveryResponseBlock
+	 @brief  A block called when a MIDI-CI node discovery is complete.
 */
 typedef void (^MIDICIDiscoveryResponseBlock)(
-                NSArray<MIDICIDiscoveredNode *> *discoveredNodes) MIDICI1_1_AVAILABILITY;
+	NSArray<MIDICIDiscoveredNode*>* discoveredNodes) MIDICI1_1_DEPRECATED;
 
-// =================================================================================================
+#pragma mark MIDICISession (deprecated)
 
-/*!
-     @class  MIDICISession
-     @brief  Object representating a MIDI Capability Inquiry session.
- 
-     A MIDI Capability Inquiry session is a bidirectional communication path between a MIDI process
-     and a MIDI-CI node (i.e., paired MIDI source and destination) identified using MIDI-CI discovery.
-     A MIDICISession can be used to manipulate MIDI-CI profiles and to discover the MIDI-CI property
-     capability.
+/*
+	 @class  MIDICISession
+	 @brief  Object representating a MIDI Capability Inquiry session.
+
+	 A MIDI Capability Inquiry session is a bidirectional communication path between a MIDI process
+	 and a MIDI-CI node (i.e., paired MIDI source and destination) identified using MIDI-CI discovery.
+	 A MIDICISession can be used to manipulate MIDI-CI profiles and to discover the MIDI-CI property
+	 capability.
 */
-MIDICI1_0_AVAILABILITY
+MIDICI1_0_DEPRECATED
 @interface MIDICISession : NSObject
 
-/*!
+/*
 	@brief  Begin a MIDI-CI session with the provided discovered node.
- 
+
 	dataReadyHandler will be called when properties of the session have become available.
 	Other methods of this class will not return valid/useful information before the dataReadyHandler
 	is called.
- 
+
 	disconnectHandler will be called if the active MIDICISession is disconnected by the Responder
-    or if initial MIDI-CI discovery was unsuccessful.
+	or if initial MIDI-CI discovery was unsuccessful.
 */
 - (instancetype)init NS_UNAVAILABLE;
 
-- (instancetype)initWithDiscoveredNode:(MIDICIDiscoveredNode *)discoveredNode dataReadyHandler:(void (^)(void))handler disconnectHandler:(MIDICISessionDisconnectBlock)disconnectHandler;
+- (instancetype)initWithDiscoveredNode:(MIDICIDiscoveredNode*)discoveredNode dataReadyHandler:(void (^)(void))handler disconnectHandler:(MIDICISessionDisconnectBlock)disconnectHandler;
 
-/// The MIDI destination with which the session is communicating.
+// The MIDI destination with which the session is communicating.
 @property (nonatomic, readonly) MIDIEntityRef midiDestination;
 
 // After CI session data is ready, indicates whether the entity supports the MIDI-CI profile capability.
@@ -285,112 +225,110 @@
 // After CI session data is ready, indicates whether the entity supports the MIDI-CI property exchange capability.
 @property (nonatomic, readonly) BOOL supportsPropertyCapability;
 
-/// Obtain the device's basic identification. Nil before data is ready or if the device does not
-/// support MIDI-CI.
-@property (nonatomic, readonly) MIDICIDeviceInfo *deviceInfo;
+// Obtain the device's basic identification. Nil before data is ready or if the device does not
+// support MIDI-CI.
+@property (nonatomic, readonly) MIDICIDeviceInfo* deviceInfo;
 
 // The maximum MIDI system exclusive size reported by the device during discovery
-@property (nonatomic, readonly) NSNumber *maxSysExSize; // unsigned long
+@property (nonatomic, readonly) NSNumber* maxSysExSize; // unsigned long
 
 // The maximum number of simultaneous property exchange requests, if supported
-@property (nonatomic, readonly) NSNumber *maxPropertyRequests; // int
+@property (nonatomic, readonly) NSNumber* maxPropertyRequests; // int
 
-/// Given a MIDI channel number, return the supported profiles. Note that the
-/// arrays will be empty if this property is queried before data is ready.
-- (MIDICIProfileState *)profileStateForChannel:(MIDIChannelNumber)channel;
+// Given a MIDI channel number, return the supported profiles. Note that the
+// arrays will be empty if this property is queried before data is ready.
+- (MIDICIProfileState*)profileStateForChannel:(MIDIChannelNumber)channel;
 
-/// Given a MIDI channel number, asynchronously request that the supplied profile be enabled.
-/// The result of this operation is sent to the MIDICIProfileChangedBlock.
-/// Returns YES if the request is valid.
-- (BOOL)enableProfile:(MIDICIProfile *)profile
+// Given a MIDI channel number, asynchronously request that the supplied profile be enabled.
+// The result of this operation is sent to the MIDICIProfileChangedBlock.
+// Returns YES if the request is valid.
+- (BOOL)enableProfile:(MIDICIProfile*)profile
 			onChannel:(MIDIChannelNumber)channel
-				error:(NSError **)outError;
+				error:(NSError**)outError;
 
-/// Given a MIDI channel number, asynchronously request that the supplied profile be disabled.
-/// The result of this operation is sent to the MIDICIProfileChangedBlock.
-/// Returnes YES if the request is valid.
-- (BOOL)disableProfile:(MIDICIProfile *)profile
+// Given a MIDI channel number, asynchronously request that the supplied profile be disabled.
+// The result of this operation is sent to the MIDICIProfileChangedBlock.
+// Returnes YES if the request is valid.
+- (BOOL)disableProfile:(MIDICIProfile*)profile
 			 onChannel:(MIDIChannelNumber)channel
-				 error:(NSError **)outError;
+				 error:(NSError**)outError;
 
-/// Given a MIDI channel number, send profile specific data to the MIDICISession.
-/// Returns YES if the data was successfully sent.
-- (BOOL)sendProfile:(MIDICIProfile *)profile onChannel:(MIDIChannelNumber)channel profileData:(NSData *)profileSpecificData MIDICI1_1_AVAILABILITY;
+// Given a MIDI channel number, send profile specific data to the MIDICISession.
+// Returns YES if the data was successfully sent.
+- (BOOL)sendProfile:(MIDICIProfile*)profile onChannel:(MIDIChannelNumber)channel profileData:(NSData*)profileSpecificData MIDICI1_1;
 
-/// An optional block called when a device signals that a profile has been enabled or disabled.
+// An optional block called when a device signals that a profile has been enabled or disabled.
 @property (nonatomic, copy, nullable) MIDICIProfileChangedBlock profileChangedCallback;
 
-/// An optional block called when a device sends profile-specific data to the session.
+// An optional block called when a device sends profile-specific data to the session.
 @property (nonatomic, copy, nullable) MIDICIProfileSpecificDataBlock profileSpecificDataHandler;
 
-@end // MIDICISession
+@end
 
-// =================================================================================================
+#pragma mark MIDICIDiscoveryManager (deprecated)
 
-/*!
-     @class  MIDICIDiscoveryManager
-     @brief  Singleton object that performs system-wide MIDI Capability Inquiry discovery
- 
-     MIDICIDiscoveryManager is used to retrieve information about nodes in the MIDI subsystem
-     that are MIDI-CI capable. Only MIDI destinations discovered via this API can be used to
-     create MIDICISessions.
+/*
+	 @class  MIDICIDiscoveryManager
+	 @brief  Singleton object that performs system-wide MIDI Capability Inquiry discovery
+
+	 MIDICIDiscoveryManager is used to retrieve information about nodes in the MIDI subsystem
+	 that are MIDI-CI capable. Only MIDI destinations discovered via this API can be used to
+	 create MIDICISessions.
 */
-MIDICI1_1_AVAILABILITY
+MIDICI1_1_DEPRECATED
 @interface MIDICIDiscoveryManager : NSObject
-+ (MIDICIDiscoveryManager *)sharedInstance;
++ (MIDICIDiscoveryManager*)sharedInstance;
 - (void)discoverWithHandler:(MIDICIDiscoveryResponseBlock)completedHandler;
 @end
 
-// =================================================================================================
-
-/*!
-     @protocol  MIDICIProfileResponderDelegate
-     @brief     Protocol for an NSObject that constructs and issues responses for a MIDICIResponder.
-                A MIDICIProfileResponderDelegate is required to construct a MIDICIResponder.
+/*
+	 @protocol  MIDICIProfileResponderDelegate
+	 @brief     Protocol for an NSObject that constructs and issues responses for a MIDICIResponder.
+				A MIDICIProfileResponderDelegate is required to construct a MIDICIResponder.
 */
-MIDICI1_1_AVAILABILITY
+MIDICI1_1_DEPRECATED
 @protocol MIDICIProfileResponderDelegate <NSObject>
 
 @required
 // Allow a new MIDI-CI Initiator to create a session or reject the connection attempt
-- (BOOL)connectInitiator:(MIDICIInitiatiorMUID)initiatorMUID withDeviceInfo:(MIDICIDeviceInfo *)deviceInfo;
+- (BOOL)connectInitiator:(MIDICIInitiatiorMUID)initiatorMUID withDeviceInfo:(MIDICIDeviceInfo*)deviceInfo;
 // Called when an initiator terminates its MIDI-CI connection
 - (void)initiatorDisconnected:(MIDICIInitiatiorMUID)initiatorMUID;
 
 @optional
 // These methods must be implemented if the associated responder implements MIDI-CI profiles.
-- (BOOL)willSetProfile:(MIDICIProfile *)aProfile onChannel:(MIDIChannelNumber)channel enabled:(BOOL)shouldEnable;
-- (void)handleDataForProfile:(MIDICIProfile *)aProfile onChannel:(MIDIChannelNumber)channel data:(NSData *)inData;
-@end // MIDICIProfileResponderDelegate
+- (BOOL)willSetProfile:(MIDICIProfile*)aProfile onChannel:(MIDIChannelNumber)channel enabled:(BOOL)shouldEnable;
+- (void)handleDataForProfile:(MIDICIProfile*)aProfile onChannel:(MIDIChannelNumber)channel data:(NSData*)inData;
+@end
 
-// =================================================================================================
+#pragma mark MIDICIResponder (deprecated)
 
-/*!
-     @class     MIDICIResponder
-     @brief     Responds to MIDI-CI inquiries from an initiator on behalf of a MIDIClient and handles profile and property change
-                operations for the Responder role.
+/*
+	 @class     MIDICIResponder
+	 @brief     Responds to MIDI-CI inquiries from an initiator on behalf of a MIDIClient and handles profile and property change
+				operations for the Responder role.
 */
-MIDICI1_1_AVAILABILITY
+MIDICI1_1_DEPRECATED
 @interface MIDICIResponder : NSObject
-@property (nonatomic, readonly) NSArray<MIDICIInitiatiorMUID> *initiators;
-@property (nonatomic, readonly, retain) id<MIDICIProfileResponderDelegate>profileDelegate;
-@property (nonatomic, readonly) MIDICIDeviceInfo *deviceInfo;
+@property (nonatomic, readonly) NSArray<MIDICIInitiatiorMUID>* initiators;
+@property (nonatomic, readonly, retain) id<MIDICIProfileResponderDelegate> profileDelegate;
+@property (nonatomic, readonly) MIDICIDeviceInfo* deviceInfo;
 
 - (instancetype)init NS_UNAVAILABLE;
-- (instancetype)initWithDeviceInfo:(MIDICIDeviceInfo *)deviceInfo profileDelegate:(id<MIDICIProfileResponderDelegate>)delegate profileStates:(MIDICIProfileStateList *)profileList supportProperties:(BOOL)propertiesSupported;
+- (instancetype)initWithDeviceInfo:(MIDICIDeviceInfo*)deviceInfo profileDelegate:(id<MIDICIProfileResponderDelegate>)delegate profileStates:(MIDICIProfileStateList*)profileList supportProperties:(BOOL)propertiesSupported;
 
 // Spontaneously enable or disable a profile and notify all connected Initiators
-- (BOOL)notifyProfile:(MIDICIProfile *)aProfile onChannel:(MIDIChannelNumber)channel isEnabled:(BOOL)enabledState;
+- (BOOL)notifyProfile:(MIDICIProfile*)aProfile onChannel:(MIDIChannelNumber)channel isEnabled:(BOOL)enabledState;
 
 // Send profile-specific data for a profile to all connected Initiators
-- (BOOL)sendProfile:(MIDICIProfile *)aProfile onChannel:(MIDIChannelNumber)channel profileData:(NSData *)profileSpecificData;
+- (BOOL)sendProfile:(MIDICIProfile*)aProfile onChannel:(MIDIChannelNumber)channel profileData:(NSData*)profileSpecificData;
 
 // Begin receiving Initiator requests
 - (BOOL)start;
 // Stop receiving Initiator requests and disconnect all connected Initiators
 - (void)stop;
 
-@end // MIDICIResponder
+@end
 
 NS_ASSUME_NONNULL_END
 
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIDriver.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIDriver.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIDriver.h	2024-04-13 13:01:08
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIDriver.h	2024-05-30 04:53:06
@@ -323,7 +323,7 @@
 					
 					New for CoreMIDI 1.1.
 */
-extern const CFStringRef kMIDIDriverPropertyUsesSerial		API_AVAILABLE(macos(10.1)) API_UNAVAILABLE(ios, tvos, watchos);
+extern const CFStringRef kMIDIDriverPropertyUsesSerial		API_AVAILABLE(macos(10.1)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 
 #ifdef __cplusplus
@@ -551,7 +551,7 @@
 	@result			An OSStatus result code.
 */
 extern OSStatus			MIDIDriverEnableMonitoring(MIDIDriverRef __nonnull driver, Boolean enabled)
-															API_AVAILABLE(macos(10.1)) API_UNAVAILABLE(ios, tvos, watchos);
+															API_AVAILABLE(macos(10.1)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 
 #ifdef __cplusplus
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIMessages.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIMessages.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIMessages.h	2024-04-13 14:22:30
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIMessages.h	2024-05-30 04:27:45
@@ -29,25 +29,26 @@
 
 // MIDI Universal Packet message type nibbles.
 typedef CF_ENUM(unsigned int, MIDIMessageType) {
-	kMIDIMessageTypeUtility	        =   0x0,	// 1 word
-	kMIDIMessageTypeSystem          =   0x1,	// 1 word
-	kMIDIMessageTypeChannelVoice1   =   0x2,	// 1 word - MIDI 1.0
-	kMIDIMessageTypeSysEx           =   0x3,	// 2 words (Data, but primarily SysEx)
-	kMIDIMessageTypeChannelVoice2   =   0x4,	// 2 words - MIDI 2.0
-	kMIDIMessageTypeData128         =   0x5,	// 4 words
-	kMIDIMessageTypeUnknownF		=	0xF
-	
-	// Sizes of undefined message types:
-	// 6: 1 word
-	// 7: 1 word
-	// 8: 2 words
-	// 9: 2 words
-	// A: 2 words
-	// B: 3 words
-	// C: 3 words
-	// D: 4 words
-	// E: 4 words
-	// F: 4 words
+	kMIDIMessageTypeUtility = 0x0,       // 1 word
+	kMIDIMessageTypeSystem = 0x1,        // 1 word
+	kMIDIMessageTypeChannelVoice1 = 0x2, // 1 word - MIDI 1.0
+	kMIDIMessageTypeSysEx = 0x3,         // 2 words (Data, but primarily SysEx)
+	kMIDIMessageTypeChannelVoice2 = 0x4, // 2 words - MIDI 2.0
+	kMIDIMessageTypeData128 = 0x5,       // 4 words
+	kMIDIMessageTypeFlexData = 0xD,      // 4 words
+	kMIDIMessageTypeUnknownF = 0xF,      // Replaced by kMIDIMessageTypeStream
+	kMIDIMessageTypeStream = 0xF,        // 4 words
+										 // Sizes of undefined message types:
+										 // 6: 1 word
+										 // 7: 1 word
+										 // 8: 2 words
+										 // 9: 2 words
+										 // A: 2 words
+										 // B: 3 words
+										 // C: 3 words
+										 // E: 4 words
+	kMIDIMessageTypeInvalid = 0xFF,      // Invalid / Unkown Type
+
 };
 
 // kMIDIMessageTypeChannelVoice1 / kMIDIMessageTypeChannelVoice2 status nibbles.
@@ -107,11 +108,29 @@
 
 // kMIDIMessageTypeUtility status nibbles.
 typedef CF_ENUM(unsigned int, MIDIUtilityStatus) {
-	kMIDIUtilityStatusNOOP						= 0x0,
-	kMIDIUtilityStatusJitterReductionClock		= 0x1,
-	kMIDIUtilityStatusJitterReductionTimestamp	= 0x2
+	kMIDIUtilityStatusNOOP = 0x0,
+	kMIDIUtilityStatusJitterReductionClock = 0x1,
+	kMIDIUtilityStatusJitterReductionTimestamp = 0x2,
+	kMIDIUtilityStatusDeltaClockstampTicksPerQuarterNote = 0x3,
+	kMIDIUtilityStatusTicksSinceLastEvent = 0x4
 };
 
+// kUMPStreamMessageStatus status nibbles.
+typedef CF_ENUM(unsigned int, UMPStreamMessageStatus) {
+	kUMPStreamMessageStatusEndpointDiscovery = 0x00,
+	kUMPStreamMessageStatusEndpointInfoNotification = 0x01,
+	kUMPStreamMessageStatusDeviceIdentityNotification = 0x02,
+	kUMPStreamMessageStatusEndpointNameNotification = 0x03,
+	kUMPStreamMessageStatusProductInstanceIDNotification = 0x04,
+	kUMPStreamMessageStatusStreamConfigurationRequest = 0x05,
+	kUMPStreamMessageStatusStreamConfigurationNotification = 0x06,
+	kUMPStreamMessageStatusFunctionBlockDiscovery = 0x10,
+	kUMPStreamMessageStatusFunctionBlockInfoNotification = 0x11,
+	kUMPStreamMessageStatusFunctionBlockNameNotification = 0x12,
+	kUMPStreamMessageStatusStartOfClip = 0x20,
+	kUMPStreamMessageStatusEndOfClip = 0x21
+};
+
 // MIDI 2.0 Note On/Off Message Attribute Types
 typedef CF_ENUM(UInt8, MIDINoteAttribute) {
 	kMIDINoteAttributeNone					= 0x0,	// no attribute data
@@ -127,11 +146,78 @@
 
 // MIDI 2.0 Per Note Management Options
 typedef CF_OPTIONS(UInt8, MIDIPerNoteManagementOptions) {
-    kMIDIPerNoteManagementReset = 0x1,
-    kMIDIPerNoteManagementDetach = 0x2
+	kMIDIPerNoteManagementReset = 0x1,
+	kMIDIPerNoteManagementDetach = 0x2
 };
 
-#if defined(__cplusplus) && __has_feature(cxx_constexpr)
+/// MIDI 1.0 speed information for Function Blocks
+typedef CF_ENUM(SInt32, MIDIUMPFunctionBlockMIDI1Info) {
+	kMIDIUMPFunctionBlockMIDI1InfoNotMIDI1 = 0,
+	kMIDIUMPFunctionBlockMIDI1InfoUnrestrictedBandwidth = 1,
+	kMIDIUMPFunctionBlockMIDI1InfoRestrictedBandwidth = 2
+};
+
+/// UI hint types for Function Blocks
+typedef CF_ENUM(SInt32, MIDIUMPFunctionBlockUIHint) {
+	kMIDIUMPFunctionBlockUIHintUnknown = 0,
+	kMIDIUMPFunctionBlockUIHintReceiver = 1,
+	kMIDIUMPFunctionBlockUIHintSender = 2,
+	kMIDIUMPFunctionBlockUIHintSenderReceiver = 3
+};
+
+/// Function Block direction types
+typedef CF_ENUM(SInt32, MIDIUMPFunctionBlockDirection) {
+	kMIDIUMPFunctionBlockDirectionUnknown = 0,
+	kMIDIUMPFunctionBlockDirectionInput = 1,
+	kMIDIUMPFunctionBlockDirectionOutput = 2,
+	kMIDIUMPFunctionBlockDirectionBidirectional = 3
+};
+
+/// Stream Message Format
+typedef CF_ENUM(UInt8, UMPStreamMessageFormat) {
+	kUMPStreamMessageFormatComplete = 0x00,
+	kUMPStreamMessageFormatStart = 0x01,
+	kUMPStreamMessageFormatContinuing = 0x02,
+	kUMPStreamMessageFormatEnd = 0x03
+};
+
+//==================================================================================================
+#pragma mark -
+#pragma mark MIDI 2 Messages
+/// MIDI unsigned integer types
+typedef UInt8 MIDIUInteger2;   //! 2  bits usable; allowed values 0x0~0x3
+typedef UInt8 MIDIUInteger4;   //! 4  bits usable; allowed values 0x0~0xF
+typedef UInt8 MIDIUInteger7;   //! 7  bits usable; allowed values 0x0~0x7F
+typedef UInt16 MIDIUInteger14; //! 14 bits usable; allowed values 0x0~0x3FFF;
+typedef UInt32 MIDIUInteger28; //! 28 bits usable; allowed values 0x0~0xFFFFFFF;
+
+static const MIDIUInteger2 kMIDIUInteger2Max = 0x3;
+static const MIDIUInteger4 kMIDIUInteger4Max = 0xF;
+static const MIDIUInteger7 kMIDIUInteger7Max = 0x7F;
+static const MIDIUInteger14 kMIDIUInteger14Max = 0x3FFF;
+static const MIDIUInteger28 kMIDIUInteger28Max = 0xFFFFFFF;
+
+/// Type for all UMP Groups
+typedef MIDIUInteger4 MIDIUMPGroupNumber;
+
+/// MIDI Channel, 0~15 (channels 1 through 16, respectively).
+/// Per the MIDI-CI specification, this is always a single nibble, 0x0~0xF.
+typedef MIDIUInteger4 MIDIChannelNumber;
+
+/// Some MIDI-CI messages use a CI device ID, which is either a UMP group or a reserved 7-bit value
+typedef MIDIUInteger7 MIDICIDeviceID;
+
+/// Device ID value used to specify that a message is to/from a UMP group.
+static const MIDICIDeviceID kMIDIDeviceIDUMPGroup = 0x7e;
+
+/// Device ID used for to/from Function Block; also used when Function Blocks are not supported.
+static const MIDICIDeviceID kMIDIDeviceIDFunctionBlock = 0x7f;
+
+/// The unique MIDI-CI negotiation identifier (MUID) used for a MIDICIResponder connection.
+/// Per the MIDI-CI specification, this is a randomly assigned unsigned 28-bit integer.
+typedef MIDIUInteger28 MIDICIMUID;
+
+#if defined(__cplusplus) && __has_feature(cxx_constexpr) && __cplusplus >= 202002L
 #define CM_CONSTEXPR constexpr
 #else
 #define CM_CONSTEXPR
@@ -199,10 +285,25 @@
     return MIDI1UPChannelVoiceMessage(group, kMIDICVStatusNoteOn, channel, noteNumber, velocity);
 }
 
+CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDI1UPPolyPressure(UInt8 group, UInt8 channel, UInt8 noteNumber, UInt8 pressure)
+{
+	return MIDI1UPChannelVoiceMessage(group, kMIDICVStatusPolyPressure, channel, noteNumber, pressure);
+}
+
 CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDI1UPControlChange(UInt8 group, UInt8 channel, UInt8 index, UInt8 data) {
     return MIDI1UPChannelVoiceMessage(group, kMIDICVStatusControlChange, channel, index, data);
 }
 
+CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDI1UPProgramChange(UInt8 group, UInt8 channel, UInt8 program)
+{
+	return MIDI1UPChannelVoiceMessage(group, kMIDICVStatusProgramChange, channel, program, 0);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDI1UPChannelPressure(UInt8 group, UInt8 channel, UInt8 value)
+{
+	return MIDI1UPChannelVoiceMessage(group, kMIDICVStatusChannelPressure, channel, value, 0);
+}
+
 CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDI1UPPitchBend(UInt8 group, UInt8 channel, UInt8 lsb, UInt8 msb) {
     return MIDI1UPChannelVoiceMessage(group, kMIDICVStatusPitchBend, channel, lsb, msb);
 }
@@ -221,7 +322,7 @@
 static const UInt8 kMIDI1UPMaxSysexSize = 6;
 CF_INLINE CM_CONSTEXPR MIDIMessage_64 MIDI1UPSysExArray(UInt8 group, UInt8 status, const Byte *begin, const Byte *end)
 {
-	int numberOfBytes = end <= begin ? 0 : end - begin;
+	long numberOfBytes = end <= begin ? 0 : end - begin;
 	if (numberOfBytes > kMIDI1UPMaxSysexSize) numberOfBytes = kMIDI1UPMaxSysexSize; // prevent overflow
     return MIDI1UPSysEx(group, status, numberOfBytes,
 						numberOfBytes > 0 ? *begin : 0,
@@ -319,6 +420,168 @@
 	return MIDI2ChannelVoiceMessage(group, kMIDICVStatusPerNotePitchBend, channel, (UInt16)(noteNumber) << 8, value);
 }
 
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2StreamMessage(UMPStreamMessageFormat format, UMPStreamMessageStatus status, UInt16 data1, UInt32 data2, UInt32 data3, UInt32 data4)
+{
+	const UInt32 word0 = (UInt32)(kMIDIMessageTypeStream) << 28u | (UInt32)(format & 0x03) << 26u | (UInt32)status << 16u | (UInt32)data1;
+	return (MIDIMessage_128){ word0, data2, data3, data4 };
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2StreamMessageFromData(UMPStreamMessageFormat format, UMPStreamMessageStatus status, const Byte* data, const size_t length)
+{
+	UInt32 words[3] = {};
+	UInt16 data16 = 0;
+
+	if (length > 0) {
+		data16 = (UInt16)(data[0]) << 8u;
+	}
+
+	if (length > 1) {
+		data16 |= (UInt16)(data[1]);
+
+		long remainingBytes = length - 2;
+		if (remainingBytes > 0) {
+			UInt8 byteIndex = 2;
+			for (UInt8 i = 0; i < 3; i++) {
+				words[i] = (byteIndex < length ? (UInt32)(data[byteIndex++]) << 24u : 0u);
+				words[i] |= (byteIndex < length ? (UInt32)(data[byteIndex++]) << 16u : 0u);
+				words[i] |= (byteIndex < length ? (UInt32)(data[byteIndex++]) << 8u : 0u);
+				words[i] |= (byteIndex < length ? (UInt32)(data[byteIndex++]) : 0u);
+			}
+		}
+	}
+	return MIDI2StreamMessage(format, status, data16, words[0], words[1], words[2]);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2EndpointDiscoveryMessage(UInt8 versionMajor, UInt8 versionMinor, bool endpointInfoRequest, bool deviceIdentityRequest, bool endpointNameRequest, bool productInstanceIDRequest, bool streamConfigurationRequest)
+{
+	const UInt16 data1 = (UInt16)versionMajor << 8u | (UInt16)versionMinor;
+	UInt32 data2 = (UInt32)(streamConfigurationRequest ? 1u : 0u) << 4u;
+	data2 |= (UInt32)(productInstanceIDRequest ? 1u : 0u) << 3u;
+	data2 |= (UInt32)(endpointNameRequest ? 1u : 0u) << 2u;
+	data2 |= (UInt32)(deviceIdentityRequest ? 1u : 0u) << 1u;
+	data2 |= (UInt32)(endpointInfoRequest ? 1u : 0u);
+	return MIDI2StreamMessage(kUMPStreamMessageFormatComplete, kUMPStreamMessageStatusEndpointDiscovery, data1, data2, 0, 0);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2EndpointInfoNotificationMessage(UInt8 versionMajor, UInt8 versionMinor, bool staticFunctionBlocks, UInt8 numberOfFunctionBlocks, bool m1, bool m2, bool receiveJRTimestamp, bool transmitJRTimestamp)
+{
+	const UInt16 data1 = (UInt16)versionMajor << 8u | (UInt16)versionMinor;
+	UInt32 data2 = (UInt32)(staticFunctionBlocks ? 1u : 0u) << 31u;
+	data2 |= (UInt32)(numberOfFunctionBlocks & 0x7F) << 24u;
+	data2 |= (UInt32)(m2 ? 1u : 0u) << 9u;
+	data2 |= (UInt32)(m1 ? 1u : 0u) << 8u;
+	data2 |= (UInt32)(receiveJRTimestamp ? 1u : 0u) << 1u;
+	data2 |= (UInt32)(transmitJRTimestamp ? 1u : 0u);
+	return MIDI2StreamMessage(kUMPStreamMessageFormatComplete, kUMPStreamMessageStatusEndpointInfoNotification, data1, data2, 0, 0);
+}
+
+CF_INLINE MIDIMessage_128 MIDI2EndpointDeviceIdentityNotificationMessage(MIDIUInteger7 deviceManufacturer1, MIDIUInteger7 deviceManufacturer2, MIDIUInteger7 deviceManufacturer3, MIDIUInteger14 deviceFamily, MIDIUInteger14 deviceFamilyModel, MIDIUInteger28 revisionLevel)
+{
+	UInt8 buffer[14] = {};
+	buffer[3] = deviceManufacturer1 & 0x7F;
+	buffer[4] = deviceManufacturer2 & 0x7F;
+	buffer[5] = deviceManufacturer3 & 0x7F;
+
+	buffer[6] = (deviceFamily & 0x7f);
+	buffer[7] = ((deviceFamily >> 7) & 0x7F);
+
+	buffer[8] = (deviceFamilyModel & 0x7f);
+	buffer[9] = ((deviceFamilyModel >> 7) & 0x7F);
+
+	buffer[10] = revisionLevel & 0x7F;
+	buffer[11] = (revisionLevel >> 7) & 0x7F;
+	buffer[12] = (revisionLevel >> 14) & 0x7F;
+	buffer[13] = (revisionLevel >> 21) & 0x7F;
+
+	return MIDI2StreamMessageFromData(kUMPStreamMessageFormatComplete, kUMPStreamMessageStatusDeviceIdentityNotification, buffer, 14);
+}
+
+CF_INLINE MIDIMessage_128 MIDI2EndpointNameNotificationMessage(UMPStreamMessageFormat format, const char* data, const size_t length)
+{
+	return MIDI2StreamMessageFromData(format, kUMPStreamMessageStatusEndpointNameNotification, (const Byte*)data, length);
+}
+
+CF_INLINE MIDIMessage_128 MIDI2EndpointProductInstanceIDNotificationMessage(UMPStreamMessageFormat format, const char* data, const size_t length)
+{
+	return MIDI2StreamMessageFromData(format, kUMPStreamMessageStatusProductInstanceIDNotification, (const Byte*)data, length);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2StreamConfigurationRequestMessage(UInt8 protocol, bool receiveJRTimestamp, bool transmitJRTimestamp)
+{
+	const UInt16 data1 = (UInt16)protocol << 8u | (UInt16)(receiveJRTimestamp ? 1u : 0u) << 1u | (UInt16)(transmitJRTimestamp ? 1u : 0u);
+	return MIDI2StreamMessage(kUMPStreamMessageFormatComplete, kUMPStreamMessageStatusStreamConfigurationRequest, data1, 0, 0, 0);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2StreamConfigurationNotificationMessage(UInt8 protocol, bool receiveJRTimestamp, bool transmitJRTimestamp)
+{
+	const UInt16 data1 = (UInt16)protocol << 8u | (UInt16)(receiveJRTimestamp ? 1u : 0u) << 1u | (UInt16)(transmitJRTimestamp ? 1u : 0u);
+	return MIDI2StreamMessage(kUMPStreamMessageFormatComplete, kUMPStreamMessageStatusStreamConfigurationNotification, data1, 0, 0, 0);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2FunctionBlockDiscoveryMessage(UInt8 functionBlockNumber, bool infoRequest, bool nameRequest)
+{
+	const UInt16 data1 = (UInt16)functionBlockNumber << 8u | (UInt16)(nameRequest ? 1u : 0u) << 1u | (UInt16)(infoRequest ? 1u : 0u);
+	return MIDI2StreamMessage(kUMPStreamMessageFormatComplete, kUMPStreamMessageStatusFunctionBlockDiscovery, data1, 0, 0, 0);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2FunctionBlockInfoNotificationMessage(bool active, MIDIUInteger7 blockNumber, MIDIUMPFunctionBlockUIHint UIHint, MIDIUMPFunctionBlockMIDI1Info MIDI1, MIDIUMPFunctionBlockDirection direction, UInt8 firstGroup, UInt8 numberOfGroupsSpanned, UInt8 CIVersion, UInt8 maxSysex8Streams)
+{
+	const UInt16 data1 = (UInt16)(active ? 1u : 0u) << 15u | (UInt16)(blockNumber & 0x7F) << 8u | (UInt16)UIHint << 4u | (UInt16)MIDI1 << 2u | (UInt16)direction;
+	const UInt32 data2 = (UInt32)firstGroup << 24u | (UInt32)numberOfGroupsSpanned << 16u | (UInt32)CIVersion << 8u | (UInt32)maxSysex8Streams;
+	return MIDI2StreamMessage(kUMPStreamMessageFormatComplete, kUMPStreamMessageStatusFunctionBlockInfoNotification, data1, data2, 0, 0);
+}
+
+CF_INLINE MIDIMessage_128 MIDI2FunctionBlockNameNotificationMessage(UMPStreamMessageFormat format, UInt8 blockNumber, const char* data, size_t length)
+{
+	Byte buffer[14] = {};
+	buffer[0] = blockNumber;
+	memcpy(buffer + 1, data, (length > 13) ? 13 : length);
+	return MIDI2StreamMessageFromData(format, kUMPStreamMessageStatusFunctionBlockNameNotification, buffer, 14);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2StartOfClipMessage(void)
+{
+	return MIDI2StreamMessage(kUMPStreamMessageFormatComplete, kUMPStreamMessageStatusStartOfClip, 0, 0, 0, 0);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2EndOfClipMessage(void)
+{
+	return MIDI2StreamMessage(kUMPStreamMessageFormatComplete, kUMPStreamMessageStatusEndOfClip, 0, 0, 0, 0);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDINoOpMessage(void)
+{
+	return 0x0000;
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDIJitterReductionClockMessage(UInt16 senderClockTime)
+{
+	return (UInt32)kMIDIUtilityStatusJitterReductionClock << 20u | (UInt32)senderClockTime;
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDIJitterReductionTimestampMessage(UInt16 senderClockTimestamp)
+{
+	return (UInt32)kMIDIUtilityStatusJitterReductionTimestamp << 20u | (UInt32)senderClockTimestamp;
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDIDeltaClockstampTicksPerQuarterNoteMessage(UInt16 ticksPerQuarterNote)
+{
+	return (UInt32)kMIDIUtilityStatusDeltaClockstampTicksPerQuarterNote << 20u | (UInt32)ticksPerQuarterNote;
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_32 MIDITicksSinceLastEventMessage(UInt32 ticksSinceLastEvent)
+{
+	return (UInt32)kMIDIUtilityStatusTicksSinceLastEvent << 20u | (UInt32)(ticksSinceLastEvent & 0x000FFFFF);
+}
+
+CF_INLINE CM_CONSTEXPR MIDIMessage_128 MIDI2FlexDataMessage(MIDIUInteger4 group, MIDIUInteger2 format, MIDIUInteger2 address, MIDIUInteger4 channel, UInt8 statusBank, UInt8 status, UInt32 data1, UInt32 data2, UInt32 data3)
+{
+	UInt32 word0 = (UInt32)kMIDIMessageTypeFlexData << 28u | (UInt32)(group & 0x0F) << 24u | (UInt32)(format & 0x03) << 22u | (UInt32)(address & 0x03) << 20u | (UInt32)(channel & 0x0F) << 16u;
+	word0 |= (UInt32)statusBank << 8u;
+	word0 |= (UInt32)status;
+	return (MIDIMessage_128){ word0, data1, data2, data3 };
+}
+
 //==================================================================================================
 #pragma mark -
 #pragma mark UMP message helper functions for reading
@@ -472,7 +735,7 @@
 
 		struct {
 			UInt32 words[4];  //!< up to four 32 bit words
-		} unknown;            //!< active when type is kMIDIMessageTypeUnknownF
+		} unknown;            //!< active when type is unkown
 	};
 } MIDIUniversalMessage;
 
@@ -536,7 +799,7 @@
 */
 extern void MIDIEventListForEachEvent(
 	const MIDIEventList* evtlist, MIDIEventVisitor visitor, void* visitorContext)
-									API_AVAILABLE(macos(12.0), ios(15.0), tvos(15.0), watchos(8.0));
+	API_AVAILABLE(macos(12.0), ios(15.0), tvos(15.0), watchos(8.0));
 
 
 #ifdef __cplusplus
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIServices.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIServices.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIServices.h	2024-04-13 14:22:29
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIServices.h	2024-05-30 05:03:14
@@ -74,6 +74,14 @@
 #include <CoreFoundation/CoreFoundation.h>
 #include <stddef.h>
 
+
+#define MIDI_API_UNAVAILABLE_NON_MACOS       \
+	__OS_AVAILABILITY(bridgeos, unavailable) \
+	__OS_AVAILABILITY(ios, unavailable)      \
+	__OS_AVAILABILITY(tvos, unavailable)     \
+	__OS_AVAILABILITY(watchos, unavailable)
+
+
 CF_ASSUME_NONNULL_BEGIN
 
 #ifdef __cplusplus
@@ -687,7 +695,8 @@
 	kMIDIMsgPropertyChanged			= 4,
 	kMIDIMsgThruConnectionsChanged	= 5,
 	kMIDIMsgSerialPortOwnerChanged	= 6,
-	kMIDIMsgIOError					= 7
+	kMIDIMsgIOError					= 7,
+	kMIDIMsgInternalStart API_UNAVAILABLE(macos) = 0x1000,
 };
 
 
@@ -1000,7 +1009,7 @@
 		Added in CoreMIDI 1.1 (Mac OS X 10.1).  DEPRECATED as of CoreMIDI 1.3. Use
 		kMIDIPropertyNameConfiguration instead.
 */
-extern const CFStringRef	kMIDIPropertyFactoryPatchNameFile		API_DEPRECATED_WITH_REPLACEMENT("kMIDIPropertyNameConfiguration", macos(10.1, 10.2)) API_UNAVAILABLE(ios, tvos, watchos);
+extern const CFStringRef	kMIDIPropertyFactoryPatchNameFile		API_DEPRECATED_WITH_REPLACEMENT("kMIDIPropertyNameConfiguration", macos(10.1, 10.2)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 
 /*!
@@ -1013,7 +1022,7 @@
 		Added in CoreMIDI 1.1 (Mac OS X 10.1).  DEPRECATED as of CoreMIDI 1.3. Use
 		kMIDIPropertyNameConfiguration instead.
 */
-extern const CFStringRef	kMIDIPropertyUserPatchNameFile			API_DEPRECATED_WITH_REPLACEMENT("kMIDIPropertyNameConfiguration", macos(10.1, 10.2)) API_UNAVAILABLE(ios, tvos, watchos);
+extern const CFStringRef	kMIDIPropertyUserPatchNameFile			API_DEPRECATED_WITH_REPLACEMENT("kMIDIPropertyNameConfiguration", macos(10.1, 10.2)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 /*!
 	@constant		kMIDIPropertyNameConfiguration
@@ -1354,6 +1363,16 @@
 		messages with no group (e.g., message type 0 and message type F).
 */
 extern const CFStringRef kMIDIPropertyUMPCanTransmitGroupless API_AVAILABLE(macos(14.0), ios(17.0)) API_UNAVAILABLE(tvos, watchos);
+
+/*!
+	constant		kMIDIPropertyAssociatedEndpoint
+	@discussion
+		endpoint property, MIDIEndpointRef. If this property is present, the indicated endpoint should be
+		used for bidirectional communication purposes, (e.g. UMP Endpoint pairing or MIDI-CI devices).
+		When setting this property on an endpoint, it should also be set on the assocated endpoint to
+		create a bidirectional mapping.
+*/
+extern const CFStringRef kMIDIPropertyAssociatedEndpoint API_AVAILABLE(macos(15.0), ios(18.0)) API_UNAVAILABLE(tvos, watchos);
 
 //==================================================================================================
 #pragma mark	Clients
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDISetup.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDISetup.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDISetup.h	2024-04-05 22:13:33
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDISetup.h	2024-05-30 04:53:06
@@ -78,7 +78,7 @@
 	@result			An OSStatus result code.
 */
 extern OSStatus
-MIDISetupCreate(	MIDISetupRef *outSetup )					API_DEPRECATED("No longer supported", macos(10.0, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);
+MIDISetupCreate(	MIDISetupRef *outSetup )					API_DEPRECATED("No longer supported", macos(10.0, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 
 //  -----------------------------------------------------------------------------
@@ -96,7 +96,7 @@
 	@result			An OSStatus result code.
 */
 extern OSStatus
-MIDISetupDispose(	MIDISetupRef setup )						API_DEPRECATED("No longer supported", macos(10.0, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);
+MIDISetupDispose(	MIDISetupRef setup )						API_DEPRECATED("No longer supported", macos(10.0, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 //  -----------------------------------------------------------------------------
 /*!
@@ -120,7 +120,7 @@
 	@result			An OSStatus result code.
 */
 extern OSStatus
-MIDISetupInstall(	MIDISetupRef setup )						API_DEPRECATED("No longer supported", macos(10.0, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);
+MIDISetupInstall(	MIDISetupRef setup )						API_DEPRECATED("No longer supported", macos(10.0, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 
 //  -----------------------------------------------------------------------------
@@ -141,7 +141,7 @@
 	@result			An OSStatus result code.
 */
 extern OSStatus
-MIDISetupGetCurrent(	MIDISetupRef *outSetup )				API_DEPRECATED("No longer supported", macos(10.0, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);
+MIDISetupGetCurrent(	MIDISetupRef *outSetup )				API_DEPRECATED("No longer supported", macos(10.0, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 
 //  -----------------------------------------------------------------------------
@@ -165,7 +165,7 @@
 */
 extern OSStatus
 MIDISetupToData(	MIDISetupRef	setup,
-					CFDataRef __nullable * __nonnull outData )	API_DEPRECATED("No longer supported", macos(10.0, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);
+					CFDataRef __nullable * __nonnull outData )	API_DEPRECATED("No longer supported", macos(10.0, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 //  -----------------------------------------------------------------------------
 /*!
@@ -188,7 +188,7 @@
 */
 extern OSStatus
 MIDISetupFromData(	CFDataRef 		data, 
-					MIDISetupRef *	outSetup)					API_DEPRECATED("No longer supported", macos(10.0, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);
+					MIDISetupRef *	outSetup)					API_DEPRECATED("No longer supported", macos(10.0, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 //  -----------------------------------------------------------------------------
 /*!
@@ -395,7 +395,7 @@
 */
 extern OSStatus
 MIDIGetSerialPortOwner(	CFStringRef			portName, 
-						CFStringRef __nullable * __nonnull outDriverName )	API_DEPRECATED("No longer supported", macos(10.1, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);
+						CFStringRef __nullable * __nonnull outDriverName )	API_DEPRECATED("No longer supported", macos(10.1, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 //  -----------------------------------------------------------------------------
 /*!
@@ -418,7 +418,7 @@
 */
 extern OSStatus
 MIDISetSerialPortOwner(	CFStringRef			portName, 
-						CFStringRef			driverName )	API_DEPRECATED("No longer supported", macos(10.1, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);
+						CFStringRef			driverName )	API_DEPRECATED("No longer supported", macos(10.1, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 //  -----------------------------------------------------------------------------
 /*!
@@ -440,7 +440,7 @@
 	@result			An OSStatus result code.	
 */
 extern OSStatus
-MIDIGetSerialPortDrivers(	CFArrayRef __nullable * __nonnull outDriverNames )	API_DEPRECATED("No longer supported", macos(10.1, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);
+MIDIGetSerialPortDrivers(	CFArrayRef __nullable * __nonnull outDriverNames )	API_DEPRECATED("No longer supported", macos(10.1, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;
 
 //  -----------------------------------------------------------------------------
 /*!
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCI.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCI.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCI.h	1970-01-01 01:00:00
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCI.h	2024-05-30 04:27:45
@@ -0,0 +1,243 @@
+/*
+	File:   	CoreMIDI/MIDIUMPCI.h
+
+	Contains:	Constants, structures, and helper functions for Universal MIDI
+				Packet (UMP) and MIDI Capability Inquiry (MIDI-CI).
+
+	Copyright:  (c) 2024 by Apple Inc., all rights reserved.
+
+	Bugs?:  	For bug reports, consult the following page on
+				the World Wide Web:
+
+					http://feedbackassistant.apple.com/
+
+*/
+
+#ifndef CoreMIDI_MIDIUMPCI_h
+#define CoreMIDI_MIDIUMPCI_h
+
+#include <CoreFoundation/CFBase.h>
+#include <CoreMIDI/MIDIMessages.h>
+#include <CoreMIDI/MIDIServices.h>
+#import <stdint.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define MIDICI1_0 API_AVAILABLE(macos(10.14), ios(12.0)) API_UNAVAILABLE(watchos, tvos)
+#define MIDICI1_1 API_AVAILABLE(macos(11.0), ios(14.0)) API_UNAVAILABLE(watchos, tvos)
+#define MIDICI1_2 API_AVAILABLE(macos(15.0), ios(18.0)) API_UNAVAILABLE(watchos, tvos)
+
+#define MIDICI1_0_AVAILABILITY API_AVAILABLE(macos(10.14), ios(12.0)) API_UNAVAILABLE(watchos, tvos)
+#define MIDICI1_1_AVAILABILITY API_AVAILABLE(macos(11.0), ios(14.0)) API_UNAVAILABLE(watchos, tvos)
+
+
+#define MIDICI1_0_DEPRECATED API_DEPRECATED("No longer supported for CoreMIDI", macos(10.14, 15.0), ios(12.0, 18.0)) API_UNAVAILABLE(watchos, tvos)
+#define MIDICI1_1_DEPRECATED API_DEPRECATED("No longer supported for CoreMIDI", macos(11.0, 15.0), ios(14.0, 18.0)) API_UNAVAILABLE(watchos, tvos)
+
+#define MIDIUMP1_1 API_AVAILABLE(macos(15.0), ios(18.0)) API_UNAVAILABLE(tvos, watchos)
+
+	typedef struct
+	{
+		Byte sysExIDByte[3]; // 1-byte SysEx IDs are padded with trailing zeroes
+	} MIDI2DeviceManufacturer;
+
+	typedef struct
+	{
+		Byte revisionLevel[4];
+	} MIDI2DeviceRevisionLevel;
+
+	/*!
+		@typedef	MIDICICategoryBitmap
+
+		@discussion	MIDI Capability category supported (bitmap: D6 D5 D4 D3 D2 D1 D0)
+					Bit	Category	Sub-ID Range	Description
+					D0			0x00~0x0F	Reserved - No Messages Defined Yet
+					D1			0x10~0x1F	Protocol Negotiation (Deprecated)
+					D2			0x20~0x2F	Profile Configuration Supported
+					D3			0x30~0x3F	Property Exchange Supported
+					D4			0x40~0x4F	Process Inquiry Supported
+					D5			0x50~0x5F	Reserved - No Messages Defined Yet
+					D6			0x60~0x6F	Reserved - No Messages Defined Yet
+
+					e.g., a MIDICIDevice supporting Profile Configuration and Property Exchange has
+					category 0xC.
+	 */
+	typedef CF_OPTIONS(MIDIUInteger7, MIDICICategoryBitmap) {
+		kMIDICICategoryBitmapProtocolNegotiation = (1UL << 1),
+		kMIDICICategoryBitmapProfileConfigurationSupported = (1UL << 2),
+		kMIDICICategoryBitmapPropertyExchangeSupported = (1UL << 3),
+		kMIDICICategoryBitmapProcessInquirySupported = (1UL << 4),
+	};
+
+	/*!
+		@typedef	MIDIUMPFunctionBlockID
+		@brief		The device-unique Function Block ID.
+	 */
+	typedef MIDIUInteger7 MIDIUMPFunctionBlockID;
+
+	typedef CF_ENUM(UInt8, MIDICIDeviceType) {
+		kMIDICIDeviceTypeUnknown = 0,
+		kMIDICIDeviceTypeLegacyMIDI1,
+		kMIDICIDeviceTypeVirtual,
+		kMIDICIDeviceTypeUSBMIDI
+	};
+
+
+//=============================================================================
+#pragma mark MIDI-CI Message Types
+
+	/*!
+		@enum 		MIDICIProfileMessageType
+		@brief		MIDI-CI Profile message sub-ID values.
+	 */
+	typedef CF_ENUM(MIDIUInteger7, MIDICIProfileMessageType) {
+		kMIDICIProfileMessageTypeProfileInquiry = 0x20,
+		kMIDICIProfileMessageTypeReplyToProfileInquiry = 0x21,
+		kMIDICIProfileMessageTypeSetProfileOn = 0x22,
+		kMIDICIProfileMessageTypeSetProfileOff = 0x23,
+		kMIDICIProfileMessageTypeProfileEnabledReport = 0x24,
+		kMIDICIProfileMessageTypeProfileDisabledReport = 0x25,
+		kMIDICIProfileMessageTypeProfileAdded = 0x26,
+		kMIDICIProfileMessageTypeProfileRemoved = 0x27,
+		kMIDICIProfileMessageTypeDetailsInquiry = 0x28,
+		kMIDICIProfileMessageTypeReplyToDetailsInquiry = 0x29,
+		kMIDICIProfileMessageTypeProfileSpecificData = 0x2F
+	};
+
+	/*!
+		@enum		MIDICIPropertyExchangeMessageType
+		@brief		MIDI-CI Property Exchange Message sub-ID values.
+	 */
+	typedef CF_ENUM(MIDIUInteger7, MIDICIPropertyExchangeMessageType) {
+		kMIDICIPropertyExchangeMessageTypeInquiryPropertyExchangeCapabilities = 0x30,
+		kMIDICIPropertyExchangeMessageTypeReplyToPropertyExchangeCapabilities = 0x31,
+		kMIDICIPropertyExchangeMessageTypeInquiryHasPropertyData_Reserved = 0x32,        // Deprecated
+		kMIDICIPropertyExchangeMessageTypeInquiryReplyToHasPropertyData_Reserved = 0x33, // Deprecated
+		kMIDICIPropertyExchangeMessageTypeInquiryGetPropertyData = 0x34,
+		kMIDICIPropertyExchangeMessageTypeReplyToGetProperty = 0x35,
+		kMIDICIPropertyExchangeMessageTypeInquirySetPropertyData = 0x36,
+		kMIDICIPropertyExchangeMessageTypeReplyToSetPropertyData = 0x37,
+		kMIDICIPropertyExchangeMessageTypeSubscription = 0x38,
+		kMIDICIPropertyExchangeMessageTypeReplyToSubscription = 0x39,
+		kMIDICIPropertyExchangeMessageTypeNotify = 0x3F
+	};
+
+	/*!
+		@enum		MIDICIProcessInquiryMessageType
+		@brief		MIDI-CI Process Inquiry sub-ID values.
+	 */
+	typedef CF_ENUM(MIDIUInteger7, MIDICIProcessInquiryMessageType) {
+		kMIDICIProcessInquiryMessageTypeInquiryProcessInquiryCapabilities = 0x40,
+		kMIDICIProcessInquiryMessageTypeReplyToProcessInquiryCapabilities = 0x41,
+		kMIDICIProcessInquiryMessageTypeInquiryMIDIMessageReport = 0x42,
+		kMIDICIProcessInquiryMessageTypeReplyToMIDIMessageReport = 0x43,
+		kMIDICIProcessInquiryMessageTypeEndOfMIDIMessageReport = 0x44
+	};
+
+	/*!
+		@enum		MIDICIManagementMessageType
+		@brief		MIDI-CI Management sub-ID values.
+	 */
+	typedef CF_ENUM(MIDIUInteger7, MIDICIManagementMessageType) {
+		kMIDICIManagementMessageTypeDiscovery = 0x70,
+		kMIDICIManagementMessageTypeReplyToDiscovery = 0x71,
+		kMIDICIManagementMessageTypeInquiryEndpointInformation = 0x72,
+		kMIDICIManagementMessageTypeReplyToEndpointInformation = 0x73,
+		kMIDICIManagementMessageTypeMIDICIACK = 0x7D,
+		kMIDICIManagementMessageTypeInvalidateMUID = 0x7E,
+		kMIDICIManagementMessageTypeMIDICINAK = 0x7F
+	};
+
+
+	/*!
+		@enum		MIDICIProfileType
+		@brief		MIDI-CI Profile variants.
+	 */
+	typedef CF_ENUM(UInt8, MIDICIProfileType) {
+		kMIDICIProfileTypeSingleChannel = 1,
+		kMIDICIProfileTypeGroup = 2,
+		kMIDICIProfileTypeFunctionBlock = 3,
+		kMIDICIProfileTypeMultichannel = 4
+	};
+
+	/*!
+		@enum       MIDIUMPCIObjectBackingType
+		@brief      The underlying transport / backing device type variants.
+	 */
+	typedef CF_ENUM(UInt8, MIDIUMPCIObjectBackingType) {
+		kMIDIUMPCIObjectBackingTypeUnknown = 0,
+		kMIDIUMPCIObjectBackingTypeVirtual,
+		kMIDIUMPCIObjectBackingTypeDriverDevice,
+		kMIDIUMPCIObjectBackingTypeUSBMIDI
+	};
+
+//=============================================================================
+#pragma mark MIDI-CI Profile Constants and Structures
+
+	/*!
+		@struct		MIDICIProfileIDStandard
+		@brief		A C-style struct containing a standard profile ID.
+	 */
+	typedef struct
+	{
+		MIDIUInteger7 profileIDByte1;
+		MIDIUInteger7 profileBank;
+		MIDIUInteger7 profileNumber;
+		MIDIUInteger7 profileVersion;
+		MIDIUInteger7 profileLevel;
+	} MIDICIProfileIDStandard;
+
+	/*!
+		@struct		MIDICIProfileIDManufacturerSpecific
+		@brief		A C-style struct containing a Manufacturer Specific profile ID.
+
+	 */
+	typedef struct
+	{
+		MIDIUInteger7 sysExID1;
+		MIDIUInteger7 sysExID2;
+		MIDIUInteger7 sysExID3;
+		MIDIUInteger7 info1;
+		MIDIUInteger7 info2;
+	} MIDICIProfileIDManufacturerSpecific;
+
+	/*!
+		@struct		MIDICIProfileID
+		@brief		A C-style struct containing the profile ID.
+
+		@discussion	There are two general types of Profiles -- standard defined Profiles and
+					manufacturer-specific Profiles.
+	 */
+	typedef union
+	{
+		MIDICIProfileIDStandard standard;
+		MIDICIProfileIDManufacturerSpecific manufacturerSpecific;
+	} MIDICIProfileID;
+
+//=============================================================================
+#pragma mark MIDI-CI Property Exchange Constants
+
+	/*!
+		@typedef	MIDICIPropertyExchangeRequestID
+		@brief		The request ID associated with a Property Exchange request.
+
+		@discussion	As the respose context of a Property Exchange message is assumed to be known
+					by the initiator, the requestID of each request is included with the response such
+					that it can be correlated with the initial request.
+	 */
+	typedef UInt8 MIDICIPropertyExchangeRequestID CF_TYPED_EXTENSIBLE_ENUM;
+
+	/*!
+		@constant    kMIDICIPropertyExchangeBadRequestID
+		@brief        Returned when MIDI-CI Property Messages were not dispatched due to an error.
+	 */
+	static MIDICIPropertyExchangeRequestID kMIDICIPropertyExchangeBadRequestID = 0xFF;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // CoreMIDI_MIDIUMPCI_h
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCIProfile.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCIProfile.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCIProfile.h	1970-01-01 01:00:00
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCIProfile.h	2024-05-30 03:38:45
@@ -0,0 +1,161 @@
+/*
+ File:		CoreMIDI/MIDIUMPCIProfile.h
+
+ Contains:	API for MIDI Capability Inquiry (MIDI-CI) Profile Configuration.
+
+ Copyright:	(c) 2024 by Apple Inc., all rights reserved.
+
+ Bugs?:		For bug reports, consult the following page on the World Wide Web:
+
+ http://feedbackassistant.apple.com/
+ */
+
+#if !defined(MIDIUMPCIProfile_h)
+#define MIDIUMPCIProfile_h
+
+/*!
+	@header MIDIUMPCIProfile.h
+
+	This is the header file for MIDI-CI Profile Configuration API.
+
+	API Overview
+	------------
+	The MIDI server automatically discovers UMP Endpoints, Function Blocks, and performs MIDI-CI
+	Discovery. When a client process retrieves the process instance of the UMP and MIDI-CI (UMPCI)
+	manager, a copy of the system-wide MIDI 2.0 cache is created using objects that describe the MIDI 2.0
+	subsystem.
+
+	Any discovered MIDI-CI device with the Profile Configuration Capability will have its Profile configuration
+	cached as CI Profile Objects (MIDIUMPCIProfile). The objects can then be manipulated to perform
+	common Profile operations.
+
+	Implementation overview
+	-----------------------
+	To view the MIDI-CI devices discovered by the MIDI server, retrieve the local process instance of the
+	MIDI-CI device manager (MIDICIDeviceManager) and retrieve a copy of the discovered device Array.
+	Any CI devices with the Profile Capability may have its Profiles investigated in the 'ciProfiles' property.
+
+	Profiles are enabled or disabled, and a request to Set Profile On or Set Profile Off either using a mutable
+	CI device or via the MIDI server's MUID may issued via API. The result of a Set Profile On/Off request is
+	received on the local MIDI-CI device manager instance via a notification. In
+	environments where virtual MIDI endpoint creation is not allowed, notification is only posted when the
+	process is not suspended.
+
+	This API is not realtime-safe.
+
+	Please visit http://www.midi.org/specifications for more information on MIDI 2.0, Universal
+	MIDI Packet, and MIDI Capability Inquiry.
+*/
+
+#import <CoreMIDI/MIDIUMPCI.h>
+
+// This API requires the modern Objective-C runtime.
+#if defined(__OBJC2__)
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class MIDICIDevice;
+@class MIDICIMutableDevice;
+
+#pragma mark MIDIUMPCIProfile
+
+@class MIDIUMPCIProfile;
+
+/*!
+	@class		MIDIUMPCIProfile
+	@brief		An object representing Capability Inquiry Profile on a MIDICIDevice.
+
+	@discussion	MIDI-CI profiles describe a mapping of MIDI messages to specific sounds and synthesis
+				behaviors, e.g. General MIDI, a drawbar organ, etc. A MIDI-CI Profile may be a standard
+				registered Profile or vendor-specific.
+
+				A MIDI-CI Profile ID consists of 5 bytes.
+				===============================================================
+								Standard Profile			Vendor-Specific Profile
+				Profile ID Byte 1:	0x7E Standard Profile		Manufacturer SysEx ID 1 Profile
+				Profile ID Byte 2:	Profile Bank			Manufacturer SysEx ID 2 Profile
+				Profile ID Byte 3:	Profile Number			Manufacturer SysEx ID 3 Profile
+				Profile ID Byte 4:	Profile Version			Manufacturer-specific Info
+				Profile ID Byte 5:	Profile Level			Manufacturer-specific Info
+
+				MIDI-CI Profiles have the following generalized types:
+
+				Profile Type		Source		Channels		Channel Range
+				============		==========	===========	========================
+				Single-channel 		0x00~0x0F 	1			1 channel (1 to 16) of a Group
+				Group			0x7E			16			All channels of a Group
+				Function Block		0x7F			16 per Group 	All channels of a Function Block
+				Multi-channel		0x00~0x0F	2 or more		Profile-specific
+
+				MIDIUMPCIProfile objects may only be registered to a single CI device, and any number
+				of MIDIUMPCIProfile objects containg the same profile ID may be registered to CI
+				devices in the MIDI 2.0 subsystem.
+*/
+
+MIDICI1_2
+@interface MIDIUMPCIProfile : NSObject
+
+///	@property 	name
+///	@brief		The name of the MIDI-CI proifle.
+@property (nonatomic, readonly) NSString* name;
+
+///	@property 	profileID
+///	@brief		C struct representation of MIDI-CI Profile ID.
+@property (nonatomic, readonly) MIDICIProfileID profileID;
+
+///	@property	profileType
+///	@brief		The type of MIDI-CI Profile, i.e., single-channel, multichannel, Group, or Function Block.
+@property (nonatomic, readonly) MIDICIProfileType profileType;
+
+///	@property	groupOffset
+///	@brief		For Group profiles defined on Function Blocks, the value to be added to the lowest
+/// 			Function Block UMP Group for messaging (e.g., a Group Profile defined on the second
+/// 			Group of a Function Block has a groupOffset of 1).
+@property (nonatomic, readonly) MIDIUMPGroupNumber groupOffset;
+
+///	@property	firstChannel
+///	@brief		The first channel number supported on the Profile.
+@property (nonatomic, readonly) MIDIChannelNumber firstChannel;
+
+///	@property	enabledChannelCount
+///	@brief		The number of channels currently enabled on the Profile. When the profile is disabled,
+///				this value is set to 0.
+@property (nonatomic, readonly) MIDIUInteger14 enabledChannelCount;
+
+///	@property	totalChannelCount
+///	@brief		The total number of channels supported by the Profile.
+@property (nonatomic, readonly) MIDIUInteger14 totalChannelCount;
+
+///	@property	isEnabled
+///	@brief		The enable state of the Profile.
+@property (nonatomic, readonly) BOOL isEnabled;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/*!
+	@method		setProfileState:enabledChannelCount:error:
+	@brief		Issue a Set Profile On or Set Profile Off request on this profile using the MIDI server's
+				MUID.
+
+	@param		isEnabled			YES if setting the Profile to on.
+	@param		enabledChannelCount	The requsted number of channels to be enabled when
+									the Profile is enabled. This field is only used when isOn
+									is set to YES and the profile can enable a variable number
+									of channels. Otherwise, it is ignored.
+	@param		error				The out-error used if an error occurred.
+
+	@discussion	The result of this operation, if any, is received via the profile notification
+				posted by the MIDICIDeviceManager.
+				Returns YES if the request is valid and the request was dispatched.
+ */
+- (BOOL)setProfileState:(BOOL)isEnabled
+	enabledChannelCount:(MIDIUInteger14)enabledChannelCount
+				  error:(NSError* _Nullable*)error;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
+#endif
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpoint.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpoint.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpoint.h	1970-01-01 01:00:00
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpoint.h	2024-05-30 03:38:45
@@ -0,0 +1,201 @@
+/*
+ File:       CoreMIDI/MIDIUMPEndpoint.h
+
+ Contains:   API for MIDI Universal MIDI Packet (UMP) endpoints
+
+ Copyright:  (c) 2024 by Apple Inc., all rights reserved.
+
+ Bugs?:      For bug reports, consult the following page on
+ the World Wide Web:
+
+ http://feedbackassistant.apple.com/
+ */
+
+#if !defined(MIDIUMPEndpoint_h)
+#define MIDIUMPEndpoint_h
+
+/*!
+	@header MIDIUMPEndpoint.h
+
+	This is the header file for Univeral MIDI Packet (UMP) endpoint system services.
+
+	API Overview
+	------------
+	MIDI 2.0 is inherently bidirectional, and an endpoint that communicates using the Universal MIDI Packet
+	(UMP) format (a UMP Endpoint) must be capable of acting as a source of and destination for UMP data.
+	The MIDIUMPEndpoint class defines an explicit relationship between a UMP-native MIDI source and a
+	UMP-native MIDI destination and encapsulates its stream configuration.
+
+	A MIDIUMPEndpoint is a local cached object copied from the system-wide UMP Endpoint cache into the
+	client process instance of the UMP Endpoint manager (MIDIUMPEndpointManager). Any UMP Endpoint
+	may declare up to 32 Function Blocks, cached as MIDIUMPFunctionBlock objects registered to a
+	MIDIUMPEndpoint. These Function Blocks may also be used as MIDI-CI devices.
+
+	Implementation overview
+	-----------------------
+	To view the MIDIUMPEndpoint objects discovered by the MIDI server, retrieve the local process instance
+	of the UMP Endpoint manager (MIDIUMPEndpointManager) and retrieve a copy of the UMP Endpoint
+	Array. Any additional UMP Endpoint information and Function Blocks may be investigated in the discovered
+	Capabilities that are cached by the server can be viewed by investigating the CI device properties and by
+	using the associated API.
+
+	The singleton object MIDIUMPEndpointManager maintains a local copy of the UMP Endpoint cache and
+	may also be used to observe notifications which are posted in response to common UMP subsystem
+	cache updates.
+
+	Please visit http://www.midi.org/specifications for more information on MIDI 2.0 and UMP.
+*/
+
+#import <CoreMIDI/MIDIUMPCI.h>
+
+// This API requires the modern Objective-C runtime.
+#if defined(__OBJC2__)
+#import <Foundation/Foundation.h>
+#import <stdint.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class MIDIUMPFunctionBlock;
+@class MIDIUMPMutableFunctionBlock;
+@class MIDIUMPEndpoint;
+@class MIDIUMPMutableEndpoint;
+
+#pragma mark MIDI2DeviceInfo
+
+/*!
+	@class		MIDI2DeviceInfo
+	@brief		An NSObject containing basic information about a MIDI 2.0 device. Used by
+				MIDIUMPEndpointPair and MIDICIDevice.
+*/
+MIDIUMP1_1
+@interface MIDI2DeviceInfo : NSObject
+
+///	@property	manufacturerID
+///	@brief		The MIDI System Exclusive ID of the device manufacturer, up to 3-Bytes.
+///	@discussion One-byte SysEx IDs use only the least significant byte (e.g., Apple's System Exclusive ID, 0x11).
+@property (nonatomic, readonly) MIDI2DeviceManufacturer manufacturerID;
+
+///	@property	family
+///	@brief		The family of models to which the device belongs, up to 14 bits.
+@property (nonatomic, readonly) MIDIUInteger14 family;
+
+///	@property	modelNumber
+///	@brief		The specific model from the device manufacturer, up to 14 bits.
+@property (nonatomic, readonly) MIDIUInteger14 modelNumber;
+
+///	@property	revisionLevel
+///	@brief		The version number of a device model number.
+@property (nonatomic, readonly) MIDI2DeviceRevisionLevel revisionLevel;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/*!
+	@method		initWithManufacturerID:family:modelNumber:revision:
+	@brief		The initializer for constructing the MIDI2DeviceInfo object.
+
+	@param		manufacturerID	The 3-Byte manufacturer System Exclusive ID.
+	@param		family			The 14-bit device family.
+	@param		modelNumber		The 14-bit model number.
+	@param		revisionLevel	The 4-Byte revision level.
+
+	@discussion	Initialization may fail if the provided values for family or modelNumber are
+				outside of their expected bit range. For example, if modelNumber is outside
+				of the range of a 14-bit number.
+ */
+- (instancetype _Nullable)initWithManufacturerID:(MIDI2DeviceManufacturer)manufacturerID
+										  family:(MIDIUInteger14)family
+									 modelNumber:(MIDIUInteger14)modelNumber
+								   revisionLevel:(MIDI2DeviceRevisionLevel)revisionLevel;
+
+@end
+
+/*!
+	@enum		MIDIUMPProtocolBitmap
+	@brief		The UMP protocols that can be supported by a UMP endpoint.
+
+	@constant	kMIDIUMPSupportedProtocolMIDI1
+					Support for MIDI 1.0 in Universal Packets, or MIDI-1UP.
+
+	@constant	kMIDIUMPSupportedProtocolMIDI2
+					Support for MIDI 2.0 protocol.
+ */
+typedef CF_OPTIONS(MIDIUInteger4, MIDIUMPProtocolBitmap) {
+	kMIDIUMPSupportedProtocolMIDI1 = 1,
+	kMIDIUMPSupportedProtocolMIDI2 = 1 << 1
+};
+
+/*!
+	@class		MIDIUMPEndpoint
+	@brief		An object representating a UMP Endpoint.
+
+	@discussion	MIDIUMPEndpoint encapsulates a MIDI source and MIDI destination as a
+				bidirectional MIDI 2.0 communication node along with any associated stream
+				configuration metadata.
+
+				It is not necessary to create a MIDIUMPEndpoint or other MIDI endpoint in order to
+				use UMP natively. Any standard MIDI endpoint created with a specified MIDIProtocolID
+				is assumed to use all 16 UMP groups for the same unspecified function and to neither
+				transmit nor receive jitter-reduction timestamps.
+*/
+MIDIUMP1_1
+@interface MIDIUMPEndpoint : NSObject
+
+///	@property	name
+///	@brief		The UTF-8 encoded name of the UMP endpoint.
+///
+/// @discussion The name shall not be any longer than 98 bytes of UTF-8 Text.
+@property (nonatomic, readonly) NSString* name;
+
+///	@property	MIDIProtocol
+///	@brief		The MIDI protocol currently used by the UMP endpoint.
+@property (nonatomic, readonly) MIDIProtocolID MIDIProtocol;
+
+///	@property	supportedMIDIProtocols
+///	@brief		All protocols the UMP endpoint is capable of using for communication.
+@property (nonatomic, readonly) MIDIUMPProtocolBitmap supportedMIDIProtocols;
+
+///	@property	MIDIDestination
+///	@brief		The MIDI destination for the UMP endpoint.
+@property (nonatomic, readonly) MIDIEndpointRef MIDIDestination;
+
+///	@property	MIDISource
+///	@brief		The MIDI source for the UMP endpoint.
+@property (nonatomic, readonly) MIDIEndpointRef MIDISource;
+
+///	@property	deviceInfo
+///	@brief		The MIDI 2.0 Device identity information associated with the device.
+@property (nonatomic, readonly) MIDI2DeviceInfo* deviceInfo;
+
+///	@property	productInstanceID
+///	@brief		Serial number (or similar value) uniquely identifying this manufacturer/family/model,
+///				up to 42 bytes of ASCII Text in the ordinal range 32-126.
+@property (nonatomic, readonly) NSString* productInstanceID;
+
+///	@property	hasStaticFunctionBlocks
+///	@brief		Indicates if the Function Block state will never change once discovered.
+@property (nonatomic, readonly) BOOL hasStaticFunctionBlocks;
+
+///	@property	hasJRTSReceiveCapability
+///	@brief		Jitter-reduction timestamp receive capability.
+@property (nonatomic, readonly) BOOL hasJRTSReceiveCapability;
+
+///	@property	hasJRTSTransmitCapability
+///	@brief		Jitter-reduction timestamp transmit capability
+@property (nonatomic, readonly) BOOL hasJRTSTransmitCapability;
+
+///	@property	endpointType
+///	@brief		Indicates the type of UMP Endpoint, if known.
+@property (nonatomic, readonly) MIDIUMPCIObjectBackingType endpointType;
+
+///	@property	functionBlocks
+///	@brief		The Function Blocks associated with the UMP endpoint, if any.
+@property (nonatomic, copy) NSArray<MIDIUMPFunctionBlock*>* functionBlocks;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
+#endif
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpointManager.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpointManager.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpointManager.h	1970-01-01 01:00:00
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpointManager.h	2024-05-30 05:07:40
@@ -0,0 +1,146 @@
+/*
+ File:		CoreMIDI/MIDIUMPEndpointManager.h
+
+ Contains:	API for MIDI Universal MIDI Packet (UMP) Endpoint and MIDI
+			Capability Inquiry (MIDI-CI) Device Manager
+
+ Copyright:  (c) 2024 by Apple Inc., all rights reserved.
+
+ Bugs?:      For bug reports, consult the following page on
+ the World Wide Web:
+
+ http://feedbackassistant.apple.com/
+ */
+
+#if !defined(MIDIUMPEndpointManager_h)
+#define MIDIUMPEndpointManager_h
+
+/*!
+	@header MIDIUMPEndpointManager.h
+
+	This is the header file for UMP Endpoint and MIDI-CI device manager (UMPCI manager)  system
+	services.
+
+	API Overview
+	------------
+	The singleton object MIDIUMPEndpointManager maintains a local copy of the system-wide MIDI 2.0 UMP
+	Endpoint cache. Various notifications can be observed from the UMPCI manager object when
+	changes to the cache occur. (Note that in environments where virtual MIDI endpoint creation is not
+	allowed (for example, on iOS, if your app doesn't list 'audio' in UIBackgroundModes), notifications will only
+	be posted when the client process is not suspended.)
+
+	Implementation overview
+	-----------------------
+	To investigate the local copy of the UMPCI cache, retrieve the local instance of the UMPCI manager
+	object and examine the manager's properties. Function Blocks with MIDI-CI support, or MIDI-CI devices,
+	are listed separately for convenience.
+
+	To investigate the local copy of the MIDI-CI Device cache, retrieve the local instance of the UMPCI manager
+	object and examine the manager's properties.
+
+	This API is not realtime-safe. The local cache is updated on the client process main thread and all interaction with
+	the manager should be done on the main thread.
+
+	Please visit http://www.midi.org/specifications for more information on MIDI 2.0 and UMP.
+*/
+
+#import <CoreMIDI/MIDIUMPCI.h>
+
+// This API requires the modern Objective-C runtime.
+#if defined(__OBJC2__)
+#import <Foundation/Foundation.h>
+#import <stdint.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class MIDIUMPFunctionBlock;
+@class MIDICIDevice;
+@class MIDIUMPEndpoint;
+
+#pragma mark MIDIUMPEndpointManager Notifications
+
+/*!
+	@constant   MIDIUMPEndpointWasAddedNotification
+	@brief		A notification posted when a MIDI UMP Endpoint has been added to the subsystem.
+
+	@discussion	The MIDIUMPEndpoint sent in userInfo is the endpoint which was recently discovered.
+*/
+OS_EXPORT NSNotificationName const MIDIUMPEndpointWasAddedNotification MIDIUMP1_1;
+
+/*!
+	@constant   MIDIUMPEndpointWasRemovedNotification
+	@brief		A notification posted when a MIDI UMP Endpoint has been removed from the subsystem.
+
+	@discussion	Any MIDIUMPEndpoint sent with this notification is no longer available to the system. Any
+				attempt to perform I/O with its source or destination may fail, as the MIDIEndpointRef
+				associated with the UMP endpoint may no longer be valid. If this notification is posted,
+				any resources related to communication with this UMP endpoint may be safely
+				disposed.
+*/
+OS_EXPORT NSNotificationName const MIDIUMPEndpointWasRemovedNotification MIDIUMP1_1;
+
+/*!
+	@constant   MIDIUMPEndpointUpdatedNotification
+	@brief		A notification posted when an UMP endpoint updates its stream configuration or changes the
+				state of one of its Function Blocks.
+
+	@discussion	If this notification is posted, an Endpoint Info Notification was sent from the UMP endpoint in userInfo.
+*/
+OS_EXPORT NSNotificationName const MIDIUMPEndpointUpdatedNotification MIDIUMP1_1;
+
+/*!
+	@constant      MIDIUMPFunctionBlockUpdatedNotification
+	@brief         A notification posted when a Function Block is updated.
+
+	@discussion    If this notification is posted, the supplied Function Block in userInfo has had a change to its
+				   enabled state, Group configuration, UI hint, MIDI 1.0 status, etc..
+*/
+OS_EXPORT NSNotificationName const MIDIUMPFunctionBlockUpdatedNotification MIDIUMP1_1;
+
+#pragma mark Keys for NSNotification userInfo dictionaries
+
+/*!
+	@constant      MIDIUMPEndpointObjectKey
+	@brief         Value is a MIDIUMPEndpoint
+*/
+OS_EXPORT NSString* const MIDIUMPEndpointObjectKey MIDIUMP1_1;
+
+/*!
+	@constant      MIDIUMPFunctionBlockObjectKey
+	@brief         Value is a MIDIUMPFunctionBlock
+*/
+OS_EXPORT NSString* const MIDIUMPFunctionBlockObjectKey MIDIUMP1_1;
+
+#pragma mark MIDIUMPEndpointManager
+
+/*!
+	@class		MIDIUMPEndpointManager
+	@brief		A singleton object that performs system-wide UMP Endpoint bookkeeping.
+
+	@discussion	MIDIUMPEndpointManager is used to retrieve information about UMP Endpoint
+				pairs detected by or explicitly declared to the MIDI UMP subsystem.
+*/
+MIDIUMP1_1
+@interface MIDIUMPEndpointManager : NSObject
+
+/*!
+	@property   sharedInstance
+	@brief		Retrieve the shared UMP Endpoint manager for the client process.
+
+	@discussion	After first access to this property, the client process may begin observing notifications
+				which are posted when the system-wide cache changes.
+ */
+@property (class, nonatomic, readonly) MIDIUMPEndpointManager* sharedInstance;
+
+/*!
+	@property	UMPEndpoints
+	@brief		A  list of UMP endpoints discovered using UMP endpoint discovery.
+ */
+@property (nonatomic, readonly, copy) NSArray<MIDIUMPEndpoint*>* UMPEndpoints;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
+#endif
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPFunctionBlock.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPFunctionBlock.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPFunctionBlock.h	1970-01-01 01:00:00
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPFunctionBlock.h	2024-05-30 04:27:45
@@ -0,0 +1,152 @@
+/*
+ File:       CoreMIDI/MIDIUMPFunctionBlock.h
+
+ Contains:   API for MIDI 2.0 Function Blocks.
+
+ Copyright:  (c) 2024 by Apple Inc., all rights reserved.
+
+ Bugs?:      For bug reports, consult the following page on
+ the World Wide Web:
+
+ http://feedbackassistant.apple.com/
+ */
+
+#if !defined(MIDIUMPFunctionBlock_h)
+#define MIDIUMPFunctionBlock_h
+
+/*!
+	@header MIDIUMPFunctionBlock.h
+
+	This is the header file for MIDI 2.0 Function Block API support, including MIDI Capability
+	Inquiry (MIDI-CI).
+
+	API Overview
+	------------
+	The MIDI server automatically discovers UMP Endpoints, Function Blocks, and performs MIDI-CI
+	Discovery. When a client process retrieves the process instance of the UMP and MIDI-CI (UMPCI)
+	manager, a copy of the system-wide MIDI 2.0 cache is created using objects that describe the MIDI 2.0
+	subsystem.
+
+	A UMP Endpoint (MIDIUMPEndpoint) may declare up to 32 Function Blocks, represented as
+	MIDIUMPFunctionBlock objects in the local copy of the system-wide cache. If the Function Block
+	properties indicate that the Function Block supports MIDI-CI,  any MIDI-CI-related Function Block
+	properties are also populated with the results of MIDI-CI Discovery.
+
+	MIDIUMPMutableFunctionBlock is the client-created counterpart to MIDIUMPFunctionBlock. It is used
+	in the following generalized steps:
+		1. 	Initialize a new mutable Function Block object, indicating whether there is MIDI-CI support.
+			MIDI-CI can only be supported on bidirectional Function Blocks.
+		2. 	If the Function Block supports MIDI-CI, add any additional Capbilities and configure the
+			appropriate message callbacks.
+		3. 	Associate the mutable Function Block object with a mutable UMP Endpoint object
+			(MIDIUMPMutableEndpoint).
+		4.	Enable the mutable UMP Endpoint object so that the Function Block and its MIDI-CI
+			configuration (if any) become part of the MIDI 2.0 system-wide cache.
+		5.	Active client processes with a UMPCI Manager instance receive an updated copy of the
+			system-wide cache containing an immutable object copy of the mutable Function Block
+			object associated with an immutable object copy of the UMP Endpoint object.
+
+	Mutable Function Block objects may only be created in environments where virtual MIDI endpoint creation
+	is allowed (for example, on iOS, if your app doesn't list 'audio' in UIBackgroundModes).
+
+	Implementation overview
+	-----------------------
+	To view the UMP Endpoints and Function Blocks discovered by the MIDI server, retrieve the local process
+	instance of the UMPCI manager and view the discovered UMP Endpoints and their associated Function
+	Blocks. The UMPCI manager maintains a separate list of Function Blocks that support MIDI-CI.
+
+	If a Function Block supports MIDI-CI, an instance method can be used to retrieve the MIDICIDevice view of
+	the Function Block. This linked MIDICIDevice instance is also part of (and discoverable via) the MIDI-CI
+	device manager's cache.
+
+	Please visit http://www.midi.org/specifications for more information on MIDI 2.0, Universal
+	MIDI Packet and MIDI Capability Inquiry..
+*/
+
+#import <CoreMIDI/MIDIUMPCI.h>
+#import <CoreMIDI/MIDIUMPEndpoint.h>
+
+// This API requires the modern Objective-C runtime.
+#if defined(__OBJC2__)
+#import <Foundation/Foundation.h>
+#import <stdint.h>
+
+#define MIDIUMP1_1 API_AVAILABLE(macos(15.0), ios(18.0)) API_UNAVAILABLE(tvos, watchos)
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class MIDICIDevice;
+
+#pragma mark MIDIUMPFunctionBlock
+
+/*!
+	@class		MIDIUMPFunctionBlock
+	@brief  	An object representing a Function Block.
+
+	@discussion	A Function Block encapsulates one or more UMP groups with a single function, allowing
+				agents communicating with that UMP Endpoint to route and process UMP traffic
+				properly. Unless the owning MIDIUMPEndpoint has a static Function Block configuration,
+				any Function Block metadata may change in response to a configuration change in the
+				owning UMP endpoint.
+*/
+MIDIUMP1_1
+@interface MIDIUMPFunctionBlock : NSObject
+
+///	@property 	name
+///	@brief		A string containing the Function Block's name.
+@property (nonatomic, readonly) NSString* name;
+
+///	@property 	functionBlockID
+///	@brief		The device-unique ID for this Function Block.
+@property (nonatomic, readonly) MIDIUMPFunctionBlockID functionBlockID;
+
+///	@property	direction
+///	@brief		The direction of the Function Block: input, output, or bidirectional.
+@property (nonatomic, readonly) MIDIUMPFunctionBlockDirection direction;
+
+///	@property	firstGroup
+///	@brief		The first Group spanned by this Function Block.
+@property (nonatomic, readonly) MIDIUMPGroupNumber firstGroup;
+
+///	@property	totalGroupsSpanned
+///	@brief		The total number of groups spanned by this Function Block.
+@property (nonatomic, readonly) MIDIUInteger7 totalGroupsSpanned;
+
+///	@property	maxSysEx8Streams
+///	@brief		The maximum number of simultaneous Sysex8 streams.
+@property (nonatomic, readonly) UInt8 maxSysEx8Streams;
+
+///	@property	MIDI1Info
+///	@brief		MIDI 1.0 speed information.
+@property (nonatomic, readonly) MIDIUMPFunctionBlockMIDI1Info MIDI1Info;
+
+///	@property	UIHint
+///	@brief		A hint for UI about the primary usage of this Function Block.
+@property (nonatomic, readonly) MIDIUMPFunctionBlockUIHint UIHint;
+
+/// @property 	UMPEndpoint
+/// @brief		The UMP Endpoint to which this Function Block is registered.
+///
+/// @discussion If the function block does not belong to an endpoint this property will be nil.
+@property (nonatomic, readonly, weak, nullable) MIDIUMPEndpoint* UMPEndpoint;
+
+/// @property     MIDICIDevice
+/// @brief        Retrieve the MIDICIDevice class interface if the Function Block supports MIDI-CI.
+///
+/// @discussion   If a Function Block was created as a MIDICIDevice object, this property will
+///               provide an in-place MIDICIDevice interface that may be used with MIDI-CI API. If the
+///               device was not created as a MIDICIDevice, this method returns nil.
+@property (nonatomic, readonly, weak, nullable) MIDICIDevice* midiCIDevice;
+
+///	@property	isEnabled
+///	@brief		The enable state of this Function Block.
+@property (nonatomic, readonly) BOOL isEnabled;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
+#endif
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableEndpoint.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableEndpoint.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableEndpoint.h	1970-01-01 01:00:00
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableEndpoint.h	2024-05-30 05:07:40
@@ -0,0 +1,167 @@
+/*
+ File:       CoreMIDI/MIDIUMPMutableEndpoint.h
+
+ Contains:   API for MIDI Universal MIDI Packet (UMP) endpoints
+
+ Copyright:  (c) 2024 by Apple Inc., all rights reserved.
+
+ Bugs?:      For bug reports, consult the following page on
+ the World Wide Web:
+
+ http://feedbackassistant.apple.com/
+ */
+
+#if !defined(MIDIUMPMutableEndpoint_h)
+#define MIDIUMPMutableEndpoint_h
+
+/*!
+	@header MIDIUMPMutableEndpoint.h
+
+	This is the header file for Univeral MIDI Packet (UMP) endpoint system services.
+
+	API Overview
+	------------
+	MIDI 2.0 is inherently bidirectional, and an endpoint that communicates using the Universal MIDI Packet
+	(UMP) format (a UMP Endpoint) must be capable of acting as a source of and destination for UMP data.
+	The MIDIUMPMutableEndpoint class defines an explicit relationship between a UMP-capable source and
+	UMP-capable destination and encapsulates its stream configuration.
+
+	A MIDIUMPEndpoint is a local cached object copied from the system-wide UMP Endpoint cache into the
+	client process instance of MIDIUMPEndpointManager. Any UMP Endpoint may declare up to 32
+	Function Blocks, cached as MIDIUMPFunctionBlock objects associated with a MIDIUMPEndpoint. These
+	Function Blocks may also be used as MIDI-CI devices.
+
+	Implementation overview
+	-----------------------
+	A MIDIUMPEndpoint may have zero or more MIDIUMPFunctionBlock objects that parcel the UMP
+	datastream into collections of one or more UMP Groups performing a singular device function. In some
+	cases, Function Block configurations can change spontaneously, and the UMP groups spanned by
+	the Function Block may also change. Updates to the Function Block state are received from the
+	MIDIUMPEndpoint source, which are captured by the UMP subsystem and subsequently reflected in
+	the cache and in callbacks registered by interested client processes.
+
+	If virtual destination creation is allowed, a client process may also create mutable UMP Endpoint and
+	Function block objects. MIDIUMPMutableEndpoint objects are instantiated in an inactive state, allowing
+	the owning client process to create or update the Function Block configuration on the
+	MIDIUMPMutableEndpoint. Once enabled, the MIDIUMPMutableEndpoint and its Function Block
+	configuration (if any) will be added to the system-wide UMP Endpoint cache.
+
+	The singleton object MIDIUMPEndpointManager maintains a local copy of the UMP Endpoint cache and
+	may also be used to observe notifications which are posted in response common UMP subsystem
+	cache updates.
+
+	Please visit http://www.midi.org/specifications for more information on MIDI 2.0 and UMP.
+*/
+
+#import <CoreMIDI/MIDIUMPCI.h>
+#import <CoreMIDI/MIDIUMPEndpoint.h>
+
+// This API requires the modern Objective-C runtime.
+#if defined(__OBJC2__)
+#import <Foundation/Foundation.h>
+#import <stdint.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class MIDIUMPMutableFunctionBlock;
+
+#pragma mark MIDIUMPMutableEndpoint
+
+/*!
+	@class		MIDIUMPMutableEndpoint
+	@brief		A mutable MIDIUMPEndpoint object.
+
+	@discussion	It is not necessary to create a MIDIUMPEndpoint or other MIDI endpoint in order to
+				use UMP natively. Any standard MIDI endpoint created with a specified MIDIProtocolID
+				is assumed to use all 16 UMP groups for the same unspecified function and to neither
+				transmit nor receive jitter-reduction timestamps.
+
+				This API is not realtime-safe, all interaction with the mutable endpoint should be done on the
+				main thread.
+*/
+MIDIUMP1_1
+@interface MIDIUMPMutableEndpoint : MIDIUMPEndpoint
+
+///	@property	mutableFunctionBlocks
+///	@brief		The Function Blocks associated with the UMP endpoint, if any.
+@property (nonatomic, copy) NSArray<MIDIUMPMutableFunctionBlock*>* mutableFunctionBlocks;
+
+/// @property   isEnabled
+/// @brief      The enable state of the endpoint.
+@property (nonatomic, readonly) BOOL isEnabled;
+
+/*!
+	@method		initWithName:deviceInfo:productInstanceID:MIDIProtocol:destinationCallback
+	@brief		Initializer for creating a new MIDIUMPEndpoint.
+
+	@param		name			        The UMP endpoint name.
+	@param		deviceInfo		        The MIDI 2 device ID info for the UMP endpoint.
+	@param		productInstanceID      The product instance ID, up to 42 characters.
+	@param		MIDIProtocol	        The MIDI protocol.
+	@param		destinationCallback The receive callback used to create the UMP endpoint's MIDI
+									destination associated, which can be used to observe or process
+									incoming MIDI traffic.
+
+	@discussion	This operation will fail if the device ID information is malformed or if virtual MIDI endpoint creation
+				is not allowed (for example, on iOS, if your app doesn't list 'audio' in UIBackgroundModes).
+ */
+- (instancetype _Nullable)initWithName:(NSString*)name
+							deviceInfo:(MIDI2DeviceInfo*)deviceInfo
+					 productInstanceID:(NSString*)productInstanceID
+						  MIDIProtocol:(MIDIProtocolID)MIDIProtocol
+				   destinationCallback:(MIDIReceiveBlock)destinationCallback;
+
+/*!
+	@method       setName:error:
+	@brief        Set the endpoints name.
+
+	@param        name                      A string representing the name of the endpoint.
+	@param        error             The out-error used if an error occurs.
+
+	@return       YES for success. NO in the event of a failure, in which case the error is returned in error.
+
+	@discussion   This operation will fail if the name could not be set.
+ */
+- (BOOL)setName:(nonnull NSString*)name
+		  error:(NSError* _Nullable*)error;
+
+/*!
+	@method		registerFunctionBlocks:markAsStatic:error:
+	@brief		Register or replace Function Blocks for a disabled client-created MIDIUMPEndpoint.
+
+	@param		functionBlocks			A list of client-created Function Blocks to register.
+	@param		markAsStatic			Whether the Function Block configuration may be updated.
+	@param		error					The out-error used if an error occurs.
+
+	@return     YES for success. NO in the event of a failure, in which case the error is returned in error.
+
+	@discussion	This operation will fail if the array contains any disabled Function Blocks but the
+				MIDIUMPEndpoint Function Block configuration is static.
+				Returns YES if the Function Block configuration was set successfully.
+ */
+- (BOOL)registerFunctionBlocks:(nonnull NSArray<MIDIUMPMutableFunctionBlock*>*)functionBlocks
+				  markAsStatic:(BOOL)markAsStatic
+						 error:(NSError* _Nullable*)error;
+
+/*!
+	@method		setEnabled:error:
+	@brief		Enable a mutable UMP endpoint in the system-wide UMP endpoint cache.
+
+	@param		isEnabled               The enable state of the UMP endpoint.
+	@param		error		        The out-error used if an error occurred.
+
+	@return     YES for success. NO in the event of a failure, in which case the error is returned in error.
+
+	@discussion	A MIDIUMPMutableEndpoint must be cache enabled before it is visible via API.
+				Note that Function Blocks may only be registered to uncached MIDIUMPMutableEndpoint
+				objects.
+ */
+- (BOOL)setEnabled:(BOOL)isEnabled
+			 error:(NSError* _Nullable*)error;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
+#endif
diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableFunctionBlock.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableFunctionBlock.h
--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableFunctionBlock.h	1970-01-01 01:00:00
+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableFunctionBlock.h	2024-05-30 05:07:40
@@ -0,0 +1,179 @@
+/*
+ File:       CoreMIDI/MIDIUMPMutableFunctionBlock.h
+
+ Contains:   API for MIDI 2.0 Function Blocks.
+
+ Copyright:  (c) 2024 by Apple Inc., all rights reserved.
+
+ Bugs?:      For bug reports, consult the following page on
+ the World Wide Web:
+
+ http://feedbackassistant.apple.com/
+ */
+
+#if !defined(MIDIUMPMutableFunctionBlock_h)
+#define MIDIUMPMutableFunctionBlock_h
+
+/*!
+	@header MIDIUMPMutableFunctionBlock.h
+
+	This is the header file for MIDI 2.0 Function Block API support, including MIDI Capability
+	Inquiry (MIDI-CI).
+
+	API Overview
+	------------
+	The MIDI server automatically discovers UMP Endpoints, Function Blocks, and performs MIDI-CI
+	Discovery. When a client process retrieves the process instance of the UMP and MIDI-CI (UMPCI)
+	manager, a copy of the system-wide MIDI 2.0 cache is created using objects that describe the MIDI 2.0
+	subsystem.
+
+	A UMP Endpoint (MIDIUMPEndpoint) may declare up to 32 Function Blocks, represented as
+	MIDIUMPFunctionBlock objects in the local copy of the system-wide cache. If the Function Block
+	properties indicate that the Function Block supports MIDI-CI,  any MIDI-CI-related Function Block
+	properties are also populated with the results of MIDI-CI Discovery.
+
+	MIDIUMPMutableFunctionBlock is the client-created counterpart to MIDIUMPFunctionBlock. It is used
+	in the following generalized steps:
+		1. 	Initialize a new mutable Function Block object, indicating whether there is MIDI-CI support.
+			MIDI-CI can only be supported on bidirectional Function Blocks.
+		2. 	If the Function Block supports MIDI-CI, add any additional Capbilities and configure the
+			appropriate message callbacks.
+		3. 	Associate the mutable Function Block object with a mutable UMP Endpoint object
+			(MIDIUMPMutableEndpoint).
+		4.	Enable the mutable UMP Endpoint object so that the Function Block and its MIDI-CI
+			configuration (if any) become part of the MIDI 2.0 system-wide cache.
+		5.	Active client processes with a UMPCI Manager instance receive an updated copy of the
+			system-wide cache containing an immutable object copy of the mutable Function Block
+			object associated with an immutable object copy of the UMP Endpoint object.
+
+	Mutable Function Block objects may only be created in environments where virtual MIDI endpoint creation
+	is allowed (for example, on iOS, if your app doesn't list 'audio' in UIBackgroundModes).
+
+	Implementation overview
+	-----------------------
+	To view the UMP Endpoints and Function Blocks discovered by the MIDI server, retrieve the local process
+	instance of the UMPCI manager and view the discovered UMP Endpoints and their associated Function
+	Blocks. The UMPCI manager maintains a separate list of Function Blocks that support MIDI-CI.
+
+	If a Function Block supports MIDI-CI, an instance method can be used to retrieve the MIDICIDevice view of
+	the Function Block. This linked MIDICIDevice instance is also part of (and discoverable via) the MIDI-CI
+	device manager's cache.
+
+	Please visit http://www.midi.org/specifications for more information on MIDI 2.0, Universal
+	MIDI Packet and MIDI Capability Inquiry..
+*/
+
+#import <CoreMIDI/MIDIUMPCI.h>
+#import <CoreMIDI/MIDIUMPFunctionBlock.h>
+
+// This API requires the modern Objective-C runtime.
+#if defined(__OBJC2__)
+#import <Foundation/Foundation.h>
+#import <stdint.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+#pragma mark MIDIUMPMutableFunctionBlock
+
+/*!
+	@class		MIDIUMPMutableFunctionBlock
+	@brief  	A mutable Function Block object created by the client process.
+
+	@discussion	A Function Block created with this API may be used in the Function Block configuration
+				of a client-created MIDIUMPMutableEndpoint.
+
+				This API is not realtime-safe, all interaction with the function block should be done on the
+				main thread.
+*/
+MIDIUMP1_1
+@interface MIDIUMPMutableFunctionBlock : MIDIUMPFunctionBlock
+
+/// @property 	UMPEndpoint
+/// @brief		The UMP Endpoint to which this Function Block is registered.
+@property (nonatomic, readonly, weak, nullable) MIDIUMPMutableEndpoint* UMPEndpoint;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/*!
+	@method		initWithName:direction:firstGroup:totalGroupsSpanned:maxSysEx8Streams:MIDI1Info:UIHint:isEnabled:
+	@brief		The initializer for constructing a Function Block.
+
+	@param		name					The Function Block name.
+	@param		direction				The directionality of the Function Block.
+	@param		firstGroup				The first UMP Group supported by the Function Block.
+	@param		totalGroupsSpanned		The number of UMP groups spanned by the Function Block.
+	@param		maxSysEx8Streams		The maximum number of simultaneous Sysex8 streams.
+	@param		MIDI1Info				The MIDI 1.0 speed information for the Function Block.
+	@param		UIHint					A UI hint for the Function Block.
+	@param		isEnabled				The enable state of the Function Block.
+
+	@discussion	This operation will fail if virtual MIDI endpoint creation is not allowed
+				(for example, on iOS, if your app doesn't list 'audio' in UIBackgroundModes).
+ */
+- (instancetype _Nullable)initWithName:(NSString*)name
+							 direction:(MIDIUMPFunctionBlockDirection)direction
+							firstGroup:(MIDIUMPGroupNumber)firstGroup
+					totalGroupsSpanned:(MIDIUInteger7)totalGroupsSpanned
+					  maxSysEx8Streams:(MIDIUInteger7)maxSysEx8Streams
+							 MIDI1Info:(MIDIUMPFunctionBlockMIDI1Info)MIDI1Info
+								UIHint:(MIDIUMPFunctionBlockUIHint)UIHint
+							 isEnabled:(BOOL)isEnabled;
+
+/*!
+	@method		setEnabled:error:
+	@brief		Set whether this Function Block is enabled or disabled.
+
+	@param		isEnabled		The new state of the Function Block.
+	@param		error			The out-error used if an error occurred.
+
+	@return     YES for success. NO in the event of a failure, in which case the error is returned in error.
+
+	@discussion	If a Function Block is registered to UMP Endpoint as part of a static configuration,
+				the state must always be enabled and may not change. If registered to a UMP Endpoint,
+				changes to the Function Block state are propagated to the system-wide cache.
+ */
+- (BOOL)setEnabled:(BOOL)isEnabled
+			 error:(NSError* _Nullable*)error;
+
+/*!
+	@method       setName:error:
+	@brief        Set the function block name.
+
+	@param        name                      A string representing the name of the function block.
+	@param        error                    The out-error used if an error occurs.
+
+	@return       YES for success. NO in the event of a failure, in which case the error is returned in error.
+
+	@discussion   The Function Block name string. Updating the name of a Function Block will cause the
+				  updated name to be propagated to all local copies of the system-wide cache.
+ */
+- (BOOL)setName:(nonnull NSString*)name
+		  error:(NSError* _Nullable*)error;
+
+/*!
+	@method       reconfigure:MIDI1Info:UIHint:error
+	@brief        Reconfigure a Function Block.
+
+	@param    newGroup                The new first Group to use for the Function Block..
+	@param    direction              The direction of the Function Block: input, output, or bidirectional.
+	@param    MIDI1Info              MIDI 1.0 speed information.
+	@param    UIHint                     A hint for UI about the primary usage of this Function Block.
+
+	@discussion    If a mutable Function Block has not been registered to a CI device or was registered in
+				a non-static Function Block configuration, the first Group can be changed if the final
+				Group spanned by the Function Block is valid after the Function Block has been
+				relocated.
+				Returns YES if the first Group of the Function Block was changed.
+ */
+- (BOOL)reconfigureWithFirstGroup:(MIDIUMPGroupNumber)newGroup
+						direction:(MIDIUMPFunctionBlockDirection)direction
+						MIDI1Info:(MIDIUMPFunctionBlockMIDI1Info)MIDI1Info
+						   UIHint:(MIDIUMPFunctionBlockUIHint)UIHint
+							error:(NSError* _Nullable*)error;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
+#endif
Clone this wiki locally