- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 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
关于python - 除非我添加延迟,否则使用 pyportmidi 发送大量数据会停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8198145/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!