我正在制作一个采样器程序,其中1到9的每个键都会产生不同的声音。 一切正常,但当我同时按下两个(或更多)声音时,第二个“杀死”第一个声音。
我正在使用SoundPlayer
播放来自.WAV文件的声音。我该如何解决这个问题?
答案 0 :(得分:6)
您需要使用DirectX(DirectSound)或类似的API,以便同时播放多种声音。
答案 1 :(得分:6)
有一种简单的方法可以在C#或VB.Net中一次播放多个声音。您必须调用mciSendString()
API函数来播放每个.wav文件。除非你是循环播放,否则你甚至不需要做多线程。 Here是使用MusicPlayer
创建的mciSendString()
类的完整工作示例。
// Sound api functions
[DllImport("winmm.dll")]
static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);
在上面的功能中,键是第一个参数命令。只要您使用单独的命令名称调用两个函数,它们将单独/同时播放。这就是我在我的一个C#程序中所做的:
private void PlayWorker()
{
StringBuilder sb = new StringBuilder();
mciSendString("open \"" + FileName + "\" alias " + this.TrackName, sb, 0, IntPtr.Zero);
mciSendString("play " + this.TrackName, sb, 0, IntPtr.Zero);
IsBeingPlayed = true;
}
编辑:添加了一个工作示例的链接。
答案 2 :(得分:3)
你可以这样做:
SoundPlayer
支持WAV Stream。你可以
并将此类流作为参数提供给the SoundPlayer
constructor。
这样你就不必使用某种复杂的DirectSound库,并且仍然可以混合(一次发出多个声音)。
答案 3 :(得分:1)
我猜你的KeyPress事件(或者你正在使用的任何事件)你正在使用构造函数创建一个新的SoundPlayer实例,该构造函数接受WAV文件的路径,然后调用它的Play方法。从理论上讲,这不应该导致您遇到的“单声道”效果,因为Windows自Windows 98以来能够同时播放多个WAV文件。我认为您听到了什么(基于我自己使用的这个类)第二个启动时不是第一个声音的截止,但实际上是从磁盘加载WAV文件时整个播放暂停导致的故障。
不要在每次按键时加载SoundPlayer的新实例,而是尝试创建一个类范围的SoundPlayer对象数组,并在表单的Load事件中从磁盘预加载它们。然后在按下键时调用每个SoundPlayer的Play方法。这可能会解决您的问题,虽然我认为您仍会偶尔出现这种问题。
答案 4 :(得分:1)
using System.Windows.Media
Function void Play(string audioPath)
{
MediaPlayer myPlayer = new MediaPlayer();
myPlayer.Open(new System.Uri(audioPath));
myPlayer.Play();
}
Play(Application.StartupPath + "\\Track1.wav");
Play(Application.StartupPath + "\\Track2.wav");
此代码可以同时播放两个音频文件,第二个音频track2.wav
中的来电不会影响track1.wav
的播放。
答案 5 :(得分:0)
您需要通过SharpDX使用xAudio2,它是游戏开发专用的directX组件,您可以在此处找到完整的工作示例: https://github.com/sharpdx/SharpDX-Samples/tree/master/Desktop/XAudio2/PlaySound