jack音频同步应用到mas

2024-04-18 23:31:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何使用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)

所以我用很少的睡眠时间运行一个循环,如果当前的节拍已经结束,那么检查每个迭代。你知道吗

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


Tags: posimportclientapi应用程序iftimemsg
1条回答
网友
1楼 · 发布于 2024-04-18 23:31:29

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

首先,我们希望使用进程回调,而不是无限循环。你知道吗

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()

相关问题 更多 >