Я проанализировал миди-файл и успешно получил словарь нот, разбитых по инструментам. Сокращенный пример этого note_dict
ниже, усеченный для целей этого вопроса.
Моя конечная цель состоит в том, чтобы иметь вложенный словарь, который предоставляет мне название дорожки, затем каждую возможную ноту в качестве ключа, а затем список всех возможных следующих нот в качестве значений. Цель состоит в том, чтобы использовать это в качестве цепи Маркова в Foxdot, интерфейсе Python для музыки. поколение.
Это должно выглядеть примерно так:
{'track1': {note: [note1, note2, note3], note2: [note1, note2, note3]}, 'track2': {note: [note1, note2, note3], note2: [note1, note2, note3]}
Вот пример того, что у меня есть:
import itertools
def pairwise(iterable):
a, b = itertools.tee(iterable)
next(b, None)
return list(zip(a, b))
note_dict = {'Vocal': [-2, -2, -1, -2], 'Guitar': [1, 1, 4, 1, -2, 1]}
note_dict_updated = { track: [{ n for n in notes }, pairwise(notes), notes] for track, notes in note_dict.items() }
print(note_dict_updated)
Это дает мне следующее, где первый набор — это все отдельные заметки, список кортежей — это пара (note, next note)
, а последний список — это просто необработанный список заметок по порядку.
{'Vocal': [{-2, -1}, [(-2, -2), (-2, -1), (-1, -2)], [-2, -2, -1, -2]], 'Guitar': [{1, 4, -2}, [(1, 1), (1, 4), (4, 1), (1, -2), (-2, 1)], [1, 1, 4, 1, -2, 1]]}
Я бы хотел, чтобы элементы наборов действовали как ключи, и когда первый элемент кортежа соответствует элементу набора, он добавляется в список значений, связанных с ключом.
Мой желаемый конечный результат, основанный на note_dict
выше:
{'Vocal': {-2: [-2, -1], -1: [-2]}, 'Guitar': {1: [1, 4, -2], 4: [1], -2: [1]}}
При этом я не зациклен на методе, где мне нужно работать с note_dict_updated
. Если есть более разумный способ перейти от note_dict
к желаемому конечному результату, я был бы рад услышать.
edit: я немного обновил свой вопрос. первый ответ работал для моего первоначального примера, но я считаю, что есть проблемы, когда список заметок в каждом значении перекрывается. Надеюсь, мой обновленный желаемый конечный результат будет более полезным.