使用SoundPlayer播放多个声音

我正在制作一个采样器程序,其中从1到9的每个键将发出不同的声音。 一切正常,但当我同时按下两个(或更多)声音时,第二个“杀死”第一个声音。

我正在使用SoundPlayer播放来自.WAV文件的声音。 我怎么解决这个问题?

您需要使用DirectX(DirectSound)或一些类似的API,旨在允许同时播放多个声音。

有一种简单的方法可以在C#或VB.Net中一次播放多个声音。 您必须调用mciSendString() API函数来播放每个.wav文件。 除非你是循环播放,否则你甚至不需要做multithreading。 这是使用mciSendString()创建的MusicPlayer类的完整工作示例。

 // 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; } 

编辑:添加了一个工作示例的链接。

你可以这样做:

SoundPlayer支持WAV Stream。 你可以

  • MIX样本你’手动’玩,并且,
  • 假(从某个地方获取WAV标题,它并不复杂)。

并将此流作为参数提供给SoundPlayer构造函数 。

这样你就不必使用某种复杂的DirectSound库,并且仍然混合(一次多个声音)。

我猜你的KeyPress事件(或者你正在使用的任何事件)你正在使用构造函数创建一个新的SoundPlayer实例,该构造函数接受WAV文件的路径,然后调用它的Play方法。 从理论上讲,这不应该导致您遇到的“单声道”效果,因为Windows自Windows 98以来一直能够同时播放多个WAV文件。我认为您听到了什么(基于我自己使用的这个类)第二个启动时不是第一个声音的截止,但实际上是因为从磁盘加载WAV文件时整个播放暂停导致的故障。

而不是在每个按键上加载一个新的SoundPlayer实例,尝试创建一个类范围的SoundPlayer对象数组,并在表单的Load事件中从磁盘预加载它们。 然后在按下键时调用每个SoundPlayer的Play方法。 这可能会解决您的问题,但我认为您仍会偶尔出现这种问题。

 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的播放。