You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI(iOS):iOS14后MidiPort.Send已过时,求CoreMIDI发送MIDI替代方案

嘿,我刚好碰到过这个问题!在iOS 14及以后的版本里,Apple确实把MidiPort.Send给标记过时了,取而代之的是MidiOutputConnection这个新类,完全适配iOS 16,下面是具体怎么用:

解决方案:用MidiOutputConnection替代过时的MidiPort.Send

1. 创建MidiOutputConnection实例

首先,用你已经获取到的有效MidiEndpoint来创建这个新的连接对象——这是新API的核心入口:

// 假设你已经拿到了目标输出端点targetEndpoint
var midiOutputConn = new MidiOutputConnection(targetEndpoint);

如果需要同时发送到多个MIDI设备,还可以传入端点数组:

var multiConn = new MidiOutputConnection(new[] { endpoint1, endpoint2 });

2. 构造并发送MIDI消息

新API支持同步和异步两种发送方式,根据你的场景选择就行:

同步发送(适合单条或少量消息)

// 构造一个C4音符的Note On消息(状态字节0x90,音高0x3C,力度0x40)
byte[] noteOnData = new byte[] { 0x90, 0x3C, 0x40 };
var midiPacket = new MidiPacket(0, noteOnData); // 时间戳传0表示立即发送

// 执行发送并检查结果
MidiError sendResult = midiOutputConn.Send(new[] { midiPacket });
if (sendResult != MidiError.Ok)
{
    Console.WriteLine($"MIDI发送失败:{sendResult}");
    // 这里可以添加错误处理逻辑
}

异步发送(适合批量消息,避免阻塞主线程)

如果要发送多条消息,异步方式更友好:

var packetList = new MidiPacketList();
// 添加Note On和延迟100ms的Note Off消息
packetList.Add(new MidiPacket(0, new byte[] { 0x90, 0x3C, 0x40 }));
packetList.Add(new MidiPacket(100, new byte[] { 0x80, 0x3C, 0x00 }));

// 异步发送
await midiOutputConn.SendAsync(packetList);

3. 管理连接生命周期

不用的时候记得释放连接资源,避免内存泄漏:

midiOutputConn.Dispose();

几个关键提醒

  • 确认你的MidiEndpoint是输出端点:可以通过targetEndpoint.IsOutput属性检查,避免传成输入端点导致失败。
  • MidiOutputConnection支持iOS 14+、macOS 11+和Mac Catalyst,完全覆盖你的iOS 16场景,是Apple官方推荐的替代方案。
  • 如果你之前的代码是基于Xamarin.iOS的MIDI示例改的,直接替换成这个新类的逻辑就能解决API过时的问题。

内容的提问来源于stack exchange,提问作者Ayaphi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:31:14