Я знаю, что 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;
}
}
}
}
Если вы не перезагрузили устройство и не изменили элемент управления, то ваша программа не будет знать состояние элемента управления, пока не получит сообщение.
Некоторые устройства могут иметь специфичные для поставщика команды для чтения текущего состояния элемента управления или для вывода всего состояния.
Краткий ответ — нет — вы не можете знать, пока не произойдет событие
Другие ответы верны, если у вас есть IN и OUT, подключенные к контроллеру, который позволяет опрос через сообщения SysEx (зависит от производителя)
Чтобы быть более полезным:
Состояние по умолчанию всех контроллеров (которые вы хотите использовать) должно быть выключено при запуске
например Pitch Bend = по центру, модуляция = ноль, Sustain = OFF и т. Д.
Это было состояние игры с 1980-х годов, так что это не было реальной проблемой
Если перед запуском приложения вы опустите ногу (на педаль), вы будете синхронизированы, как только вы отпустите ее.
Удачи