Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

CoreMIDI tvOS xcode16.0 b1

Rolf Bjarne Kvinge edited this pageJul 11, 2024 ·3 revisions

#CoreMIDI.frameworkhttps://github.com/xamarin/xamarin-macios/pull/20882

diff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h2024-04-13 14:22:29+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h2024-05-30 03:45:27@@ -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  #endifdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDevice.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDevice.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDevice.h1970-01-01 01:00:00+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDevice.h2024-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++/*!+@classMIDICIDevice+@brief  An object representing a MIDI-CI Device.++@discussionThe 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;++///@propertyMUID+///@briefThe MIDI unique identifier (MUID) assigned to the CI device.+@property (nonatomic, readonly) MIDICIMUID MUID;++///@propertysupportsProtocolNegotiation+///@briefMIDI-CI Protocol Negotiation capability.+@property (nonatomic, readonly) BOOL supportsProtocolNegotiation;++///@propertysupportsProfileConfiguration+///@briefMIDI-CI Profile Configuration capability.+@property (nonatomic, readonly) BOOL supportsProfileConfiguration;++///@propertysupportsPropertyExchange+///@briefMIDI-CI Property Exchange capability.+@property (nonatomic, readonly) BOOL supportsPropertyExchange;++///@propertysupportsProcessInquiry+///@briefMIDI-CI Process Inquiry capability.+@property (nonatomic, readonly) BOOL supportsProcessInquiry;++///@property maxSysExSize+///@briefThe maximum receivable MIDI System Exclusive size for this CI device.+@property (nonatomic, readonly) NSUInteger maxSysExSize;++///@property maxPropertyExchangeRequests+///@briefThe maximum number of simultaneous Property Exchange requests, if supported.+@property (nonatomic, readonly) NSUInteger maxPropertyExchangeRequests;++///@property deviceType+///@briefThe type of MIDI-CI device.+@property (nonatomic, readonly) MIDICIDeviceType deviceType;++///@propertyprofiles+///@briefThe 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+#endifdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDeviceManager.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDeviceManager.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDeviceManager.h1970-01-01 01:00:00+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICIDeviceManager.h2024-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++/*!+@constantMIDICIDeviceWasAddedNotification+@briefA notification posted when a MIDI-CI Device has been added to the subsystem.++@discussionThe 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;++/*!+@constantMIDICIDeviceWasRemovedNotification+@briefA notification posted when a MIDI-CI Device has been removed or has had its MUID invalidated.++@discussionAny 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;++/*!+@constantMIDICIProfileStateChangedNotification+@briefA notification posted when a MIDI-CI Device has been enabled/disabled.++@discussionThe 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;++/*!+@constantMIDICIProfileWasRemovedNotification+@briefA 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++/*!+@constantMIDICIDeviceObjectKey+@briefValue is an MIDIUMPEndpoint.+*/+OS_EXPORT NSString* const MIDICIDeviceObjectKey MIDIUMP1_1;++/*!+@constantMIDICIProfileObjectKey+@briefValue is an MIDIUMPCIProfile+*/+OS_EXPORT NSString* const MIDICIProfileObjectKey MIDIUMP1_1;++#pragma mark MIDICIDeviceManager++/*!+@classMIDICIDeviceManager+@briefA singleton object that performs system-wide MIDI-CI Device bookkeeping.++@discussionMIDICIDeviceManager is used to retrieve information about MIDI-CI devices that+to MIDI-CI Discovery.+*/+MIDIUMP1_1+@interface MIDICIDeviceManager : NSObject++/*!+@property   sharedInstance+@briefRetrieve the shared MIDI-CI device manager for the client process.++@discussionAfter 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;++/*!+@propertydiscoveredCIDevices+@briefA 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+#endifdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICapabilityInquiry.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICapabilityInquiry.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICapabilityInquiry.h2024-04-13 20:16:20+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDICapabilityInquiry.h2024-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+@briefAn 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)-/*!- @classMIDICIDeviceInfo- @brief  An NSObject containing basic information about a MIDI-CI-capable node.+/*+@classMIDICIDeviceInfo+@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+ // =================================================================================================  /*!- @classMIDICIProfile- @abstract  An NSObject representing Capability Inquiry profile. MIDI-CI profiles describe a mapping+@classMIDICIProfile+@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 ProfileVendor-Specific Profile Profile ID Byte 1:0x7E Standard ProfileManufacturer SysEx ID 1 Profile Profile ID Byte 2:Profile BankManufacturer 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-/*!- @classMIDICIProfileState- @brief  Lists the enabled and disabled profiles for a MIDI channel or port on a device.+/*+@classMIDICIProfileState+@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_ENDdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIDriver.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIDriver.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIDriver.h2024-04-13 13:01:08+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIDriver.h2024-05-30 04:53:06@@ -323,7 +323,7 @@  New for CoreMIDI 1.1. */-extern const CFStringRef kMIDIDriverPropertyUsesSerialAPI_AVAILABLE(macos(10.1)) API_UNAVAILABLE(ios, tvos, watchos);+extern const CFStringRef kMIDIDriverPropertyUsesSerialAPI_AVAILABLE(macos(10.1)) MIDI_API_UNAVAILABLE_NON_MACOS;   #ifdef __cplusplus@@ -551,7 +551,7 @@ @resultAn OSStatus result code. */ extern OSStatusMIDIDriverEnableMonitoring(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 __cplusplusdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIMessages.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIMessages.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIMessages.h2024-04-13 14:22:30+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIMessages.h2024-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 __cplusplusdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIServices.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIServices.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIServices.h2024-04-13 14:22:29+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIServices.h2024-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 CFStringRefkMIDIPropertyFactoryPatchNameFileAPI_DEPRECATED_WITH_REPLACEMENT("kMIDIPropertyNameConfiguration", macos(10.1, 10.2)) API_UNAVAILABLE(ios, tvos, watchos);+extern const CFStringRefkMIDIPropertyFactoryPatchNameFileAPI_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 CFStringRefkMIDIPropertyUserPatchNameFileAPI_DEPRECATED_WITH_REPLACEMENT("kMIDIPropertyNameConfiguration", macos(10.1, 10.2)) API_UNAVAILABLE(ios, tvos, watchos);+extern const CFStringRefkMIDIPropertyUserPatchNameFileAPI_DEPRECATED_WITH_REPLACEMENT("kMIDIPropertyNameConfiguration", macos(10.1, 10.2)) MIDI_API_UNAVAILABLE_NON_MACOS;  /*! @constantkMIDIPropertyNameConfiguration@@ -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);++/*!+constantkMIDIPropertyAssociatedEndpoint+@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 markClientsdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDISetup.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDISetup.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDISetup.h2024-04-05 22:13:33+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDISetup.h2024-05-30 04:53:06@@ -78,7 +78,7 @@ @resultAn 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 @@ @resultAn 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 @@ @resultAn 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 @@ @resultAn 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(MIDISetupRefsetup,-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(CFStringRefportName,-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(CFStringRefportName,-CFStringRefdriverName )API_DEPRECATED("No longer supported", macos(10.1, 10.6)) API_UNAVAILABLE(ios, tvos, watchos);+CFStringRefdriverName )API_DEPRECATED("No longer supported", macos(10.1, 10.6)) MIDI_API_UNAVAILABLE_NON_MACOS;  //  ----------------------------------------------------------------------------- /*!@@ -440,7 +440,7 @@ @resultAn 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/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCI.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCI.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCI.h1970-01-01 01:00:00+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCI.h2024-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;++/*!+@typedefMIDICICategoryBitmap++@discussionMIDI Capability category supported (bitmap: D6 D5 D4 D3 D2 D1 D0)+BitCategorySub-ID RangeDescription+D00x00~0x0FReserved - No Messages Defined Yet+D10x10~0x1FProtocol Negotiation (Deprecated)+D20x20~0x2FProfile Configuration Supported+D30x30~0x3FProperty Exchange Supported+D40x40~0x4FProcess Inquiry Supported+D50x50~0x5FReserved - No Messages Defined Yet+D60x60~0x6FReserved - 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),+};++/*!+@typedefMIDIUMPFunctionBlockID+@briefThe 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+@briefMIDI-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+};++/*!+@enumMIDICIPropertyExchangeMessageType+@briefMIDI-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+};++/*!+@enumMIDICIProcessInquiryMessageType+@briefMIDI-CI Process Inquiry sub-ID values.+ */+typedef CF_ENUM(MIDIUInteger7, MIDICIProcessInquiryMessageType) {+kMIDICIProcessInquiryMessageTypeInquiryProcessInquiryCapabilities = 0x40,+kMIDICIProcessInquiryMessageTypeReplyToProcessInquiryCapabilities = 0x41,+kMIDICIProcessInquiryMessageTypeInquiryMIDIMessageReport = 0x42,+kMIDICIProcessInquiryMessageTypeReplyToMIDIMessageReport = 0x43,+kMIDICIProcessInquiryMessageTypeEndOfMIDIMessageReport = 0x44+};++/*!+@enumMIDICIManagementMessageType+@briefMIDI-CI Management sub-ID values.+ */+typedef CF_ENUM(MIDIUInteger7, MIDICIManagementMessageType) {+kMIDICIManagementMessageTypeDiscovery = 0x70,+kMIDICIManagementMessageTypeReplyToDiscovery = 0x71,+kMIDICIManagementMessageTypeInquiryEndpointInformation = 0x72,+kMIDICIManagementMessageTypeReplyToEndpointInformation = 0x73,+kMIDICIManagementMessageTypeMIDICIACK = 0x7D,+kMIDICIManagementMessageTypeInvalidateMUID = 0x7E,+kMIDICIManagementMessageTypeMIDICINAK = 0x7F+};+++/*!+@enumMIDICIProfileType+@briefMIDI-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++/*!+@structMIDICIProfileIDStandard+@briefA C-style struct containing a standard profile ID.+ */+typedef struct+{+MIDIUInteger7 profileIDByte1;+MIDIUInteger7 profileBank;+MIDIUInteger7 profileNumber;+MIDIUInteger7 profileVersion;+MIDIUInteger7 profileLevel;+} MIDICIProfileIDStandard;++/*!+@structMIDICIProfileIDManufacturerSpecific+@briefA C-style struct containing a Manufacturer Specific profile ID.++ */+typedef struct+{+MIDIUInteger7 sysExID1;+MIDIUInteger7 sysExID2;+MIDIUInteger7 sysExID3;+MIDIUInteger7 info1;+MIDIUInteger7 info2;+} MIDICIProfileIDManufacturerSpecific;++/*!+@structMIDICIProfileID+@briefA C-style struct containing the profile ID.++@discussionThere 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++/*!+@typedefMIDICIPropertyExchangeRequestID+@briefThe request ID associated with a Property Exchange request.++@discussionAs 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_hdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCIProfile.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCIProfile.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCIProfile.h1970-01-01 01:00:00+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPCIProfile.h2024-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;++/*!+@classMIDIUMPCIProfile+@briefAn object representing Capability Inquiry Profile on a MIDICIDevice.++@discussionMIDI-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 ProfileVendor-Specific Profile+Profile ID Byte 1:0x7E Standard ProfileManufacturer SysEx ID 1 Profile+Profile ID Byte 2:Profile BankManufacturer SysEx ID 2 Profile+Profile ID Byte 3:Profile NumberManufacturer SysEx ID 3 Profile+Profile ID Byte 4:Profile VersionManufacturer-specific Info+Profile ID Byte 5:Profile LevelManufacturer-specific Info++MIDI-CI Profiles have the following generalized types:++Profile TypeSourceChannelsChannel Range+=========================================================+Single-channel 0x00~0x0F 11 channel (1 to 16) of a Group+Group0x7E16All channels of a Group+Function Block0x7F16 per Group All channels of a Function Block+Multi-channel0x00~0x0F2 or moreProfile-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+///@briefThe name of the MIDI-CI proifle.+@property (nonatomic, readonly) NSString* name;++///@property profileID+///@briefC struct representation of MIDI-CI Profile ID.+@property (nonatomic, readonly) MIDICIProfileID profileID;++///@propertyprofileType+///@briefThe type of MIDI-CI Profile, i.e., single-channel, multichannel, Group, or Function Block.+@property (nonatomic, readonly) MIDICIProfileType profileType;++///@propertygroupOffset+///@briefFor 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;++///@propertyfirstChannel+///@briefThe first channel number supported on the Profile.+@property (nonatomic, readonly) MIDIChannelNumber firstChannel;++///@propertyenabledChannelCount+///@briefThe number of channels currently enabled on the Profile. When the profile is disabled,+///this value is set to 0.+@property (nonatomic, readonly) MIDIUInteger14 enabledChannelCount;++///@propertytotalChannelCount+///@briefThe total number of channels supported by the Profile.+@property (nonatomic, readonly) MIDIUInteger14 totalChannelCount;++///@propertyisEnabled+///@briefThe enable state of the Profile.+@property (nonatomic, readonly) BOOL isEnabled;++- (instancetype)init NS_UNAVAILABLE;++/*!+@methodsetProfileState:enabledChannelCount:error:+@briefIssue a Set Profile On or Set Profile Off request on this profile using the MIDI server's+MUID.++@paramisEnabledYES if setting the Profile to on.+@paramenabledChannelCountThe 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.+@paramerrorThe out-error used if an error occurred.++@discussionThe 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+#endifdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpoint.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpoint.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpoint.h1970-01-01 01:00:00+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpoint.h2024-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++/*!+@classMIDI2DeviceInfo+@briefAn NSObject containing basic information about a MIDI 2.0 device. Used by+MIDIUMPEndpointPair and MIDICIDevice.+*/+MIDIUMP1_1+@interface MIDI2DeviceInfo : NSObject++///@propertymanufacturerID+///@briefThe 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;++///@propertyfamily+///@briefThe family of models to which the device belongs, up to 14 bits.+@property (nonatomic, readonly) MIDIUInteger14 family;++///@propertymodelNumber+///@briefThe specific model from the device manufacturer, up to 14 bits.+@property (nonatomic, readonly) MIDIUInteger14 modelNumber;++///@propertyrevisionLevel+///@briefThe version number of a device model number.+@property (nonatomic, readonly) MIDI2DeviceRevisionLevel revisionLevel;++- (instancetype)init NS_UNAVAILABLE;++/*!+@methodinitWithManufacturerID:family:modelNumber:revision:+@briefThe initializer for constructing the MIDI2DeviceInfo object.++@parammanufacturerIDThe 3-Byte manufacturer System Exclusive ID.+@paramfamilyThe 14-bit device family.+@parammodelNumberThe 14-bit model number.+@paramrevisionLevelThe 4-Byte revision level.++@discussionInitialization 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++/*!+@enumMIDIUMPProtocolBitmap+@briefThe UMP protocols that can be supported by a UMP endpoint.++@constantkMIDIUMPSupportedProtocolMIDI1+Support for MIDI 1.0 in Universal Packets, or MIDI-1UP.++@constantkMIDIUMPSupportedProtocolMIDI2+Support for MIDI 2.0 protocol.+ */+typedef CF_OPTIONS(MIDIUInteger4, MIDIUMPProtocolBitmap) {+kMIDIUMPSupportedProtocolMIDI1 = 1,+kMIDIUMPSupportedProtocolMIDI2 = 1 << 1+};++/*!+@classMIDIUMPEndpoint+@briefAn object representating a UMP Endpoint.++@discussionMIDIUMPEndpoint 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++///@propertyname+///@briefThe 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;++///@propertyMIDIProtocol+///@briefThe MIDI protocol currently used by the UMP endpoint.+@property (nonatomic, readonly) MIDIProtocolID MIDIProtocol;++///@propertysupportedMIDIProtocols+///@briefAll protocols the UMP endpoint is capable of using for communication.+@property (nonatomic, readonly) MIDIUMPProtocolBitmap supportedMIDIProtocols;++///@propertyMIDIDestination+///@briefThe MIDI destination for the UMP endpoint.+@property (nonatomic, readonly) MIDIEndpointRef MIDIDestination;++///@propertyMIDISource+///@briefThe MIDI source for the UMP endpoint.+@property (nonatomic, readonly) MIDIEndpointRef MIDISource;++///@propertydeviceInfo+///@briefThe MIDI 2.0 Device identity information associated with the device.+@property (nonatomic, readonly) MIDI2DeviceInfo* deviceInfo;++///@propertyproductInstanceID+///@briefSerial 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;++///@propertyhasStaticFunctionBlocks+///@briefIndicates if the Function Block state will never change once discovered.+@property (nonatomic, readonly) BOOL hasStaticFunctionBlocks;++///@propertyhasJRTSReceiveCapability+///@briefJitter-reduction timestamp receive capability.+@property (nonatomic, readonly) BOOL hasJRTSReceiveCapability;++///@propertyhasJRTSTransmitCapability+///@briefJitter-reduction timestamp transmit capability+@property (nonatomic, readonly) BOOL hasJRTSTransmitCapability;++///@propertyendpointType+///@briefIndicates the type of UMP Endpoint, if known.+@property (nonatomic, readonly) MIDIUMPCIObjectBackingType endpointType;++///@propertyfunctionBlocks+///@briefThe 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+#endifdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpointManager.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpointManager.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpointManager.h1970-01-01 01:00:00+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPEndpointManager.h2024-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+@briefA notification posted when a MIDI UMP Endpoint has been added to the subsystem.++@discussionThe MIDIUMPEndpoint sent in userInfo is the endpoint which was recently discovered.+*/+OS_EXPORT NSNotificationName const MIDIUMPEndpointWasAddedNotification MIDIUMP1_1;++/*!+@constant   MIDIUMPEndpointWasRemovedNotification+@briefA notification posted when a MIDI UMP Endpoint has been removed from the subsystem.++@discussionAny 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+@briefA notification posted when an UMP endpoint updates its stream configuration or changes the+state of one of its Function Blocks.++@discussionIf 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++/*!+@classMIDIUMPEndpointManager+@briefA singleton object that performs system-wide UMP Endpoint bookkeeping.++@discussionMIDIUMPEndpointManager 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+@briefRetrieve the shared UMP Endpoint manager for the client process.++@discussionAfter 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;++/*!+@propertyUMPEndpoints+@briefA  list of UMP endpoints discovered using UMP endpoint discovery.+ */+@property (nonatomic, readonly, copy) NSArray<MIDIUMPEndpoint*>* UMPEndpoints;++@end++NS_ASSUME_NONNULL_END++#endif+#endifdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPFunctionBlock.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPFunctionBlock.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPFunctionBlock.h1970-01-01 01:00:00+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPFunctionBlock.h2024-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++/*!+@classMIDIUMPFunctionBlock+@brief  An object representing a Function Block.++@discussionA 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+///@briefA string containing the Function Block's name.+@property (nonatomic, readonly) NSString* name;++///@property functionBlockID+///@briefThe device-unique ID for this Function Block.+@property (nonatomic, readonly) MIDIUMPFunctionBlockID functionBlockID;++///@propertydirection+///@briefThe direction of the Function Block: input, output, or bidirectional.+@property (nonatomic, readonly) MIDIUMPFunctionBlockDirection direction;++///@propertyfirstGroup+///@briefThe first Group spanned by this Function Block.+@property (nonatomic, readonly) MIDIUMPGroupNumber firstGroup;++///@propertytotalGroupsSpanned+///@briefThe total number of groups spanned by this Function Block.+@property (nonatomic, readonly) MIDIUInteger7 totalGroupsSpanned;++///@propertymaxSysEx8Streams+///@briefThe maximum number of simultaneous Sysex8 streams.+@property (nonatomic, readonly) UInt8 maxSysEx8Streams;++///@propertyMIDI1Info+///@briefMIDI 1.0 speed information.+@property (nonatomic, readonly) MIDIUMPFunctionBlockMIDI1Info MIDI1Info;++///@propertyUIHint+///@briefA hint for UI about the primary usage of this Function Block.+@property (nonatomic, readonly) MIDIUMPFunctionBlockUIHint UIHint;++/// @property UMPEndpoint+/// @briefThe 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;++///@propertyisEnabled+///@briefThe enable state of this Function Block.+@property (nonatomic, readonly) BOOL isEnabled;++- (instancetype)init NS_UNAVAILABLE;++@end++NS_ASSUME_NONNULL_END++#endif+#endifdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableEndpoint.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableEndpoint.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableEndpoint.h1970-01-01 01:00:00+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableEndpoint.h2024-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++/*!+@classMIDIUMPMutableEndpoint+@briefA mutable MIDIUMPEndpoint object.++@discussionIt 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++///@propertymutableFunctionBlocks+///@briefThe 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;++/*!+@methodinitWithName:deviceInfo:productInstanceID:MIDIProtocol:destinationCallback+@briefInitializer for creating a new MIDIUMPEndpoint.++@paramname        The UMP endpoint name.+@paramdeviceInfo        The MIDI 2 device ID info for the UMP endpoint.+@paramproductInstanceID      The product instance ID, up to 42 characters.+@paramMIDIProtocol        The MIDI protocol.+@paramdestinationCallback The receive callback used to create the UMP endpoint's MIDI+destination associated, which can be used to observe or process+incoming MIDI traffic.++@discussionThis 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;++/*!+@methodregisterFunctionBlocks:markAsStatic:error:+@briefRegister or replace Function Blocks for a disabled client-created MIDIUMPEndpoint.++@paramfunctionBlocksA list of client-created Function Blocks to register.+@parammarkAsStaticWhether the Function Block configuration may be updated.+@paramerrorThe 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.++@discussionThis 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;++/*!+@methodsetEnabled:error:+@briefEnable a mutable UMP endpoint in the system-wide UMP endpoint cache.++@paramisEnabled               The enable state of the UMP endpoint.+@paramerror        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.++@discussionA 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+#endifdiff -ruN /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableFunctionBlock.h /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableFunctionBlock.h--- /Applications/Xcode_15.4.0.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableFunctionBlock.h1970-01-01 01:00:00+++ /Applications/Xcode_16.0.0-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/CoreMIDI.framework/Headers/MIDIUMPMutableFunctionBlock.h2024-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++/*!+@classMIDIUMPMutableFunctionBlock+@brief  A mutable Function Block object created by the client process.++@discussionA 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+/// @briefThe UMP Endpoint to which this Function Block is registered.+@property (nonatomic, readonly, weak, nullable) MIDIUMPMutableEndpoint* UMPEndpoint;++- (instancetype)init NS_UNAVAILABLE;++/*!+@methodinitWithName:direction:firstGroup:totalGroupsSpanned:maxSysEx8Streams:MIDI1Info:UIHint:isEnabled:+@briefThe initializer for constructing a Function Block.++@paramnameThe Function Block name.+@paramdirectionThe directionality of the Function Block.+@paramfirstGroupThe first UMP Group supported by the Function Block.+@paramtotalGroupsSpannedThe number of UMP groups spanned by the Function Block.+@parammaxSysEx8StreamsThe maximum number of simultaneous Sysex8 streams.+@paramMIDI1InfoThe MIDI 1.0 speed information for the Function Block.+@paramUIHintA UI hint for the Function Block.+@paramisEnabledThe enable state of the Function Block.++@discussionThis 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;++/*!+@methodsetEnabled:error:+@briefSet whether this Function Block is enabled or disabled.++@paramisEnabledThe new state of the Function Block.+@paramerrorThe 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.++@discussionIf 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

[8]ページ先頭

©2009-2025 Movatter.jp