CoreMIDI适用于iOS和MacOS,但不适用于PC或Line6 Mobilizer

时间:2013-01-07 17:55:49

标签: ios midi coremidi

我在我的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");
}

1 个答案:

答案 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设备,并且它有效。