我正在尝试使用 librosa 和 sounddevice 编写一个基于 python 的节拍器,但我遇到了一些准确性问题。这是代码:
from time import sleep, perf_counter
import librosa
import sounddevice as sd
bpm = 200
delay = 60/bpm
tone = librosa.tone(440, sr=22050, length=1000)
try:
while True:
sd.play(tone, 22050)
sleep(delay)
except KeyboardInterrupt:
pass
首先,正常运作的节拍器的上限似乎在 180bpm 左右——如果你将 bpm 设置为高于 200bpm,那么就不会产生声音。在较慢的节奏中,我可以听到节拍器与咔嗒声之间的间距不太一致。我已经运行了这个主题的脚本,与这个答案的作者相比,我的结果相当糟糕(它使用“旧的单核 32 位 2GHz 机器”而不是我的六核 3.9GHz 64 位 Windows 运行):
150.0 bpm
+0.007575200
+0.006221200
-0.012907700
+0.001935400
+0.002982700
+0.006840000
-0.009625400
+0.003260200
+0.005553100
+0.000668100
-0.010895100
+0.017142500
-0.012933300
+0.001465200
+0.004203100
+0.004769100
-0.012183100
+0.002174500
+0.002301000
-0.001611100
所以我想知道我的节拍器问题是否与这些糟糕的结果有关,以及我能做些什么来解决它。我遇到的第二个问题是节拍器关闭的方式 - 我希望它一直运行到用户输入特定按钮,或者在我的情况下(无 GUI)从键盘输入特定值 -让我们说空格键。所以你现在可以看到它只适用于 ctrl + c,但我不知道如何用指定的键实现中断。