gpt4 book ai didi

macos - 为什么这个简单的 CoreMIDI 程序不产生 MIDI 输出?

转载 作者:行者123 更新时间:2023-12-02 02:38:26 24 4
gpt4 key购买 nike

这是一个非常简单的 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 源。相反:

  1. 调用MIDIOutputPortCreate()创建输出端口
  2. 使用 MIDIGetNumberOfDestinations()MIDIGetDestination() 获取目的地列表并找到您感兴趣的目的地。
  3. 要将 MIDI 发送到一个目的地,请调用 MIDISend(outputPort, destination, packetList)

关于macos - 为什么这个简单的 CoreMIDI 程序不产生 MIDI 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10572747/

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