LabView 同时播放不止一种声音

LabView playing more than one sound at the time

我正在使用事件结构并想做一些类似 Launchpad 的事情。 数字键盘为每个数字添加了声音。 问题是,当我按下示例一时,程序正在等待音乐停止播放,接下来我可以按下示例四。

是否可以使用事件结构同时播放 3 个键的声音?

I put the files online here 并在下面添加了屏幕截图。框图:

前面板:

更新:

感谢@Engineero 指出播放声音文件 vi 实际上没有阻塞。更新后的代码展示了如何播放重叠的声音。我将把它留给用户来添加 Stop Sound on Key Up 代码。不需要超时,因为事件结构中没有发生任何事情。

另外,请注意,对我来说,Play Sound vi 需要在 while 循环中才能继续播放。不确定为什么需要这样做,但是 NI 示例以这种方式设置它(\examples\Graphics 和 Sound\Sound\Sound Player.vi)。

最后,如果您的声卡如前所述 here 不堪重负,您可能会导致 vi 崩溃。如果发生这种情况,我会使用更好的声音库来尝试从您的声卡中获得更多性能。

原文:

首先,我假设你指的是 this Launchpad?

我能够同时按下最多 4 个键,以下是 - 重要的是将事件超时设置为 1 毫秒。如果您需要更多,则需要更复杂的设计。

我无法轻松实现声音,因为所有基本的 LabVIEW 蜂鸣声都被认为是 "blocking I/O" 意思是如果你同时调用 2 声蜂鸣声,那么 Windows 将一个接一个地播放,而不是同时播放同时。您将需要使用 non blocking I/O probably in a language other than LabVIEW such as this C++ library.

来实现您的乐器音符

工作解决方案

我认为使用 Graphics and Sound -> Sound -> Output 面板下的 Play Sound File VI 比我预期的要容易得多。 link 是 2011 年的文档(找不到更新的 link),但它看起来并没有改变。工作结果如下所示,事件结构处理了两个不同的事件:

Key Down? 事件:

Stop Button 事件:

如果不使用主事件循环右侧的 Sound Output Clear VI,您可能没问题,但将它放在那里也没什么坏处。

事实证明,Play Sound File VI 没有阻塞,因此您可以播放多个重叠的声音文件。如果您 运行 在您的机器上阻塞(一个声音文件播放,然后下一个,等等),请告诉我,因为我有另一个可能有效的解决方案。

关于事件的一句话

需要理解的重要一点是事件是在队列中处理的。当您按键时,这些按键按顺序 进入事件队列。每次执行事件处理循环时,它都会从队列中取出 oldest 事件并对其进行处理。 LabVIEW 中的事件结构在事件处理循环的每次迭代中只会处理一个事件。在下一次迭代中,如果事件仍在您的结构设置为处理的队列中,它将在该次迭代中使用下一个最旧的事件并重复。

现在,假设您想要执行一些超级复杂的处理,每次按下一个键都需要 10 秒,并将该处理放在主事件循环中。您的按键仍然会像您按下它们一样快地进入事件队列,但是 LabVIEW 必须等待整整 10 秒才能使下一个按键出列并处理它,因此您最终会得到一个应用程序,它似乎挂起,同时发出声音通过队列比向队列中添加项目慢得多。

解决这个问题的一种方法是采用复杂的处理并将其放在另一个进程的队列之外。如果你有资源,你实际上可以在它自己的线程中为每一个按键调用一个单独的处理子 VI 实例。这允许事件处理循环以尽可能快的速度生成进程,然后您的进程花费他们需要的任何时间同时(资源允许)执行您想要的任何操作。

本质上这就是 Play Sound File VI 所做的。它看到您想要播放一个文件并生成一个进程来通过扬声器播放该声音,从而允许事件处理循环立即继续,而不是等待声音播放完毕。当您按下更多的键时,会产生更多的进程,这些进程会在完成后自行终止。您也可以手动执行此操作,如果 Play Sound File 对您的行为方式与对我的行为方式不同,这是我为您提供的另一种解决方案。