from itertools import groupby, chain
from random import shuffle, seed

def shuffled(seq):
    shuffle(seq)
    return seq

def permute_inside_and_across_tracks(seq):
    seq_sorted = sorted(seq, key=lambda x: x[5])
    tracks = [list(g) for _, g in groupby(seq_sorted, key=lambda x: x[5])]  # 5 is program
    return list(chain.from_iterable(shuffled(t) for t in shuffled(tracks)))

# (PitchDrum, Position, Bar, Velocity, Duration, Program, Tempo, TimeSignature)
seq = [
    # Program 0
    (60, 0, 0, 90,  96, 0, 120, 16),
    (64, 48,0, 88,  96, 0, 120, 16),
    (67, 96,0, 92,  96, 0, 120, 16),

    # Program 32
    (40, 0, 0, 80, 192, 32, 120, 16),
    (43, 0, 1, 78, 192, 32, 120, 16),

    # Program 40
    (72, 24,0, 85,  72, 40, 120, 16),
    (74, 72,0, 83,  72, 40, 120, 16),
    (76, 24,1, 86,  72, 40, 120, 16),
]

# seed(42)

inside_track_permuted_and_track_permuted = permute_inside_and_across_tracks(seq)

print("原始 seq：")
for e in seq:
    print(e)
print("\n打乱后的 seq：")
for e in inside_track_permuted_and_track_permuted:
    print(e)
