gpt4 book ai didi

python - 如何从 MIDI 文件中提取单个和弦、休止符和音符?

转载 作者:行者123 更新时间:2023-12-03 23:55:27 28 4
gpt4 key购买 nike

我正在制作一个程序,它应该能够从某个 midi 文件中提取音符、休止符和和弦,并将音符和和弦的相应音高(以 midi 音数 - 它们从 0-127 开始)写入 csv 文件供以后使用。

对于这个项目,我使用 Python 库“Music21”。

 from music21 import *
import pandas as pd


#SETUP

path = r"Pirates_TheCarib_midi\1225766-Pirates_of_The_Caribbean_Medley.mid"

#create a function for taking parsing and extracting the notes
def extract_notes(path):
stm = converter.parse(path)

treble = stm[0] #access the first part (if there is only one part)
bass = stm[1]

#note extraction
notes_treble = []
notes_bass = []
for thisNote in treble.getElementsByClass("Note"):
indiv_note = [thisNote.name, thisNote.pitch.midi, thisNote.offset]
notes_treble.append(indiv_note) # print's the note and the note's
offset

for thisNote in bass.getElementsByClass("Note"):
indiv_note = [thisNote.name, thisNote.pitch.midi, thisNote.offset]
notes_bass.append(indiv_note) #add the notes to the bass

return notes_treble, notes_bass

#write to csv
def to_csv(notes_array):
df = pd.DataFrame(notes_array, index=None, columns=None)
df.to_csv("attempt1_v1.csv")

#using the functions
notes_array = extract_notes(path)
#to_csv(notes_array)

#DEBUGGING
stm = converter.parse(path)
print(stm.parts)

这是我用作测试的分数的链接。
https://musescore.com/user/1699036/scores/1225766

当我运行 extract_notes 函数时,它返回两个空数组和行:
print(stm.parts)

它返回
<music21.stream.iterator.StreamIterator for Score:0x1b25dead550 @:0>

我很困惑为什么它会这样做。这首曲子应该有两个部分,高音和低音。如何将每个音符、和弦和休止符放入一个数组中,以便将其放入 csv 文件中?

最佳答案

这是我是如何做到的小片段。我需要获取特定乐器的所有音符、和弦和休止符。所以一开始我遍历了部分并找到了特定的乐器,然后检查它是哪种类型的音符并附加它。

你可以像这样调用这个方法

notes = get_notes_chords_rests(keyboard_instruments, "Pirates_of_The_Caribbean.mid")

其中 keyboard_instruments 是乐器列表。
keyboard_nstrument = ["KeyboardInstrument", "Piano", "Harpsichord", "Clavichord", "Celesta", ]
def get_notes_chords_rests(instrument_type, path):
try:
midi = converter.parse(path)
parts = instrument.partitionByInstrument(midi)
note_list = []
for music_instrument in range(len(parts)):
if parts.parts[music_instrument].id in instrument_type:
for element_by_offset in stream.iterator.OffsetIterator(parts[music_instrument]):
for entry in element_by_offset:
if isinstance(entry, note.Note):
note_list.append(str(entry.pitch))
elif isinstance(entry, chord.Chord):
note_list.append('.'.join(str(n) for n in entry.normalOrder))
elif isinstance(entry, note.Rest):
note_list.append('Rest')
return note_list
except Exception as e:
print("failed on ", path)
pass

附言使用 try 块很重要,因为网络上的许多 MIDI 文件已损坏。

关于python - 如何从 MIDI 文件中提取单个和弦、休止符和音符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49339622/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com