Python 如何在midi中将条数转换为时间?(音乐)
给定一个midi文件,如何将条数转换为时间?Python 如何在midi中将条数转换为时间?(音乐),python,music21,Python,Music21,给定一个midi文件,如何将条数转换为时间? 一般来说,我的解决方案是使用漂亮的midi,如何轻松地将以整数表示的条数映射到歌曲中以秒为单位的时间 import pretty_midi as pm def get_bar_to_time_dict(self,song,id): def get_numerator_for_sig_change(signature_change,id): # since sometime pretty midi count are wier
一般来说,我的解决方案是使用漂亮的midi,如何轻松地将以整数表示的条数映射到歌曲中以秒为单位的时间
import pretty_midi as pm
def get_bar_to_time_dict(self,song,id):
def get_numerator_for_sig_change(signature_change,id):
# since sometime pretty midi count are wierd
if int(signature_change.numerator)==6 and int(signature_change.denominator)==8:
# 6/8 goes to 2 for sure
return 2
return signature_change.numerator
# we have to take into account time-signature-changes
changes = song.time_signature_changes
beats = song.get_beats()
bar_to_time_dict = dict()
# first bar is on first position
current_beat_index = 0
current_bar = 1
bar_to_time_dict[current_bar] = beats[current_beat_index]
for index_time_sig, _ in enumerate(changes):
numerator = get_numerator_for_sig_change(changes[index_time_sig],id)
# keep adding to dictionary until the time signature changes, or we are in the last change, in that case iterate till end of beats
while index_time_sig == len(changes) - 1 or beats[current_beat_index] < changes[index_time_sig + 1].time:
# we have to increase in numerator steps, minus 1 for counting logic of natural counting
current_beat_index += numerator
if current_beat_index > len(beats) - 1:
# we labeled all beats so end function
return bar_to_time_dict
current_bar += 1
bar_to_time_dict[current_bar] = beats[current_beat_index]
return bar_to_time_dict
song = pm.PrettyMIDI('some_midi_file.midi')
get_bar_to_time_dict(song)
如果有人知道pretty midi或music21中解决相同问题的函数,请告诉我,找不到。
编辑:还有一个6/8拍的问题,我想这涵盖了所有边缘案例。不是100%确定这是你问题的一部分吗?@Nearoo不,这是我找到的解决方案,如果其他人对此有问题,就把这个留在这里。到目前为止,谷歌很难做到这一点