【发布时间】:2017-07-22 18:17:03
【问题描述】:
对于this project,我正在设计一个音序器/鼓机,它应该能够以精确的速度发送 MIDI 音符。示例:每 2 秒 16 个音符(即在音乐术语中,每小节 16 个 1/16 音符,BPM 120),即每 125 毫秒一个音符。
我在想:
import time
def midi_note_send(...):
....
while True:
midi_note_send(...)
time.sleep(0.125)
如果我这样做,如何确保它恰好是 125 毫秒? 这个循环的 1000 次迭代是否存在使用 126 秒而不是 125 秒的风险?如果是这样,如何有一个更精确的循环?
最后一点:好的鼓机应该能够在 1 小时内保持 120 BPM 的节奏,精度误差 使用的平台:Linux + RaspberryPi 但这个问题一般是有效的。
【问题讨论】:
-
坏消息:time documentation 基本上为零保证实际需要多长时间睡眠。它可以小于或大于请求的时间,任意数量。如您所知, sleep(0.125) 可能需要 0.0001 秒或一百万年。 (当然,这两种情况都不太可能,但是...)
-
你可能想看看here,我提供了一种方法来阻止睡眠漂移。
-
@Kevin 哇,我以前从未读过
time.sleep的文档字符串。 In 3.5 it was modified 睡眠至少指定的时间量。