1

我正在尝试发送一个包含两个数据包的 MIDIPacketList,这些数据包描述了与 xy 样式控制器相关的控制器位置更改消息。

我试图实现的功能采用 x 和 y 位置,然后创建数据包并将它们发送到选定的目标设备,如下所示:

- (void)matrixCtrlSetPosX:(int)posX PosY:()posY {

    MIDIPacketList packetList;
    packetList.numPackets = 2;

    packetList.packet[0].length = 3;
    packetList.packet[0].data[0] = 0xB0;        // status: controller change
    packetList.packet[0].data[1] = 0x32;        // controller number 50
    packetList.packet[0].data[2] = (Byte)posX;  // value (x position)
    packetList.packet[0].timeStamp = 0;

    packetList.packet[1].length = 3;
    packetList.packet[1].data[0] = 0xB0;        // status: controller change
    packetList.packet[1].data[1] = 0x33;        // controller number 51
    packetList.packet[1].data[2] = (Byte)posY;  // value (y position)
    packetList.packet[1].timeStamp = 0;

    CheckError(MIDISend(_outputPort, _destinationEndpoint, &packetList), "Couldn't send MIDI packet list");
}

我遇到的问题是程序似乎只发送了第一个数据包。

我已经尝试将输出分成两个单独的 MIDIPacketLists 和两个对 MIDISend() 进行两次调用,这确实有效,但我确信在构建 midi 数据包列表时一定有一些微不足道的东西,以便两条消息可以一次调用 MIDISend() 发送。我似乎无法弄清楚这里的问题是什么!这里的任何人都有这样做的经验,还是我完全以错误的方式去做?

4

1 回答 1

4

仅声明 MIDIPacketList 不会分配内存或设置结构。有一个将数据包添加到列表的过程。这是一个快速而肮脏的例子:

- (void)matrixCtrlSetPosX:(int)posX PosY:(int)posY {
    MIDITimeStamp timestamp = 0;
    const ByteCount MESSAGELENGTH = 6;
    Byte buffer[1024];             // storage space for MIDI Packets
    MIDIPacketList *packetlist = (MIDIPacketList*)buffer;
    MIDIPacket *currentpacket = MIDIPacketListInit(packetlist);
    Byte msgs[MESSAGELENGTH] = {0xB0, 0x32, (Byte)posX, 0xB0, 0x33, (Byte)posY};
    currentpacket = MIDIPacketListAdd(packetlist, sizeof(buffer),
                                      currentpacket, timestamp, MESSAGELENGTH, msgs);

    CheckError(MIDISend(_outputPort, _destinationEndpoint, packetlist), "Couldn't send MIDI packet list");
}

我从这里找到的 testout.c 改编了这段代码

于 2013-03-08T01:17:27.830 回答