如何读取MIDI脚踏控制器的初始状态?

时间:2014-11-04 12:41:24

标签: c++ midi coremidi

我知道MIDI允许我通过捕捉指示控制变化的MIDI信息来读取MIDI脚踏控制器的状态。但是如果用户没有触摸/更改控件呢?我还能读取状态/值吗?这样做的方法是什么?

这是我使用OSX CoreMIDI捕获Midi消息的代码

void initMidi()
{
    MIDIClientRef   midiClient;
    MIDIPortRef     inputPort;
    OSStatus        status;
    MIDIEndpointRef src;

    status = MIDIClientCreate(CFSTR("testing"), NULL, NULL, &midiClient);
    if (status != noErr)
        NSLog(@"Error creating MIDI client: %d", status);

    status = MIDIInputPortCreate(midiClient, CFSTR("Input"), midiInputCallback, NULL, &inputPort);
    if (status != noErr)
        NSLog(@"Error creating MIDI input port: %d", status);

    ItemCount numOfDevices = MIDIGetNumberOfDevices();

    // just try to connect to every device
    for (ItemCount i = 0; i < numOfDevices; i++) {
        src = MIDIGetSource(i);
        status = MIDIPortConnectSource(inputPort, src, NULL);
    }
}

void midiInputCallback(const MIDIPacketList *list,
    void *procRef,
    void *srcRef)
{
    for (UInt32 i = 0; i < list->numPackets; i++) {
        const MIDIPacket *packet = &list->packet[i];

        for (UInt16 j = 0, size = 0; j < packet->length; j += size) {
            UInt8 status = packet->data[j];

            if (status <  0xC0)  size = 3;
            else if (status <  0xE0)  size = 2;
            else if (status <  0xF0)  size = 3;
            else if (status <  0xF3)  size = 3;
            else if (status == 0xF3)  size = 2;
            else                      size = 1;

            switch (status & 0xF0) {
            case 0xb0:
                NSLog(@"MIDI Control Changed: %d %d", packet->data[j + 1], packet->data[j + 2]);
                break;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

如果您没有重置设备,并且没有更改控件,那么您的程序在收到消息之前不会知道控件的状态。

某些设备可能具有特定于供应商的命令,用于读取控件的当前状态或转储整个状态。

答案 1 :(得分:0)

简短的回答是 - 不 - 在事件发生之前你无法知道

其他答案是正确的,如果您将IN和OUT连接到允许通过SysEx消息进行询问的控制器(特定于制造商)

更有帮助: 所有控制器(您想要使用)的默认状态应该在启动时为OFF 例如弯音度=居中,调制=零,维持=关闭等...

这是自1980年以来的状态,所以这不是一个真正的问题 如果您在开始使用应用程序之前将脚放下(踏板),则在发布应用程序时将保持同步状态

祝你好运