只要用户按住键,如何播放音调?

Posted

技术标签:

【中文标题】只要用户按住键,如何播放音调?【英文标题】:How to play a tone for as long as the user holds a key? 【发布时间】:2014-02-13 06:39:12 【问题描述】:

为了好玩,我编写了一个音乐程序(用 C# 编写),它通过在用户按键时以适当的频率 P/Invoking Beep 函数来工作。

这种方法的一个问题是Beep 需要预先指定持续时间,因此所有音符都具有相同的长度。这对乐器来说是一个相当严重的限制。

我想做的是在 KeyDown 事件上开始播放音符,并在 KeyUp 事件上停止播放。优选地,以一种可以同时演奏多个音符的方式。有没有一种简单的方法可以在 .NET 或 Win32 中完成此任务?

【问题讨论】:

我能想到Beep 的一个选项是在keydown 上设置一个标志,开始循环播放检查keydown 标志,在keyup 中重置标志。您不会实时停止,但可以根据音乐目的进行调整。注意:这个我没试过,你可以试试看。 【参考方案1】:

Beep 在这里不是一个好的解决方案。生成所需频率的短波形文件,然后使用带有 SND_LOOP 标志的 PlaySound 函数播放它们,如下所示:

KeyDown: 
  PlaySound("wave440.wav", 0, SND_LOOP | SND_FILENAME | SND_ASYNC);
...
KeyUp: 
  PlaySound(NULL, 0, SND_PURGE);

【讨论】:

以上是关于只要用户按住键,如何播放音调?的主要内容,如果未能解决你的问题,请参考以下文章

向网站添加滑动声音

按下键时播放音调C#

您如何防止用户通过按住刷新键来关闭您的应用程序?

在java中录制音频并确定实时是不是播放了x频率的音调,如果是这样的话

使用 GLFW 处理输入

流式传输生成的音调