【发布时间】:2021-10-23 03:16:12
【问题描述】:
我已经编写了一个 python 脚本来处理带有 music21 的 midi 文件并再次编写一个 midi 文件。如果独奏钢琴在某种意义上是“简单的”,即没有多个音高/音符在一个声音中同时演奏,则此方法有效。
https://github.com/githubuser1983/algorithmic_python_music/blob/main/12RootOf2.py
上面的相关部分是:
def parseMidi(fp,part=0):
import os
from music21 import converter
print(fp)
score = converter.parse(fp,quantizePost=True)
print(list(score.elements[0].notesAndRests))
#print([e.partAbbreviation for e in score.elements][0])
from music21 import chord
durs = []
ll0 = []
vols = []
isPauses = []
for p in score.elements[part].notesAndRests:
#print(p)
if type(p)==chord.Chord:
pitches = median([e.pitch.midi-21 for e in p]) # todo: think about chords
vol = median([e.volume.velocity for e in p])
dur = float(p.duration.quarterLength)
#print(pitches)
ll0.append(pitches)
isPause = False
elif (p.name=="rest"):
pitches = 89
vol = 1
dur = float(p.duration.quarterLength)
ll0.append(pitches)
isPause = True
else:
pitches = p.pitch.midi-21
vol = p.volume.velocity
dur = float(p.duration.quarterLength)
ll0.append(pitches)
isPause = False
durs.append(dur/(12*4.0))
vols.append(vol*1.0/127.0)
isPauses.append(isPause)
#print(p.name,p.octave,p.duration.quarterLength)
#print(dir(score))
#print(ll0)
#print(durs)
return ll0,durs,vols,isPauses
另一种选择是读取musicxml 而不是midi。我需要让算法工作的是每个声音的音符列表 =(音高、持续时间、音量、isPause)。
感谢您的帮助。
【问题讨论】:
-
Music21 与 MIDI 一起工作,但在 musicxml 方面表现出色——除了下面的答案和 cmets,请考虑尽快将文件更改为 musicxml。 Musescore 在将 MIDI 批量转换为 musicxml 方面做得很好。
-
@michaelscottcuthbert 我将如何在 musicxml 中做到这一点?
标签: parsing midi music21 musicxml