Отправка MIDI с помощью MIDISendEventList () в C / C ++

Я работал над переносом старой реализации отправки Core MIDI для отправки сообщений MIDI 1.0 с использованием новых методов API списка событий MIDI с поддержкой UMP от Apple.

Я выяснил код, который работает и должен выводить сообщения MIDI clock, но когда я отправляю его с MIDISendEventList(...)Я не вижу ничего, что выводится из моего интерфейса MIDI; также нет ошибки, возвращаемой этим методом, чтобы указать, в чем проблема.

Вот код, который я использую:

      const ByteCount clockMessageSize = 1;
const UInt32 clockMessage[clockMessageSize] = { (UInt32)0xF8 };    // MIDI clock tick 
const MIDITimeStamp timeStamp = mach_absolute_time();
MIDIEventList clockMessageEventList = {};
MIDIEventPacket* clockMessageEventListEndPacket = nullptr;

clockMessageEventListEndPacket = MIDIEventListInit(&clockMessageEventList, kMIDIProtocol_1_0);
clockMessageEventListEndPacket = MIDIEventListAdd(&clockMessageEventList, sizeof(MIDIEventList::packet), clockMessageEventListEndPacket, timeStamp, clockMessageSize, clockMessage);
                
for (NSUInteger endpointRefIndex = 0; endpointRefIndex < endPointRefsCount; ++endpointRefIndex) {
    MIDIObjectRef destinationEndpoint = endPointRefs[endpointRefIndex];
    OSStatus midiSendError = MIDISendEventList(outputPortRef, destinationEndpoint, &clockMessageEventList);
                    
    if (midiSendError != noErr) {
        printf("MIDISendEventList error: %i", (int)midiSendError);
    }
 }

Проверка clockMessageEventList.packet после настройки, но до отправки показывает:

      (248, 0, 0, [... all zeros to index 63]) 

Кто-нибудь знает, где я ошибаюсь?

1 ответ

Благодаря небольшому дополнительному указанию, предоставленному /questions/63066908/kak-vyi-sozdaete-midieventpacket-s-kanalom-ispolzuya-coremidi/65744579#65744579 , мне удалось взломать это.

По какой-то причине слово, созданное для сообщения MIDI-синхронизации, должно быть отформатировано немного иначе: первый байт должен быть0x10, а второй байт — это сообщение MIDI-синхронизации:

      const ByteCount clockMessageSize = 1;
const UInt32 clockMessage[clockMessageSize] = { 0x10000000 | ((UInt32)message << 16) };
const MIDITimeStamp timeStamp = mach_absolute_time();
MIDIEventList clockMessageEventList = {};
MIDIEventPacket* clockMessageEventListEndPacket = nullptr;

clockMessageEventListEndPacket = MIDIEventListInit(&clockMessageEventList, kMIDIProtocol_1_0);
clockMessageEventListEndPacket = MIDIEventListAdd(&clockMessageEventList, sizeof(MIDIEventList::packet), clockMessageEventListEndPacket, timeStamp, clockMessageSize, clockMessage);

Если кто-нибудь знает, почему это так, напишите, пожалуйста! Но вот, MIDI-синхронизация через MIDIEventList.

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