Domanda

Sto facendo un programma di sampler in cui ogni tasto 1-9 farà un suono diverso. Tutto funziona bene, ma quando si preme due (o più) suona allo stesso tempo, il secondo "uccide" il primo.

Sto giocando i suoni da file WAV, utilizzando SoundPlayer. Come posso risolvere questo?

È stato utile?

Soluzione

È necessario utilizzare DirectX (DirectSound) o alcune API simile che è stato progettato per consentire la riproduzione di suoni multipli allo stesso tempo.

Altri suggerimenti

C'è un modo semplice per riprodurre suoni multipli in una sola volta in C # o VB.Net. Dovrete chiamare la funzione mciSendString() API per riprodurre ogni file wav. Non sarà nemmeno bisogno di fare multi-threading, se non si è ciclo-playing. Qui è un esempio completo di una classe MusicPlayer creata usando mciSendString() di lavoro.

// Sound api functions
[DllImport("winmm.dll")]
static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);

Nella funzione sopra, la chiave è primo comando parametro. Finché si chiama due funzioni con un nome di comando separata, giocheranno separatamente / contemporaneamente. Questo è quello che ho fatto in uno dei miei programmi 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;
}

EDIT:. Aggiunto link per un esempio di lavoro

Si potrebbe fare questo:

SoundPlayer supporta WAV Stream. Si potrebbe

  • campioni MIX si gioca 'per mano' e,
  • Falso (ottenere l'intestazione WAV da qualche parte, non è complicato).

E fornire tale flusso come parametro di il costruttore SoundPlayer .

In questo modo non sarà necessario utilizzare le librerie DirectSound in qualche modo complicato, e hanno ancora la miscelazione (più suoni contemporaneamente).

Sto indovinando che nel vostro evento KeyPress (o qualsiasi altra cosa che si sta utilizzando) si sta creando una nuova istanza di SoundPlayer utilizzando il costruttore che prende un percorso del file WAV, e quindi chiamando il suo metodo Play. In teoria questo non dovrebbe causare l'effetto "mono" che si sta incontrando, dal momento che Windows è stato in grado di riprodurre più file WAV contemporaneamente a partire da Windows 98. Quello che penso che sentite (basato sul mio uso di questa classe) non è un cut-off del primo suono quando inizia la seconda, ma in realtà un problema tecnico che deriva dalla pausa la riproduzione complessiva del file WAV viene caricato da disco.

Invece di caricamento di una nuova istanza di SoundPlayer su ogni pressione di un tasto, provare a creare un array di oggetti SoundPlayer classe con scope e li pre-caricare dal disco nell'evento Load del modulo. Poi basta chiamare il metodo Play ciascun SoundPlayer quando viene premuto il tasto. Questo potrebbe risolvere il problema, anche se penso che sarà comunque ottenere anomalie occasionali in questo modo.

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");

Il codice potrebbe svolgere due i file audio contemporaneamente, la chiamata in seconda track2.wav audio non disturberà il gioco di track1.wav.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top