Как прочитать начальное состояние MIDI Foot Controller?

Я знаю, что MIDI позволяет мне читать состояние MIDI Foot Controller, перехватывая MIDI-сообщение, указывающее на изменение управления. Но что, если пользователь еще не коснулся / не изменил элемент управления? Я все еще могу прочитать состояние / значение? Каков был бы способ сделать это?

Это мой код для перехвата Midi-сообщений с использованием 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;
            }
        }
    }
}

2 ответа

Решение

Если вы не произвели сброс устройства и не изменили элемент управления, то ваша программа не будет знать состояние элемента управления до тех пор, пока не получит сообщение.

Некоторые устройства могут иметь специфичные для поставщика команды для чтения текущего состояния элемента управления или для вывода всего состояния.

Краткий ответ - нет - вы не можете знать, пока не произойдет событие

Другие ответы верны, если у вас есть IN и OUT, подключенные к контроллеру, который позволяет опрос через сообщения SysEx (зависит от производителя)

Чтобы быть более полезным: по умолчанию состояние всех контроллеров (которые вы хотите использовать) должно быть ВЫКЛЮЧЕНО при запуске, например, Pitch Bend = по центру, Modulation = ZERO, Sustain = OFF и т. Д.

Это состояние игры с 1980-х годов, так что это не является реальной проблемой. Если вы нажмете ногу (на педаль) до того, как запустите свое приложение, вы будете синхронизированы, как только вы отпустите его.

Удачи

Другие вопросы по тегам