我使用的是事件结构,想要像Launchpad一样。 数字键盘为每个数字添加了一个声音。 问题是,当我按下数字示例1时,程序在音乐停止播放时等待,接下来我可以按第四个例子。
是否有可能使用事件结构同时播放3个键的声音?
I put the files online here并在下面添加了屏幕截图。方框图:
前面板:
答案 0 :(得分:0)
感谢@Engineero指出Play Sound File vi实际上并没有阻止。更新的代码显示了如何播放重叠的声音。我将把它留给用户在Key Up代码上添加Stop Sound。不需要超时,因为事件结构中没有发生任何事情。
另外,请注意,Play Sound vi需要在while循环中继续播放。不知道为什么需要这样做,但NI的例子就是这样设置的(\ examples \ Graphics和Sound \ Sound \ Sound Player.vi)。
最后,如果你的声卡不堪重负,你可能会崩溃vi here。如果发生这种情况,我会使用更好的声音库来尝试从声卡中挤出更多性能。
首先,我假设您指的是this Launchpad?
我能够一次按下最多4个键 - 重要的是将事件超时设置为1 ms。如果您需要更多,则需要更复杂的设计。
我无法轻松实现声音,因为所有基本的LabVIEW蜂鸣声都被认为是“阻塞I / O”,这意味着如果您同时呼叫2个蜂鸣声,则Windows将一个接一个地播放,而不是同时播放。您需要使用non blocking I/O以及LabVIEW之外的其他语言(例如C++ library)来实现乐器注释。
答案 1 :(得分:0)
我认为我使用Graphics and Sound -> Sound -> Output
调色板下的Play Sound File
VI比我预期的更容易。该链接是2011年的文档(无法找到更新的链接),但看起来并没有改变。工作结果如下所示,事件结构处理两个不同的事件:
Key Down?
事件:
Stop Button
事件:
如果不使用主事件循环右侧的Sound Output Clear
VI,你可能会没事,但是在那里受伤不会。
事实证明Play Sound File
VI不会阻止,因此您可以播放多个重叠的声音文件。如果您在计算机上遇到阻塞(播放一个声音文件,然后播放下一个,等等),请告诉我,因为我有另一个可能有效的解决方案。
要理解的重要事项是事件在队列中处理。按键时,按键按顺序进入事件队列。每次执行事件处理循环时,都会将最旧的事件从该队列中取出并进行处理。 LabVIEW中的事件结构只会在事件处理循环的每次迭代中处理一个事件。在下一次迭代中,如果事件仍然在您的结构被设置为处理的队列中,则将采用该次迭代的下一个最后一个并重复。
现在,假设你想要做一些超级复杂的处理,每按一次键需要10秒,然后你将这个处理放在主事件循环中。你按下它们的按键仍然按照它们的速度进入事件队列,但是LabVIEW必须等待整整10秒才能使下一个按键出列并进行处理,这样你最终会得到一个似乎挂起的应用程序通过队列比将项添加到队列要慢得多。
解决这个问题的一种方法是进行复杂的处理,并将其放在另一个进程的队列之外。如果您拥有这些资源,您实际上可以在其自己的线程中为每个按键操作调用一个处理子VI的单独实例。这允许事件处理循环以您按下键的速度生成进程,然后您的进程需要花费他们所需的时间同时(资源允许)执行您想要的任何操作。
基本上这就是Play Sound File
VI正在做的事情。它看到你想要播放一个文件并产生一个过程来在扬声器上播放声音,允许事件处理循环立即继续,而不是等待声音完成播放。当你按下更多的键时,更多的进程会产生,当它们完成时会自行消除。您也可以手动执行此操作,如果Play Sound File
的行为与您的行为方式不同,我可以为您提供另一种解决方案。