如何“减缓”MIDI文件(最好是在Python中)?

2024-04-29 14:28:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

理想情况下,我更喜欢一个跨平台的Python脚本(因为这可以让我很容易地通过实验调整源代码,使其收敛到我想要的精确效果;-),但是我会选择任何在Linux(Ubuntu 8.04,如果重要的话)和Mac(macosx10.5,但是10.6兼容性更好)中运行的免费解决方案。


Tags: 文件方法脚本内容源代码格式跨平台情况
3条回答

正如Vinko所说,您可以编辑midi文件,但由于它是二进制格式,压缩到尽可能少的位数,所以有帮助是有帮助的。

这是一个midi到文本转换器(反之亦然):
http://midicomp.opensrc.org/
我最近一直在用它。将midifile作为文本后,对简单操作执行文本处理(例如,使用“Tempo”搜索行)非常简单。没有在mac上试过(在Ubuntu8.04上编译没有问题)。

特别是对于midifile的节奏,很容易放慢或加快播放速度,因为事件的时间是用“滴答”来指定的,滴答的实际持续时间(以秒为单位)是由Vinko引用的tempo参数决定的。我相信时间签名并没有那么重要,它主要用于在midi音序器中正确显示小节/节拍。

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

[嗯。。。作为一个新用户,我似乎只能在每篇文章的链接上发表文章。我将尝试在几条评论或其他几个答案中发布到python模块的链接…]

您可以根据http://www.sonicspot.com/guide/midifiles.html编辑文件

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

Set Tempo

This meta event sets the sequence tempo in terms of microseconds per quarter-note which is encoded in three bytes. It usually is found in the first track chunk, time-aligned to occur at the same time as a MIDI clock message to promote more accurate synchronization. If no set tempo event is present, 120 beats per minute is assumed. The following formula's can be used to translate the tempo from microseconds per quarter-note to beats per minute and back.

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

您可以使用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年后你也在听同样的歌,你可以试试看!否则,我希望这有助于像我一样今天醒来并绞尽脑汁试图轻松解决这个问题的人。

相关问题 更多 >