music21:写入midi文件后和弦转音符?
Posted
技术标签:
【中文标题】music21:写入midi文件后和弦转音符?【英文标题】:music21:the chord turn to note after write into midi files? 【发布时间】:2021-06-19 08:52:23 【问题描述】:这就是我得到笔记的方式:
def read_notes_from_file(file):
notes = []
song = converter.parse(file)
notes_in_song = None
try:
s2 = instrument.partitionByInstrument(song)
notes_in_song = s2.parts[0].recurse()
except:
notes_in_song = song.flat.notes
for element in notes_in_song:
if isinstance(element, note.Note):
notes.append(str(element.pitch))
elif isinstance(element, chord.Chord):
notes.append('.'.join(str(n) for n in element.normalOrder))
return notes
这就是我创建 midi 的方式:
def create_midi(prediction_output, filename):
offset = 0
output_notes = []
for item in prediction_output:
pattern = item[0]
if ('.' in pattern) or pattern.isdigit():
notes_in_chord = pattern.split('.')
notes = []
for current_note in notes_in_chord:
new_note = note.Note(int(current_note))
new_note.storedInstrument = instrument.Piano()
notes.append(new_note)
new_chord = chord.Chord(notes)
new_chord.offset = offset
output_notes.append(new_chord)
else:
new_note = note.Note(pattern)
new_note.offset = offset
new_note.storedInstrument = instrument.Piano()
output_notes.append(new_note)
offset += 0.5
midi_stream = stream.Stream(output_notes)
midi_stream.write('midi', fp='.mid'.format(filename))
这是我在 create_midi 中输入的注释:
['G1', 'G6', 'C#5', '9.0.2.4', 'E-7', '2.5.7.9', 'C#6', '7.9.1.2', '11.2.4.7', '4.9.10', '3.5.7.11', '8.9.0', '11.2.3', '5.7.10', '7.0', '6.10.11', '2.3.5.9', '2.8', '5.11', '2.4.5', '5.6.7', '5.7.9.11', '1.2.5.8', '6.7.11.1.2', '1.5.8.9', '2', '3.4.8', '10.11.3.6', '4.5.8.9', '3.6.7', '4.5.7.11', '4.5.9', '3.7.11', '3.5.7.8', '5.9', '5.7.10.11', '2.4.6.10', '5.7.10.11', '10.11.0.2.3', '3.4.8', '11.4', '10.0.4.5', '5.8', '11.2.4.6', '2.6.7', '3.6.7.8.9', '4.5.8', '5.8.11.1', '2.5.7', '11.1.4', '1.4.6.9', '11.1', '4.6.7.11', '11.3.6.7', '2.4.6.9', '2.4', '2.8', '4.8.11', '11.2.5', '2.4.6.10', '10.11.3.6', '2.6.10', '5.8.10.0.1', '2.5.8.10', '0.6', '3.7.10.11', '3.6', '3.6.10', '2.4.6', '5.11', '11.0.4.7', '10.2.5', '11.1.2', '3.6.9', '5.6.9', '5.7.9.11.2', '5.8.10.1', '1.2.4.6.9', '6.7.11.2', '3.5.8.9', '2.3.7.10', '3.6', '6.8.9.11.1', '1.4.7.9.10', '2.5.8.10', '6.10.11', '1.4.7', '4.5.8', '6.8.9.1', '5.8', '2.3.6.9', '3.4.6.8.11', '11.2.4.7', '10.1', '11.3.4.6', '4.5.7', '3.6.9', '11.2.4.7', '5.7.10', '3.7.10']
这是我从上面的note创建的midi输入read_notes_from_file后得到的note:
['G4', 'G4', 'C4', 'A4', 'E4', 'D4', 'C4', 'G4', 'C#4', 'E4', 'E-4', 'G#4', 'C#4', 'F4', 'G4', 'F#4', 'D4', 'D4', 'F4', 'D4', 'F4', 'F4', 'C#4', 'F#4', 'C#4', 'D4', 'E-4', 'C#4', 'E4', 'E-4', 'E4', 'E4', 'E-4', 'E-4', 'F4', 'F4', 'D4', 'F4', 'C#4', 'E-4', 'C#4', 'C#4', 'F4', 'C#4', 'D4', 'E-4', 'E4', 'F4', 'D4', 'C#4', 'C#4', 'C#4', 'E4', 'C#4', 'D4', 'D4', 'D4', 'E4', 'C#4', 'D4', 'C#4', 'D4', 'F4', 'D4', 'C4', 'E-4', 'E-4', 'E-4', 'D4', 'F4', 'C#4', 'C#4', 'C#4', 'E-4', 'F4', 'F4', 'F4', 'C#4', 'F#4', 'E-4', 'D4', 'E-4', 'F#4', 'C#4', 'D4', 'F#4', 'C#4', 'E4', 'F#4', 'F4', 'D4', 'E-4', 'C#4', 'C#4', 'C#4', 'E4', 'E-4', 'C#4', 'F4', 'E-4']
它们只是成为和弦的音符,我不知道如何处理它。代码有什么问题吗?
【问题讨论】:
Offset 是计时计数器,对吧?当你说'C#5', '9.0.2.4'
时,你希望它比C#高9个半音,C#的根,D#,然后是E#,对吗?我认为当您执行int(current_note)
时,您需要将根 C# MIDI 值添加到所有这些值。它可能有一个功能......我不知道那个应用程序。所以你必须寻找一个,或者在网上找到一个 MIDI 表并自己滚动。
【参考方案1】:
如果您在pattern = item[0]
之后添加print(pattern)
,您会发现您正在以一种意想不到的方式修剪您的输入。 C#
变为 C
,2.5.7
变为 2
。这就是和弦被导出为单个音符的原因。
【讨论】:
以上是关于music21:写入midi文件后和弦转音符?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python 中的长笛乐器从音符制作 MIDI 文件(music21 库)