我在我的iOS应用程序中使用PGMidi进行MIDI实现。它很棒。但是,我收到两份报告称在某些情况下邮件无法通过。第一个是通过PC上的Ableton Live进行无线连接。我知道它在带有Ableton的Mac上无线工作正常。另一种情况是使用Line6 Mobilizer II。设备显示在MIDI端口中,但不会注册任何MIDI信息。
我假设我的数据出现了问题,导致PC无法识别?任何想法可能是什么?
这是基本的MIDI发送内容(大部分直接来自PGMidi)
-(void)noteOn:(NSUInteger)voice note:(NSUInteger)note{
if(voice == 1){
UInt8 status = 144 + (UInt8)chordMIDIChannel;
const UInt8 noteOn[] = { status, (UInt8)note, chordMIDIVelocity };
if(chordMIDIDest)[chordMIDIDest sendBytes:noteOn size:sizeof(noteOn)];
else [midi virtualPortSend:noteOn size:sizeof(noteOn)];
}else{
UInt8 status = 144 + (UInt8)leadMIDIChannel;
const UInt8 noteOn[] = { status, (UInt8)note, leadMIDIVelocity };
if(leadMIDIDest)[leadMIDIDest sendBytes:noteOn size:sizeof(noteOn)];
else[midi virtualPortSend:noteOn size:sizeof(noteOn)];
}
}
和PGMidiDestination发送字节:
- (void) sendBytes:(const UInt8*)bytes size:(UInt32)size
{
assert(size < 65536);
Byte packetBuffer[size+100];
MIDIPacketList *packetList = (MIDIPacketList*)packetBuffer;
MIDIPacket *packet = MIDIPacketListInit(packetList);
packet = MIDIPacketListAdd(packetList, sizeof(packetBuffer), packet, 0, size, bytes);
[self sendPacketList:packetList];
}
- (void) sendPacketList:(const MIDIPacketList *)packetList
{
// Send it
OSStatus s = MIDISend(midi.outputPort, endpoint, packetList);
NSLogError(s, @"Sending MIDI");
}
答案 0 :(得分:0)
通常代码看起来是正确的,但我怀疑你正在使用你正在使用的端点。
一个简单的测试就是简单地将数据发送到系统上的每个端点,看看会发生什么,这样你就会知道它是你的数据还是你的端点配置。
替换(临时)sendPacketList函数中的代码,并查看是否在这些目的地获取数据:
// Send it everywhere
for (ItemCount index = 0; index < MIDIGetNumberOfDestinations(); ++index)
{
MIDIEndpointRef outputEndpoint = MIDIGetDestination(index);
if (outputEndpoint)
{
OSStatus s = MIDISend(midi.outputPort, outputEndpoint, packetList);
// check s for errors
}
}
我已经使用上面的代码发送到MIDI网络目的地以及MIDI Mobilizer II设备,并且它有效。