Как прочитать начальное состояние 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;
}
}
}
}

1

Решение

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

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

3

Другие решения

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

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

Чтобы быть более полезным:
Состояние по умолчанию всех контроллеров (которые вы хотите использовать) должно быть выключено при запуске
например Pitch Bend = по центру, модуляция = ноль, Sustain = OFF и т. Д.

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

Удачи

0