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

流过昼夜 提交于 2021-02-10 19:43:17

问题


I know MIDI allows me to read the state of a MIDI Foot Controller by catching a MIDI Message indicating a Control Change. But what if the user has not touched/changed the control yet? Am I still able to read the state/value? What would be the way to do that?

This is my code for catching Midi Messages using OSX CoreMIDI

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;
            }
        }
    }
}

回答1:


If you did not reset the device, and did not change a control, then your program does not know the state of a control until it receives a message.

Some devices might have vendor-specific commands to read the current state of a control, or to dump the entire state.




回答2:


The short answer is - No - you cannot know until an event occurs

Other answers are correct, if you have IN and OUT connected to a controller that allows interrogation through SysEx messages (Manufacturer specific)

To be more helpful: The default state of all controllers (you are wanting to use) should be OFF on startup e.g. Pitch Bend = centered, Modulation = ZERO, Sustain = OFF etc…

This has been the state of play since 1980's so it is not been a real problem If you have your foot down (on a pedal) before you start your app you will be in sync the moment you release it

Good luck



来源:https://stackoverflow.com/questions/26735414/how-to-read-the-initial-state-of-a-midi-foot-controller

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!