Skip to content

[CoreMidi] Add missing CoreMIDI bindings and MidiEventList support. - #24738

Draft
rolfbjarne wants to merge 6 commits into
mainfrom
dev/rolf/coremidi-copilot
Draft

[CoreMidi] Add missing CoreMIDI bindings and MidiEventList support.#24738
rolfbjarne wants to merge 6 commits into
mainfrom
dev/rolf/coremidi-copilot

Conversation

@rolfbjarne

@rolfbjarne rolfbjarne commented Feb 18, 2026

Copy link
Copy Markdown
Member

Bind the following missing CoreMIDI APIs:

  • MIDIDeviceCreate/MIDIDeviceDispose
  • MIDIExternalDeviceCreate
  • MIDISetupAddDevice/MIDISetupRemoveDevice
  • MIDISetupAddExternalDevice/MIDISetupRemoveExternalDevice
  • MIDIEntityAddOrRemoveEndpoints
  • MIDIDeviceRemoveEntity
  • MIDIEndPointGetRefCons/MIDIEndPointSetRefCons
  • MIDIDriverEnableMonitoring
  • MIDIGetDriverDeviceList/MIDIGetDriverIORunLoop
  • MIDISendSysex/MIDISendUMPSysex
  • MIDIDestinationCreateWithProtocol
  • MIDISourceCreateWithProtocol
  • MIDIInputPortCreateWithProtocol
  • MIDIEventPacketSysexBytesForGroup
  • MIDI 2.0 structs (MIDI2DeviceManufacturer, MIDI2DeviceRevisionLevel,
    MIDICIProfileID, MIDISysexSendRequest, MIDISysexSendRequestUMP)
  • MidiDriver abstract class for implementing custom MIDI drivers

Add MidiEventList and MidiEventPacket classes for MIDI 2.0 Universal MIDI
Packet (UMP) support (MIDIEventList/MIDIEventPacket structs).

Add comprehensive tests including a Happy Birthday melody test.

There's a sample project in progress here: dotnet/macios-samples#10.

Fixes #4452
Fixes #12489

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds comprehensive CoreMIDI bindings for missing APIs and implements MIDI 2.0 Universal MIDI Packet (UMP) support, addressing issues #4452 and #12489. The changes enable developers to work with MIDI devices at a lower level, including custom driver implementation, and provide full support for the modern MIDI 2.0 protocol.

Changes:

  • Added MidiEventList and MidiEventPacket classes for MIDI 2.0 UMP support, enabling Universal MIDI Packet handling
  • Implemented missing CoreMIDI device/entity management APIs (Create, Dispose, AddOrRemoveEndpoints, etc.) and sysex sending functionality
  • Introduced experimental MidiDriver abstract class for implementing custom MIDI drivers with full lifecycle management

Reviewed changes

Copilot reviewed 23 out of 23 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
tests/xtro-sharpie/api-annotations-dotnet/*.ignore Removed API ignore entries for newly bound CoreMIDI APIs across all platforms
tests/cecil-tests/Documentation.cs Added FunctionPointerType handling to return empty doc IDs for unmanaged function pointers
tests/cecil-tests/Documentation.KnownFailures.txt Removed known failures for newly documented CoreMIDI types and fixed function pointer doc IDs
tests/monotouch-test/CoreMidi/MidiEventPacketTest.cs Comprehensive unit tests for MidiEventPacket struct including bounds checking and data manipulation
tests/monotouch-test/CoreMidi/MidiEventListTest.cs Unit tests for MidiEventList covering construction, adding packets, iteration, and edge cases
tests/monotouch-test/CoreMidi/MidiEndpointTest.cs Added tests for GetRefCons/SetRefCons endpoint reference management APIs
tests/monotouch-test/CoreMidi/MidiDeviceTest.cs Tests for external device creation and MidiSetup add/remove operations
tests/monotouch-test/CoreMidi/MidiComprehensiveTest.cs Extensive integration tests including a complete "Happy Birthday" melody demonstration
src/frameworks.sources Registered new CoreMidi and CoreFoundation source files in the build system
src/coremidi.cs Added MidiDriverProperty enum for driver-specific properties
src/CoreMidi/MidiThruConnectionParams.cs Moved enum definitions outside TVOS conditional to fix tvOS build issues
src/CoreMidi/MidiStructs.cs Implemented MIDI 2.0 structs (Midi2DeviceManufacturer, Midi2DeviceRevisionLevel, MidiCIProfileId variants, MidiSysexSendRequest)
src/CoreMidi/MidiServices.cs Added device/entity creation, external device support, sysex async sending, and protocol-aware port/endpoint creation methods
src/CoreMidi/MidiEventPacket.cs Implemented MidiEventPacket struct with 64-word capacity, indexer, and GetSysexBytes method
src/CoreMidi/MidiEventList.cs Implemented MidiEventList as IDisposable wrapper with Add, Send, Receive, and iteration support
src/CoreMidi/MidiDriverInterface.cs Created experimental MidiDriver abstract class with COM-style interface for custom driver implementation
src/CoreMidi/MidiBluetoothDriver.cs Removed TVOS conditional and added XML documentation for Bluetooth driver methods
src/CoreFoundation/CFUuidBytes.cs Added CFUuidBytes struct for CoreMIDI driver interface QueryInterface method
docs/preview-apis.md Documented MidiDriver as experimental (APL0004) until .NET 12

Comment thread tests/monotouch-test/CoreMidi/MidiEventListTest.cs
Comment thread tests/monotouch-test/CoreMidi/MidiEventListTest.cs
Comment thread tests/monotouch-test/CoreMidi/MidiEventListTest.cs
Comment thread tests/monotouch-test/CoreMidi/MidiEventListTest.cs
Comment thread tests/monotouch-test/CoreMidi/MidiEventListTest.cs
Comment thread tests/monotouch-test/CoreMidi/MidiEventListTest.cs
Comment thread src/CoreMidi/MidiEventList.cs Outdated
Comment thread src/CoreMidi/MidiEventList.cs Outdated
Comment thread src/CoreMidi/MidiDriverInterface.cs Outdated
Comment thread tests/monotouch-test/CoreMidi/MidiEventListTest.cs
@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

rolfbjarne and others added 3 commits June 25, 2026 08:28
Bind the following missing CoreMIDI APIs:
- MIDIDeviceCreate/MIDIDeviceDispose
- MIDIExternalDeviceCreate
- MIDISetupAddDevice/MIDISetupRemoveDevice
- MIDISetupAddExternalDevice/MIDISetupRemoveExternalDevice
- MIDIEntityAddOrRemoveEndpoints
- MIDIDeviceRemoveEntity
- MIDIEndPointGetRefCons/MIDIEndPointSetRefCons
- MIDIDriverEnableMonitoring
- MIDIGetDriverDeviceList/MIDIGetDriverIORunLoop
- MIDISendSysex/MIDISendUMPSysex
- MIDIDestinationCreateWithProtocol
- MIDISourceCreateWithProtocol
- MIDIInputPortCreateWithProtocol
- MIDIClientCreateWithBlock
- MIDIEventPacketSysexBytesForGroup
- MIDI 2.0 structs (MIDI2DeviceManufacturer, MIDI2DeviceRevisionLevel,
  MIDICIProfileID, MIDISysexSendRequest, MIDISysexSendRequestUMP)
- MidiDriver abstract class for implementing custom MIDI drivers

Add MidiEventList and MidiEventPacket classes for MIDI 2.0 Universal MIDI
Packet (UMP) support (MIDIEventList/MIDIEventPacket structs).

Add comprehensive tests including a Happy Birthday melody test.

There's a sample project in progress here: dotnet/macios-samples#10.

Fixes #4452
Fixes #12489
…sage.

Add a binding for the native MIDIEventListForEachEvent function, which
parses each Universal MIDI Packet (UMP) in a MidiEventList and invokes a
callback with the parsed message.

This adds:
* A faithful managed MidiUniversalMessage struct (and its variant structs)
  mirroring the native MIDIUniversalMessage union.
* A MidiEventList.ForEachEvent method + MidiUniversalMessageVisitor delegate.
* Thorough tests, including parsing a MIDI 1.0 note on, a MIDI 2.0 note on,
  and the Happy Birthday melody.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Explicit struct layout (with overlapping union fields) makes a struct
non-blittable, which forces the runtime to generate marshaling code and
prevents passing the struct by value through a 'delegate* unmanaged'
function pointer without overhead.

Rewrite MidiUniversalMessage and its variant structs to use sequential
blittable layout with opaque storage fields, exposing the native unions
through unsafe accessor properties that reinterpret the storage. Also
replace fixed buffers / array fields with named byte fields.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@rolfbjarne
rolfbjarne force-pushed the dev/rolf/coremidi-copilot branch from 9db33b7 to 01b1410 Compare June 25, 2026 06:59
@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@rolfbjarne rolfbjarne left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Code Review — CoreMIDI bindings

Verdict: ⚠️ Needs Changes (minor) — No bugs, breaking changes, or memory-safety issues found. The COM-style driver ref-counting, blittable union emulation (MidiUniversalMessage/MidiEventPacket avoid explicit layout/arrays to stay blittable for delegate* unmanaged), and the sysex async lifetime management (disposing the CancellationTokenRegistration before freeing native memory) are all sound. A few correctness/polish items inline.

Positive callouts

  • No API-breaking changes; removals handled via [ObsoletedOSPlatform] with actionable "Call 'X' instead." messages.
  • MidiDriver COM ref-counting (AddRef/Release under lock, weak GCHandle, finalizer releasing the managed ref) is coherent; experimental surface gated behind APL0004 and documented in docs/preview-apis.md.
  • .ignore entries for the now-bound MIDIEventListForEachEvent/Init/Add and the tvOS enums are correctly removed.
  • Thorough XML docs replacing "To be added." stubs; Happy Birthday test present. 🎂

Severity counts: 0 ❌ · 1 ⚠️ · 4 💡

Reviewed against origin/main (HEAD 01b1410). CI status not evaluated in this review.

Comment thread src/CoreMidi/MidiEventPacket.cs Outdated
Comment thread src/CoreFoundation/CFUuidBytes.cs
Comment thread src/CoreMidi/MidiServices.cs Outdated
Comment thread src/CoreMidi/MidiStructs.cs Outdated
Comment thread tests/monotouch-test/CoreMidi/MidiEndpointTest.cs Outdated
* Fix ArgumentOutOfRangeException constructor misuse (string was passed
  as paramName instead of message) in MidiEventPacket and MidiEventList.
* Add MIT license header and #nullable enable to CFUuidBytes.cs.
* Fix CreateInputPort <returns> doc and local alias (MidiPort, not
  MidiEndpoint).
* Remove redundant native @struct comment block in MidiStructs.cs.
* Use Assert.That/Is.EqualTo with correct argument order in
  MidiEndpointTest.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

rolfbjarne and others added 2 commits September 7, 2026 18:08
…ilot

# Conflicts:
#	src/CoreMidi/MidiServices.cs
#	tests/cecil-tests/Documentation.KnownFailures.txt
* Fix XML doc typos in MidiEventList.cs ("lis" -> "list", "packates" -> "packets").
* Make the static strongReferences field in MidiDriverInterface.cs readonly.
* Dispose MidiEventList instances in MidiEventListTest.cs using `using` statements.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Several correctness and API-quality issues were identified (null-handling, unsafe interop, malformed doc IDs, and PR-scope mismatch) that should be resolved before merging.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details
  • Files reviewed: 24/24 changed files
  • Comments generated: 10
  • Review effort level: Lite

Comment thread src/CoreMidi/MidiServices.cs
Comment thread src/CoreMidi/MidiServices.cs
Comment thread src/CoreMidi/MidiServices.cs
Comment thread tests/cecil-tests/Documentation.cs
Comment thread tests/monotouch-test/CoreMidi/MidiComprehensiveTest.cs
Comment thread docs/preview-apis.md
Comment thread src/CoreMidi/MidiEventList.cs
Comment thread tests/monotouch-test/CoreMidi/MidiComprehensiveTest.cs
Comment thread tests/monotouch-test/CoreMidi/MidiEventListTest.cs
Comment thread tests/xtro-sharpie/api-annotations-dotnet/macOS-CoreMIDI.ignore
@vs-mobiletools-engineering-service2

Copy link
Copy Markdown
Collaborator

✅ API diff for current PR / commit

NET (empty diffs)

✅ API diff vs stable

NET (empty diffs)

ℹ️ Generator diff

Generator Diff: vsdrops (html) vsdrops (raw diff) gist (raw diff) - Please review changes)

Pipeline on Agent
Hash: 18b055dc42ca66ec739400cf53cc57f9773c96ae [PR build]

@vs-mobiletools-engineering-service2

Copy link
Copy Markdown
Collaborator

🔥 [CI Build #18b055d] Test results 🔥

Test results

❌ Tests failed on VSTS: test results

0 tests crashed, 2 tests failed, 262 tests passed.

Failures

❌ cecil tests

1 tests failed, 0 tests passed.

Failed tests

  • Cecil-based tests: Failed (Execution failed with exit code 1)
    • Cecil.Tests.ApiAvailabilityTest.AttributeConsistency(builds/down...: Multiple failures or warnings in test:
  1. [FAIL] 17.0 <= 17.0 (Min) on 'CoreMidi.MidiEventPacket.GetSysexBytes(System.Byte, ou...
    * Cecil.Tests.ApiAvailabilityTest.AttributeConsistency(builds/down...: Multiple failures or warnings in test:
  2. [FAIL] 14.0 <= 14.0 (Min) on 'CoreMidi.MidiEventPacket.GetSysexBytes(System.Byte, ou...
    * Cecil.Tests.Documentation.VerifyEveryVisibleMemberIsDocumented: Found 1 undocumented APIs (not known failures) and 2 APIs that were marked as known failures but are now documented. If this is ...

Html Report (VSDrops) Download

❌ dotnettests tests (macOS)

1 tests failed, 0 tests passed.

Failed tests

  • DotNet tests: Failed (Execution failed with exit code 1)
    • Xamarin.Tests.AppSizeTest.CoreCLR_Interpreter_TrimmableStatic(Ma...: App size changed significantly (+30,036 bytes (29.3 KB = 0.0 MB) different > tolerance of +-10,240 bytes (10.0 KB = 0.0 MB)). Ex...
    • Xamarin.Tests.AppSizeTest.CoreCLR_Interpreter(MacOSX,"osx-arm64;...: App size changed significantly (+30,036 bytes (29.3 KB = 0.0 MB) different > tolerance of +-10,240 bytes (10.0 KB = 0.0 MB)). Ex...
    • Xamarin.Tests.AppSizeTest.CoreCLR_R2R(MacOSX,"osx-arm64;osx-x64"...: App size changed significantly (+122,196 bytes (119.3 KB = 0.1 MB) different > tolerance of +-10,240 bytes (10.0 KB = 0.0 MB)). ...

Html Report (VSDrops) Download

Successes

✅ assembly-processing: All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (iOS): All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (MacCatalyst): All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (Multiple platforms): All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (tvOS): All 1 tests passed. Html Report (VSDrops) Download
✅ framework: All 2 tests passed. Html Report (VSDrops) Download
✅ fsharp: All 4 tests passed. Html Report (VSDrops) Download
✅ generator: All 5 tests passed. Html Report (VSDrops) Download
✅ interdependent-binding-projects: All 4 tests passed. Html Report (VSDrops) Download
✅ introspection: All 7 tests passed. Html Report (VSDrops) Download
✅ linker (iOS): All 31 tests passed. Html Report (VSDrops) Download
✅ linker (MacCatalyst): All 31 tests passed. Html Report (VSDrops) Download
✅ linker (macOS): All 21 tests passed. Html Report (VSDrops) Download
✅ linker (tvOS): All 31 tests passed. Html Report (VSDrops) Download
✅ monotouch (iOS): All 25 tests passed. Html Report (VSDrops) Download
✅ monotouch (MacCatalyst): All 25 tests passed. Html Report (VSDrops) Download
✅ monotouch (macOS): All 20 tests passed. Html Report (VSDrops) Download
✅ monotouch (tvOS): All 25 tests passed. Html Report (VSDrops) Download
✅ msbuild: All 2 tests passed. Html Report (VSDrops) Download
✅ sharpie: All 1 tests passed. Html Report (VSDrops) Download
✅ windows: All 3 tests passed. Html Report (VSDrops) Download
✅ xcframework: All 4 tests passed. Html Report (VSDrops) Download
✅ xtro: All 1 tests passed. Html Report (VSDrops) Download

macOS tests

✅ Tests on macOS Sonoma (14): All 5 tests passed. Html Report (VSDrops) Download
✅ Tests on macOS Sequoia (15): All 5 tests passed. Html Report (VSDrops) Download
✅ Tests on macOS Tahoe (26): All 5 tests passed. Html Report (VSDrops) Download

Linux Build Verification

Linux build succeeded

Pipeline on Agent
Hash: 18b055dc42ca66ec739400cf53cc57f9773c96ae [PR build]

@vs-mobiletools-engineering-service2

Copy link
Copy Markdown
Collaborator

⚠️ AppSizeTest expected files changed ⚠️

The AppSizeTest detected changes in the expected app size files.

To update the expected files, add a comment with the following command:

/apply-gist https://gist.github.com/vs-mobiletools-engineering-service2/2f7c02969f90c7ad58ebbeb4d3050163
Updated files
  • MacOSX-CoreCLR-Interpreter-size.txt
  • MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt
  • MacOSX-CoreCLR-R2R-size.txt

Pipeline on Agent
Hash: 18b055dc42ca66ec739400cf53cc57f9773c96ae [PR build]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[AudioToolbox] Some AudioToolbox APIs not yet implemented in Xcode13 Old CoreMIDI APIs are missing

3 participants