Python 如何在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文件,如何将条数转换为时间?
一般来说,我的解决方案是使用漂亮的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不,这是我找到的解决方案,如果其他人对此有问题,就把这个留在这里。到目前为止,谷歌很难做到这一点