2

我的 python 程序从 C 库接收 MIDI 数据。有时数据会如下所示:

[[[[240,0,1,116]]],[[[3,100,8,1]]],[[[107,247,0,0]]]]

有时它会包括这样的时间戳:

[[[[240,0,1,116],26738]],[[[3,100,8,1],26738]],[[[107,247,0,0],26738]]]

我需要字节数组中的数据,并丢弃时间戳值。我为此编写的代码是:

        def convertMidiSysex(data):    
            while isinstance(data[0][0], list):
                out = []
                for index, value in enumerate(data):
                    out = out+value
                data = out

            out = array.array('B')
            for i in range(len(data)):
                if isinstance(data[i], list):
                    for j in range(len(data[i])):
                        out.append(data[i][j])
                        if out[-1] == 247:  # 0xF7 is marker to end sysex message
                            return out

我情不自禁地感觉到我正在艰难地做这件事。有更好的方法吗?

4

2 回答 2

4

假设深度始终一致:

from itertools import takewhile

def convertMidiSysex(data):
    values = takewhile(lambda v: v != 247,
                       (a for x in data for a in x[0][0]))
    out = array.array('B', values)
    out.append(247)
    return out

例子:

>>> convertMidiSysex([[[[240,0,1,116]]],[[[3,100,8,1]]],[[[107,247,0,0]]]])
array('B', [240, 0, 1, 116, 3, 100, 8, 1, 107, 247])
>>> convertMidiSysex([[[[240,0,1,116],26738]],[[[3,100,8,1],26738]],[[[107,247,0,0],26738]]])
array('B', [240, 0, 1, 116, 3, 100, 8, 1, 107, 247])
于 2012-06-05T17:39:24.700 回答
1

一种更清洁的方式来获得你现在拥有的东西:

# the entry below mixes timestamped and non-timestamped inputs
entry = [[[[240,0,1,116]]],    [[[3,100,8,1]]],
         [[[107,247,0,0]]],    [[[240,0,1,116],26738]],
         [[[3,100,8,1],26738]],[[[107,247,0,0],26738]]]

data = array.array('B')
for sublist in entry:
    for item in sublist[0][0]:
        data.append(item)
        if item == 247:
            break
于 2012-06-05T18:02:20.830 回答