Как прочитать начальное состояние 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-х годов, так что это не является реальной проблемой. Если вы нажмете ногу (на педаль) до того, как запустите свое приложение, вы будете синхронизированы, как только вы отпустите его.
Удачи