我送使用MIDIPacketListAdd MIDI数据包的字符串。 我想在播放过程中动态地更改数据包,所以我使用的NSTimer预定时间的包应该出去之前添加的每个数据包。
代码工作完美,当前数据包的地址是正确更新,我已经验证了所有的数据是正确的。 然而,当MIDIPacketListAdd从计时器调用时不发送MIDI数据。 我启动定时器,以确保需要播放之前,他们的数据包被发送到MIDIPacketListAdd前添加前两个包。
我很不解。 有什么建议么?
谢谢你,汤姆·杰弗里斯
我送使用MIDIPacketListAdd MIDI数据包的字符串。 我想在播放过程中动态地更改数据包,所以我使用的NSTimer预定时间的包应该出去之前添加的每个数据包。
代码工作完美,当前数据包的地址是正确更新,我已经验证了所有的数据是正确的。 然而,当MIDIPacketListAdd从计时器调用时不发送MIDI数据。 我启动定时器,以确保需要播放之前,他们的数据包被发送到MIDIPacketListAdd前添加前两个包。
我很不解。 有什么建议么?
谢谢你,汤姆·杰弗里斯
您的描述正是我怎么把我的MIDI数据为好,并能正常工作。 也许你可以发布你的源代码,不,这是一个有点难以猜测是错误的。
此外,为了测试,试试你的时间戳设置为零,只是为了确保您能够发送MIDI,在这之后,你可以把你的时间戳早在单独调试。
在替代来源,这里是发送MIDI一个简单的方法,而我呢,从一个NSTimer调用它,它基于一些苹果的例子,它的作品。 注意“outputPort”是你应该尝试与你的客户参考一起发送MIDI之前某处所创建内容(我假设你已经这样做了)
OSStatus s;
MIDIClientRef client;
MIDIPortRef outputPort;
s = MIDIClientCreate((CFStringRef)@"My Test MIDI Client", MyMIDINotifyProc, self, &client);
s = MIDIOutputPortCreate(client, (CFStringRef)@"My Test MIDI Output Port", &outputPort);
一旦你拥有了这些,你可以发送MIDI
- (void) MySendMidi:(const UInt8*)data size:(UInt32)bsize
{
NSLog(@"%s(%u bytes to core MIDI)", __func__, unsigned(bsize));
assert(bsize < 65536);
Byte packetBuffer[bsize+100];
MIDIPacketList *packetList = (MIDIPacketList*)packetBuffer;
MIDIPacket *packet = MIDIPacketListInit(packetList);
packet = MIDIPacketListAdd(packetList, sizeof(packetBuffer), packet, 0, bsize, data);
// Send it to every destination in the system...
for (ItemCount index = 0; index < MIDIGetNumberOfDestinations(); ++index)
{
MIDIEndpointRef outputEndpoint = MIDIGetDestination(index);
if (outputEndpoint)
{
// Send it
OSStatus s = MIDISend(outputPort, outputEndpoint, packetList);
}
}
}