按下按键时播放音调 C#
Play a tone while key is down C#
我正在构建一个钢琴控制台应用程序,它可以在特定时间内以特定频率播放 beep/tone。帮助
只要按下键,最终就会播放音调。
P.S 最终一次播放多个音调
namespace something
{
public class piano
{
[DllImport("kernel32.dll")]
static extern bool Beep(uint dwFreq, uint dwDuration);
public static void Main (string [] args)
{
Console.WriteLine("This is a piano.");
//The following code is wrong but you get the idea
char x = KeyDown;
switch(x)
case "q":
Beep(523,500);
break;
case "w":
Beep(587,500);
break;
//etc
default:
break;
}
}
}
在控制台应用程序中,您可以检测到何时按下了一个键,但不能检测到它何时被释放。因此我会使用 WinForms 应用程序。
在 WinForms 表单中,您可以在表单级别使用 KeyDown
和 KeyUp
事件。为了激活它们,您必须将表格的 KeyPreview
属性 设置为 true
。您可以在属性 window 或代码中执行此操作。
那你一定要记住按了哪些键。我为此使用 HashSet<Keys>
。
// Stores the keys in pressed state.
private HashSet<Keys> _pressedKeys = new HashSet<Keys>();
// Used in DisplayKeys method.
private StringBuilder _sb = new StringBuilder();
// Form constructor
public frmKeyboard()
{
InitializeComponent();
KeyPreview = true; // Activate key preview at form level.
}
private void frmKeyboard_KeyDown(object sender, KeyEventArgs e)
{
// Each time a key is pressed, add it to the set of pressed keys.
_pressedKeys.Add(e.KeyCode);
DisplayKeys();
}
private void frmKeyboard_KeyUp(object sender, KeyEventArgs e)
{
// Each time a key is released, remove it from the set of pressed keys.
_pressedKeys.Remove(e.KeyCode);
DisplayKeys();
}
private void DisplayKeys()
{
_sb.Clear();
foreach (Keys key in _pressedKeys.OrderBy(k => k)) {
_sb.AppendLine(key.ToString());
}
label1.Text = _sb.ToString();
}
现在,您可以一次按下一个或多个键,它们将显示在标签中。
简单的Beep
方法不会让你同时播放声音。有关可能的解决方案,请参阅 MSDN 上的此线程:Playing Sounds Simultaneously. Another alternative might be MIDI.NET.
我正在构建一个钢琴控制台应用程序,它可以在特定时间内以特定频率播放 beep/tone。帮助 只要按下键,最终就会播放音调。 P.S 最终一次播放多个音调
namespace something
{
public class piano
{
[DllImport("kernel32.dll")]
static extern bool Beep(uint dwFreq, uint dwDuration);
public static void Main (string [] args)
{
Console.WriteLine("This is a piano.");
//The following code is wrong but you get the idea
char x = KeyDown;
switch(x)
case "q":
Beep(523,500);
break;
case "w":
Beep(587,500);
break;
//etc
default:
break;
}
}
}
在控制台应用程序中,您可以检测到何时按下了一个键,但不能检测到它何时被释放。因此我会使用 WinForms 应用程序。
在 WinForms 表单中,您可以在表单级别使用 KeyDown
和 KeyUp
事件。为了激活它们,您必须将表格的 KeyPreview
属性 设置为 true
。您可以在属性 window 或代码中执行此操作。
那你一定要记住按了哪些键。我为此使用 HashSet<Keys>
。
// Stores the keys in pressed state.
private HashSet<Keys> _pressedKeys = new HashSet<Keys>();
// Used in DisplayKeys method.
private StringBuilder _sb = new StringBuilder();
// Form constructor
public frmKeyboard()
{
InitializeComponent();
KeyPreview = true; // Activate key preview at form level.
}
private void frmKeyboard_KeyDown(object sender, KeyEventArgs e)
{
// Each time a key is pressed, add it to the set of pressed keys.
_pressedKeys.Add(e.KeyCode);
DisplayKeys();
}
private void frmKeyboard_KeyUp(object sender, KeyEventArgs e)
{
// Each time a key is released, remove it from the set of pressed keys.
_pressedKeys.Remove(e.KeyCode);
DisplayKeys();
}
private void DisplayKeys()
{
_sb.Clear();
foreach (Keys key in _pressedKeys.OrderBy(k => k)) {
_sb.AppendLine(key.ToString());
}
label1.Text = _sb.ToString();
}
现在,您可以一次按下一个或多个键,它们将显示在标签中。
简单的Beep
方法不会让你同时播放声音。有关可能的解决方案,请参阅 MSDN 上的此线程:Playing Sounds Simultaneously. Another alternative might be MIDI.NET.