music21:解析每个音轨的音符和持续时间
music21: parsing notes and durations per track
我正在尝试使用 music21 将多轨 MIDI 文件转换为每轨的音符和时长数组。
例如,给定一个 midi 文件 test.mid,其中包含 16 个音轨,
我想要得到 16 个元组数组,包括(音高、持续时间(可能加上音符的位置))。
music21 的文档很难理解,如果能提供任何帮助,我将不胜感激..
在 music21 中有不止一种方法可以做到这一点,所以这只是一种简单的方法。请注意,持续值表示为浮点数,例如四分音符等于 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-framework,它通过 music21 访问符号符号中的音乐文件,并将信息存储在 pandas 数据帧中。你可以这样做:
pip install vis-framework
另一个解决方案是使用 Humdrum 而不是 music21。
我正在尝试使用 music21 将多轨 MIDI 文件转换为每轨的音符和时长数组。
例如,给定一个 midi 文件 test.mid,其中包含 16 个音轨,
我想要得到 16 个元组数组,包括(音高、持续时间(可能加上音符的位置))。
music21 的文档很难理解,如果能提供任何帮助,我将不胜感激..
在 music21 中有不止一种方法可以做到这一点,所以这只是一种简单的方法。请注意,持续值表示为浮点数,例如四分音符等于 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-framework,它通过 music21 访问符号符号中的音乐文件,并将信息存储在 pandas 数据帧中。你可以这样做:
pip install vis-framework
另一个解决方案是使用 Humdrum 而不是 music21。