gpt4 book ai didi

python - 除非我添加延迟,否则使用 pyportmidi 发送大量数据会停止工作

转载 作者:太空宇宙 更新时间:2023-11-03 15:25:13 25 4
gpt4 key购买 nike

我正在尝试使用 pyportmidi 与 Novation Launchpad 对话。我注意到,如果我继续使用 midiOut.WriteShort() 向它发送指令,它会处理前 100 条左右,然后放掉其余指令。

我猜某个地方的缓冲区快满了,一旦满了,指令就会丢失。我可以通过在每条消息后添加一个 time.sleep(.1) 来解决这个问题,但这显然会使事情变得非常缓慢。有没有办法测试缓冲区是否已满,并且只在需要时才休眠?或者在我发送更多数据之前等待缓冲区清空的方法?

最佳答案

当我查看 SVN 存储库时,我在包装器代码中遇到了这个问题,请注意“为什么 bufferSize 在这里为 0?”评论..

def __init__(self, OutputDevice, latency=0):
...stuff...
# Why is bufferSize 0 here?
err = Pm_OpenOutput(&(self.midi), self.i, NULL, 0, PmPtr, NULL, latency)

API 文档显示 Pm_OpenOutput 具有以下签名

PmError Pm_OpenOutput (
PortMidiStream **stream,
PmDeviceID outputDevice,
void *outputDriverInfo,
long bufferSize,
PmTimeProcPtr time_proc,
void *time_info,
long latency
)

似乎没有任何明显的方法可以找出当前的缓冲区堆栈长度,更重要的是,Python 包装器似乎无论如何都会完全忽略缓冲区设置。

portmidi.c 讲述了一个稍微不同的故事:

if (bufferSize <= 0) bufferSize = 256; /* default buffer size */
midi->queue = Pm_QueueCreate(bufferSize, sizeof(PmEvent));
if (!midi->queue) {
/* free portMidi data */
*stream = NULL;
pm_free(midi);
err = pmInsufficientMemory;
goto error_return;
}

因此,256 是默认值。这可以解释为什么您会遇到大约 100 个左右的问题。

但是,请记住一些事情 - MIDI 非常慢,31250 波特(每秒 31250 位),因为 MIDI 消息(通常)是 2 个字节(16 位),这意味着每个消息最多有 1953 条消息第二。 (我在这里可能是错的,但如果我不对的话,我已经很接近了)

但是,还是有希望的:一个简单的解决方法是,您可以在大多数设备上休眠到 2 毫秒操作系统,不会把事情搞砸。

time.sleep(.002) # 2 millisecond sleep

但是,由于您使用的是 write_short(),因此每秒只能给您 500 条消息。所以你可能想做一些事情,比如让一个队列每 .002 秒轮询一次传出消息,从堆栈中弹出 16,写入它们,然后休眠。这样如果你的整个MIDI 堆栈支持的速度可以达到每秒 8000 条消息的速度。

我注意到在下面的代码中,如果我将休眠时间降低到低于 .002,则根本不会发送任何 MIDI, 我退出程序,然后所有事件都涌入 MIDI公共(public)汽车。所以 portmidi 速率限制或 OSX 上可能存在问题。

还有一件事要记住,如果你真的在使用 MIDI - 很可能是控制更改值,如果你正在修改诸如高通滤波器之类的东西,值“1”听起来很像“2” ',因此,如果您使消息的粒度更小(增加或减少 2 或 4),则可以减少消息的数量音频没有明显差异。这是一个次优的解决方案,而且您的 MIDI 堆栈很可能支持比 31250 波特快得多的速率。

另一件需要考虑的事情是,如果您将 portmidi 应用程序从属到 MIDI 时钟,您可以从 MIDI 主机获得可靠的节拍流,您可以将其用作触发器来写回 MIDI 数据,(没有休眠必要的)。

祝你好运!

-n

PPQN Clock MIDI 1.0

关于python - 除非我添加延迟,否则使用 pyportmidi 发送大量数据会停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8198145/

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