下面的程序使用MIDO读取'g1.mid‘,然后将其保存到'g1_new.mid’。我的问题是:在读取文件时,'msg.time‘是一个浮点值,但在保存文件时,'time in Message’是一个以滴答为单位的整数。在这种情况下,我们如何将'msg.time‘转换为'tick in message’?
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')注意:这段代码是在一个关于音乐生成的项目中。
发布于 2017-08-20 00:07:12
当您遍历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 (或合并后的曲目)即可。
https://stackoverflow.com/questions/45772214
复制相似问题