Отправка 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.