Существует более чем один способ сделать это в music21, так что это только один простой способ. Обратите внимание, что durational значение выражается как число с плавающей точкой, например, что четверть нота равна 1,0, половина ноты равна 2.0 и т.д .:
import music21
from music21 import *
piece = converter.parse("full_path_to_piece.midi")
all_parts = []
for part in piece.parts:
part_tuples = []
for event in part:
for y, in event.contextSites():
if y[0] is part:
offset = y[1]
if getattr(event, 'isNote', None) and event.isNote:
part_tuples.append((event.nameWithOctave, event.quarterLength, offset))
if getattr(event, 'isRest', None) and event.isRest:
part_tuples.append(('Rest', event.quarterLength, offset))
all_parts.append(part_tuples)
Альтернативным решением было бы использовать Vis-структуру, которая обращается к музыке файлы в символической записи через music21 и сохраняет информацию в pandas данных. Вы можете сделать это:
pip install vis-framework
Другим решением было бы использовать Humdrum вместо music21.
большое спасибо! Под «позицией примечания» я имел в виду временную метку заметки, чтобы я мог восстановить файл midi после манипулирования массивами. Это также часть поля событий? Кроме того, что вы имели в виду под «включать обнаружение остатков»? – ytrewq
По метке времени вы имеете в виду временную позицию с начала фрагмента? В music21 parlance (и языке VIS) это часто называют «смещением» события. Если это то, что вы имеете в виду, дайте мне знать, и я отредактирую свой ответ, потому что есть атрибут «смещение», но он не так прост в использовании, как вы могли ожидать. То, что я имел в виду, включая остатки, заключается в том, что код в моем ответе в настоящее время пропускает остатки. Вы хотели знать, когда вы встретите отдыха? – Alex
Также обратите внимание, что у music21 есть группа Google, которая является очень хорошим источником информации о программном обеспечении, и я считаю, что это также предпочтительное место для вопросов, связанных с музыкой21. https://groups.google.com/forum/?hl=ru#!forum/music21list – Alex