首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python MIDI MIDO中转换时间/节拍读取/保存文件

在Python MIDI MIDO中转换时间/节拍读取/保存文件
EN

Stack Overflow用户
提问于 2017-08-19 21:37:04
回答 1查看 1.7K关注 0票数 3

下面的程序使用MIDO读取'g1.mid‘,然后将其保存到'g1_new.mid’。我的问题是:在读取文件时,'msg.time‘是一个浮点值,但在保存文件时,'time in Message’是一个以滴答为单位的整数。在这种情况下,我们如何将'msg.time‘转换为'tick in message’?

代码语言:javascript
复制
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')

注意:这段代码是在一个关于音乐生成的项目中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-20 00:07:12

当您遍历MidiFile对象本身时,时间戳将被显式转换:

代码语言:javascript
复制
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 (或合并后的曲目)即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45772214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档