For 这个项目 http://www.samplerbox.org我正在设计一个音序器/鼓机,它应该能够以精确的速度发送 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 但这个问题一般来说是有效的。
正如我所展示的here https://stackoverflow.com/a/40496844/3579910
import time
def drummer():
counter = 0
# time.sleep(time.time() * 8 % 1 / 8) # enable to sync clock for demo
while counter < 60 * 8:
counter += 1
print time.time()
time.sleep(.125 - time.time() * 8 % 1 / 8)
该计时器会调整每个节拍并重新排列。
而且调整几乎不需要时间:
timeit.timeit("time.time() * 8 % 1 / 8", number=1000000)
0.2493131160736084
这意味着每次执行大约需要 0.25 微秒
为了准确性:
1488490895.000160
1488490895.125177
1488490895.250167
1488490895.375151
1488490895.500166
1488490895.625179
1488490895.750178
1488490895.875153
音符之间有约 28 微秒的漂移。在本地运行较长时间会产生约 130μs 的总漂移(+- 65μs),但是,由于它每次节拍都与时钟同步,因此不会随着时间的推移而出现偏差。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)