gpt4 book ai didi

cocoa - MIDIPacketList,numPackets 始终为 1

转载 作者:行者123 更新时间:2023-12-03 16:11:07 24 4
gpt4 key购买 nike

我正在 iPad 上处理 Midi,一切工作正常,我可以记录传入的所有内容,并且一切都按预期工作。然而,在尝试接收长消息(即 Sysex)时,我只能收到一个最大 256 字节的数据包,之后什么也没有。

使用Apple提供的代码:

MIDIPacket *packet = &packetList->packet[0];
for (int i = 0; i > packetList->numPackets; ++i) {
// ...
packet = MIDIPacketNext (packet);
}

packetList->numPackets 始终为 1。收到第一条消息后,不会调用其他回调方法,直到发送"new"sysex 消息。我不认为我的 MIDI 处理方法会使用完整的 packetList(可能是任何大小)来调用。我本以为我会以流的形式接收数据。这是正确的吗?

经过深入研究,我唯一能找到的是:http://lists.apple.com/archives/coreaudio-api/2010/May/msg00189.html ,它提到了完全相同的事情,但没有多大帮助。我知道我可能需要实现缓冲,但我什至看不到前 256 个字节之后的任何内容,所以我不知道从哪里开始。

最佳答案

我的直觉是系统要么将整个 sysex 消息塞进一个数据包,要么将其分解为多个数据包。根据CoreMidi根据文档,MIDIPacket 结构的 data 字段有一些有趣的属性:

A variable-length stream of MIDI messages. Running status is not allowed. In the case of system-exclusive messages, a packet may only contain a single message, or portion of one, with no other MIDI events.

The MIDI messages in the packet must always be complete, except for system-exclusive.

(This is declared to be 256 bytes in length so clients don't have to create custom data structures in simple situations.)

所以基本上,您应该查看 MIDIPacket 声明的 length 字段,看看它是否大于 256。根据规范,256 字节只是标准分配,但如果需要,该数组可以容纳更多。您可能会发现整个消息已被塞入该数组中。

否则,系统似乎将 sysex 消息分成多个数据包。由于规范规定不允许运行状态,因此它必须发送多个数据包,每个数据包都有一个前导 0xF0 字节。然后,您需要创建自己的内部缓冲区来存储这些消息的内容,根据需要剥离状态字节或 header ,并将数据附加到缓冲区,直到读取表示 0xF7 字节序列的结尾。

关于cocoa - MIDIPacketList,numPackets 始终为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4546025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com