Преобразовать время/тик в Python MIDI MIDO для чтения/сохранения файла

Следующая программа использует MIDO для чтения «g1.mid», а затем сохраняет его в «g1_new.mid». Мой вопрос заключается в следующем: при чтении файла «msg.time» является значением с плавающей запятой, но при сохранении файла «время в сообщении» является целым числом в тике. Как в этом случае преобразовать msg.time в галочку в сообщении?

from mido import MidiFile 
from mido import Message, MidiTrack

mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)

for msg in MidiFile('g1.mid'):
    if (not msg.is_meta):
        if (msg.type == 'note_on'):
            # how to convert msg.time to tick to fill in '?'
            track.append(Message('note_on', note=msg.note, velocity=msg.velocity, time=?))
        elif (msg.type == 'note_off'):
            # how to convert msg.time to tick to fill in '?'
            track.append(Message('note_off', note=msg.note, velocity=msg.velocity, time=?))
        elif (msg.type == 'program_change'):
            track.append(Message('program_change', program=msg.program, channel=msg.channel))

mid.save('g1_new.mid')

Примечание. Этот фрагмент кода находится в проекте по созданию музыки.


person Frank    schedule 19.08.2017    source источник


Ответы (1)


Когда вы выполняете итерацию по самому объекту MidiFile, метки времени явно преобразуются:

class MidiFile(object):
    ...
    def __iter__(self):
        ...
        tempo = DEFAULT_TEMPO
        for msg in merge_tracks(self.tracks):
            # Convert message time from absolute time
            # in ticks to relative time in seconds.
            if msg.time > 0:
                delta = tick2second(msg.time, self.ticks_per_beat, tempo)
            else:
                delta = 0

            yield msg.copy(time=delta)

            if msg.type == 'set_tempo':
                tempo = msg.tempo

Так что просто перебирайте mid.tracks (или объединенные треки) напрямую.

person CL.    schedule 19.08.2017
comment
Уважаемый CL: Программа может получать галочки для msg в merge_tracks(mid.tracks). Спасибо за ваш комментарий. - person Frank; 20.08.2017