介绍Mido
Mido是一个Python编写的MIDI库,它允许您处理MIDI文件和生成MIDI数据。该库是跨平台的,并支持Python 2和Python 3。
Mido的一个非常有用的功能是 MIDI 消息的时间戳。这使您能够准确地指定MIDI消息的时间,以便它们在节奏上正确播放。
为什么要将日期调回去
您可能会遇到一种情况,在 Mido 中加载了MIDI文件,但它的时间戳是相对于您的加载时间。例如,您可能在2019年打开了一个MIDI文件,其中的时间戳都设定为当前时间戳。但是,您现在想改变这些消息的时间戳,使它们反映该文件的原始创建日期。
此时,您可能需要将日期调回去,以便MIDI文件中的各种时间戳反映它们应有的时间。
如何在Mido中将日期调回去
要将日期调回去,您需要知道原始MIDI文件创建的日期。您可以使用Python的 datetime 模块获取该日期。
首先,将MIDI文件加载到Mido中:
```python
import mido
mid = mido.MidiFile('example.mid')
```
接下来,获取原始MIDI文件创建的日期。假设该文件是2019年5月1日创建的:
```python
from datetime import datetime
original_date = datetime(2019, 5, 1)
```
现在,对于每个MIDI消息,您可以计算出该消息在原始MIDI文件创建日期之后的时间(以秒为单位)。例如,假设这个MIDI消息的时间戳是相对于您加载该文件的当前时间戳是0.5秒:
```python
from datetime import timedelta
message_timestamp = 0.5
delta = timedelta(seconds=message_timestamp)
original_time = original_date + delta
```
上面的代码将计算该消息的时间戳应该是原始MIDI文件创建日期之后的0.5秒。
最后,将该新时间戳设置为MIDI消息的时间戳:
```python
message.time = mido.second2tick(original_time, mid.ticks_per_beat, mido.bpm2tempo(mid.tracks[0][0].tempo))
```
上面的代码将MIDI消息的时间戳设置为新时间戳。此处的 mid.ticks_per_beat 和 mid.tracks[0][0].tempo 是从MidiFile对象中提取的信息,分别是每拍的tick数和MIDI文件的初始BPM。
总结
在Mido中,您可以使用 Python 中的 datetime 模块来将 MIDI 文件中的时间戳从当前时间戳改变为原始创建日期之后的时间戳。这对于恢复原始MIDI文件的时间信息非常有用。