这是一个非常简单的 CoreMIDI OS X 应用程序,用于发送 MIDI 数据。问题是它不起作用。它编译良好,并且运行。它不会报告任何错误,也不会崩溃。创建的源在 MIDI 监视器中可见。但是,没有 MIDI 数据输出。
有人可以让我知道我在这里做错了什么吗?
#include <CoreMIDI/CoreMIDI.h>
int main(int argc, char *args[])
{
MIDIClientRef theMidiClient;
MIDIEndpointRef midiOut;
MIDIPortRef outPort;
char pktBuffer[1024];
MIDIPacketList* pktList = (MIDIPacketList*) pktBuffer;
MIDIPacket *pkt;
Byte midiDataToSend[] = {0x91, 0x3c, 0x40};
int i;
MIDIClientCreate(CFSTR("Magical MIDI"), NULL, NULL,
&theMidiClient);
MIDISourceCreate(theMidiClient, CFSTR("Magical MIDI Source"),
&midiOut);
MIDIOutputPortCreate(theMidiClient, CFSTR("Magical MIDI Out Port"),
&outPort);
pkt = MIDIPacketListInit(pktList);
pkt = MIDIPacketListAdd(pktList, 1024, pkt, 0, 3, midiDataToSend);
for (i = 0; i < 100; i++) {
if (pkt == NULL || MIDISend(outPort, midiOut, pktList)) {
printf("failed to send the midi.\n");
} else {
printf("sent!\n");
}
sleep(1);
}
return 0;
}
最佳答案
您正在调用MIDISourceCreate
来创建虚拟MIDI源。
这意味着您的源将出现在其他应用程序的 MIDI 设置 UI 中,并且这些应用程序可以选择是否收听您的源。您的 MIDI 不会被发送到任何物理 MIDI 端口,除非其他应用程序碰巧将其传送到那里。这也意味着您的应用程序无法选择将 MIDI 发送到何处。我假设这就是您想要的。
The documentation for MIDISourceCreate说:
After creating a virtual source, use MIDIReceived to transmit MIDI messages from your virtual source to any clients connected to the virtual source.
所以,做两件事:
- 删除创建输出端口的代码。你不需要它。
- 将
MIDISend(outPort, midiOut, pktList)
更改为:MIDIReceived(midiOut, pktlist)
。
这应该可以解决你的问题。
那么输出端口有什么用呢?如果您想将 MIDI 数据定向到特定目的地(可能是物理 MIDI 端口),您就不会创建虚拟 MIDI 源。相反:
- 调用
MIDIOutputPortCreate()
创建输出端口 - 使用
MIDIGetNumberOfDestinations()
和MIDIGetDestination()
获取目的地列表并找到您感兴趣的目的地。 - 要将 MIDI 发送到一个目的地,请调用
MIDISend(outputPort, destination, packetList)
。
关于macos - 为什么这个简单的 CoreMIDI 程序不产生 MIDI 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10572747/