如何"减慢"MIDI文件(理想情况下是Python)?

Ale*_*lli 17 python midi

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

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

小智 14

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

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

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

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

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


Vin*_*vic 9

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

虽然可能已经有一个MIDI读/写库.事实上,这是一个看到相关问题的问题:用于Python的简单的跨平台MIDI库

设定速度

此元事件以每四分音符的微秒数设置序列速度,该音符以三个字节编码.它通常位于第一个轨道块中,时间对齐与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


der*_*men 5

您可以使用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') 
Run Code Online (Sandbox Code Playgroud)

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

如果你和我一样,那么 7 年后你还在听同样的歌曲,可以试一试!否则,我希望这可以帮助那些像我一样今天醒来并且正在挠头试图轻松解决这个问题的人。