我正在尝试发送一个MIDIPacketList,其中包含两个描述与x-y样式控制器相关的控制器位置变化消息的数据包。
我试图实现的功能采用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()中发送两条消息。我似乎无法弄清楚这里的问题是什么!这里的任何人都有这方面的经验,或者我是否完全以错误的方式解决这个问题?
答案 0 :(得分: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中找到了here
的代码