gpt4 book ai didi

python - 插孔音频 - 将应用程序同步到主控

转载 作者:行者123 更新时间:2023-12-03 01:42:28 25 4
gpt4 key购买 nike

我想知道使用 jack audio api 使我的应用程序与时基主应用程序保持同步的正确方法。 .

假设我有 Hydrogen drum machine在主模式下运行,我想在氢气播放的每 1/4 个音符上打印一条消息。

这就是我会做的直观(使用python):

#!/usr/bin/env python3

import time
import jack

client = jack.Client('klicker')

def print_msg (last_tick):
state, pos = client.transport_query()
if state == jack.ROLLING:
if pos['tick'] < last_tick:
print ("klick")

return pos['tick']

with client:
last_tick = 0
while True:
last_tick = print_msg (last_tick)
time.sleep(0.00002)

所以我正在运行一个 sleep 时间很少的循环,如果当前节拍已经结束,则检查每次迭代。

这对我来说似乎有点肮脏和不精确。那么解决这个问题的正确方法是什么?

最佳答案

最后,我找到了一个更精确的解决方案:

首先,我们要使用进程回调而不是无限循环。

def process (f):

每次调用此回调时, f处理的帧数。采样率告诉我们我们将在 1 秒内处理多少帧。通过将其乘以 60 并除以 beats per minute 的数量我们得到一拍中处理的帧数。
#!/usr/bin/env python3

import jack
client = jack.Client('Klick')
frame_counter = 0

@client.set_process_callback
def process (f):
global frame_counter
state, pos = client.transport_query()

if state == jack.ROLLING:
frame_counter += f

# how many frames are get processed in 1 beat?
frames_per_beat = client.samplerate * 60 / pos['beats_per_minute']

# did we process enough frames for 1 beat?
if frame_counter >= frames_per_beat:
print ('klick')
frame_counter -= frames_per_beat


with client:
client.activate()
input()

关于python - 插孔音频 - 将应用程序同步到主控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46103136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com