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 に答える