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

标签 macos midi core-foundation coremidi

这是一个非常简单的 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/

相关文章:

r - 无法安装cubature软件包(配置: error: C compiler cannot create executables)

java - 如何控制 MIDI channel 的音量

swift - 为 xcode 项目安装 webMIDIKit

macos - 关于CFLocaleCopyCurrent API返回值不正确

ios - swift 5.1 : How can I pass NULL as an argument?

arrays - 如何正确调用 CFBinaryHeapGetValues() 并在 Swift 中解析生成的 C 数组?

python xgboost 在 mac 安装

macos - 在Mac上设置Docker:无法通过localhost连接

objective-c - 被告知 NSStatusItem 何时被隐藏

language-agnostic - 为什么 Note Off 事件有一个速度参数?