在iOS中解析Midi数据包

时间:2012-01-02 01:22:44

标签: objective-c ios midi coremidi

我很难解析Midi Packets。有时它的3个字节,然后它在一个流上可以是155个字节。 如何迭代大量数据包并获得我需要的内容? 比如说“b0”只有3个字节的12字节数据包,我只想分割“b0”及其后续字节: [b02c2c]然后在同一个数据包中的其他人[b02c2d]或[f0 ....] ......

继续我正在做的事情,让我头疼......

NSString *StringFromPacket(const MIDIPacket *packet,id self)
{
    NSMutableString * result = [[NSMutableString alloc] init];

    for (int i = 0; i < packet->length; i++)
    {   
        NSString *s = [NSString stringWithFormat:@"%02x",packet->data[i]];

        for (NSString *line in [s componentsSeparatedByString:@"b0"])
        {
            // This appends to string but b0 disappears and only get the following 2 bytes
            // Along with the others like f0,a0,90. I would like to filter without losing b0
            [result appendFormat:line];
        }
    }

    [self controlEvent:result];
}


-(void)controlEvent:(NSString *)line
{
    if (line == @"b02c2c")
    {
        //Do Something
    }
}

2 个答案:

答案 0 :(得分:1)

我没有使用iPhone编程的经验,但我快速浏览了iOS MIDI API。

在MIDI中有各种MIDI事件(音符,音符关闭,控制器更改等)。每个事件可以有不同的字节数。从第一个字节开始,您可以使用事件类型和您知道消息长度的类型(请参阅http://www.midi.org/techspecs/midimessages.php处的MIDI参考)唯一的例外是系统专用MIDI消息(有关详细信息,请参阅MIDi参考和可以发送的特定设备的参考和收到系统专属消息)

似乎MIDIPacket可以包含可变数量的MIDI消息。所以你可以查看第一个字节。假设您在MIDI通道1上收到了Note On midi事件。在第一个字节中,您将获得值80(十六进制)。从文档中可以看到Note On Event有两个数据字节。下一个字节是MIDI音符编号(您可以看到MIDI音符编号列表,例如在http://midikits.net23.net/midi_analyser/midi_note_numbers_for_octaves.htm上)。下一个音符编号是速度(键按下的速度有多快(或几乎没有))。然后你可以重复这个程序。

请注意,对于某些消息,如Pitch Wheel Change,两个数据字节带有一个值(MSB和LSB)。

如果知道当字节以0开头时,它可能是有用的,它是MIDI数据字节。 MIDI事件的第一个字节中有1个。

答案 1 :(得分:1)

另一个有用的资源:http://home.roadrunner.com/~jgglatt

具体来说,您可能需要查看有关MIDI协议消息的部分:http://home.roadrunner.com/~jgglatt/tech/midispec.htm

除此之外,解析MIDI只需要遍历字节并相应地处理消息。