如何“减慢”MIDI文件(理想情况下是在Python中)?

时间:2009-09-06 00:35:53

标签: python midi

我有.MID和.KAR格式的一些歌曲的背景音乐,但在每种情况下它的播放速度都比我想要的要快。创建具有相同内容但速度较慢的.MID或.KAR文件的最简单方法是什么?比如,一个减慢20%左右,另一个减慢15%,三分之一减少25%,依此类推?

理想情况下,我更喜欢跨平台的Python脚本(因为这样我可以轻松地通过实验调整源代码以收敛到我想要的确切效果;-),但我会采取任何运行的免费解决方案Linux(Ubuntu 8.04,如果重要)和Mac(Mac OS X 10.5,但首选10.6兼容性)。

5 个答案:

答案 0 :(得分:13)

正如Vinko所说,你可以编辑midifile,但由于它是二进制格式,挤压到可能的最少位数,它有助于提供帮助。

这是一个midi-to-text转换器(反之亦然):
http://midicomp.opensrc.org/
我最近一直在使用它。一旦将midifile作为文本,进行简单操作就可以进行文本处理(例如,使用“Tempo”搜索行)非常简单。没有尝试过mac(在ubuntu 8.04上没有问题编译)。

关于midifile节奏,特别是减速或加速播放非常容易,因为事件的时间是以“ticks”的形式指定的,其实际持续时间(以秒为单位)由Vinko引用中描述的速度参数决定。我相信时间签名不是那么相关,主要用于在midi音序器中打开时正确显示条/节拍。

此外,除了pyPortMidi之外,还有其他几个python midi模块。

[嗯......似乎我只能发布每个帖子的链接,成为新用户。我会尝试在几条评论或其他几个答案中发布指向python模块的链接......]

答案 1 :(得分:9)

您可以根据http://www.sonicspot.com/guide/midifiles.html

编辑该文件

虽然可能已经有一个MIDI读/写库。事实上,这是一个看到相关问题的问题:Simple, Cross Platform MIDI Library for Python

  

设定速度

     

这个元事件设置了   顺序节奏   每个四分音符的微秒数   以三个字节编码。通常是   发现在第一个轨道块,   时间对齐以同时发生   作为MIDI时钟消息来推广   更准确的同步。如果不   设定节奏事件,120节拍   假设每分钟。下列   公式可以用来翻译   节奏从每秒微秒   四分音符每分钟节拍和   回来。

MICROSECONDS_PER_MINUTE = 60000000

BPM = MICROSECONDS_PER_MINUTE / MPQN
MPQN = MICROSECONDS_PER_MINUTE / BPM
Meta Event  Type    Length  Microseconds/Quarter-Note
255 (0xFF)  81 (0x51)   3   0-8355711

答案 2 :(得分:2)

您可以使用music21执行此操作,但我仅在OSX 10.10.1上进行了测试。

import music21

fctr = 1.25 # scale (in this case stretch) the overall tempo by this factor
score = music21.converter.parse('song.mid')
newscore = score.scaleOffsets(fctr).scaleDurations(fctr)

newscore.write('midi','song_slow.mid') 

偏移就像是每个音符的时间戳,持续时间是音符的响起时间,我相信对每个音符应用相同的比例因子就像调整速度一样。

如果你像我一样,那么7年后你就会听同样的歌了,可以尝试一下!否则,我希望这能帮助今天像我一样醒来的其他人,并试图轻易地试图解决这个问题。

答案 3 :(得分:1)

在Windows python 3.8上通过@dermen测试了该版本。不得不稍作调整,但仍然有效!

import music21

fctr = 1.5 # scale (in this case stretch) the overall tempo by this factor
score = music21.converter.Converter()
score.parseFile('home.mid')
newscore = score.stream.augmentOrDiminish(fctr)
newscore.write('midi','song_slow.mid')

答案 4 :(得分:0)

我和你的帖子有类似的兴趣。我刚刚看到这个看起来很有前途的图书馆:

http://web.mit.edu/music21/