在 iOS 中解析 Midi 数据包

Posted

技术标签:

【中文标题】在 iOS 中解析 Midi 数据包【英文标题】:Parse Midi Packet in iOS 【发布时间】:2012-01-02 01:22:43 【问题描述】:

我很难解析 Midi 数据包。有时它的 3 个字节然后它可以是一个流上的 155 个字节。 我怎样才能遍历大量数据包并得到我需要的东西? 说“b0”它只有 12 个字节数据包的 3 个字节,我只想拆分“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
    

【问题讨论】:

我对你的问题和代码感到困惑——你能展示一些 MIDI 数据包以及你想对它们进行哪些操作吗? 不要使用字符串匹配来解析二进制数据。使用前请确保您完全了解 MIDI 数据格式。 我基本上会收到这样的数据包:18字节:[b0,0c,0e,b0,2c,05,b0,0c,0f,b0,2c,02,b0,0c,0d ,b0,2c,02] 如何将它们分成 3 个字节然后发送到方法? 并非所有的 MIDI 消息都是 3 个字节长!您真的应该更深入地研究协议。 你用的是什么库?它应该提供更高级别的控制,例如 midi 事件类型和 midi 事件值。必须有这样的功能。 【参考方案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。

【讨论】:

【参考方案2】:

另一个有用的资源:@​​987654321@

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

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

【讨论】:

“除此之外,解析 MIDI 只是遍历字节并相应地处理消息。” —— 不开玩笑! @Olivier'Ölbaum'Scherler 哈,是的,我知道,这听起来比实际更容易。但是一旦你习惯了 MIDI,它就不会那么糟糕了,恕我直言。 :) 是的,这会很有趣。首先,您意识到每个消息可以有多个数据包,然后可以有运行状态,然后是交错的系统消息。 :)

以上是关于在 iOS 中解析 Midi 数据包的主要内容,如果未能解决你的问题,请参考以下文章

Midi Sample Dump Standard的数据包校验和计算

在 Anaconda 中安装 python-midi 包

iOS 数据包长度

如何解析python库中的数据包? [关闭]

BLE MIDIMIDI 文件速度设置识别 ( 查找 midi 文件中速度相关的二进制数据 | FF 51 03 速度设置指令 )

BLE MIDIMIDI 文件速度设置识别 ( 查找 midi 文件中速度相关的二进制数据 | FF 51 03 速度设置指令 )