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

How to read the initial state of a MIDI Foot Controller?

本文关键字:脚部 控制器 初始状态 MIDI 何读取 读取      更新时间:2023-10-16

我知道MIDI允许我通过捕捉指示控制更改的MIDI消息来读取MIDI脚部控制器的状态。但是,如果用户还没有触摸/更改控件,该怎么办?我还能读取状态/值吗?怎么做?

这是我使用OSX CoreMDI 捕获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;
            }
        }
    }
}

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

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

简短的答案是-否-在事件发生之前,您无法知道

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

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

自20世纪80年代以来,这一直是比赛的状态,所以这不是一个真正的问题如果你在启动应用程序之前(踩在踏板上),你将在发布的那一刻同步

祝好运