2017-04-14 3 views
0

Ich versuche, eine sehr einfache DAW in C# mit NAudio und winforms zu machen. Das Ziel des Programms in diesem Stadium ist es, in der Lage zu sein, von einem Mikrofon aufzunehmen, während ein paar Audiodateien abgespielt werden. Das bisherige Projekt ist eine Kombination aus den mit NAudio gelieferten ASIO-Samples und Informationen im Internet.NAudio ASIO mischen

Ich habe ein audiofilereader-Objekt für jede Audiodatei ich spielen möchte:

reader = new AudioFileReader("Audio 8_01.wav"); 

reader2 = new AudioFileReader("Audio 9_04.wav"); 
reader3 = new AudioFileReader("Click.L.wav"); 
reader4 = new AudioFileReader("Click.R.wav"); 

Wenn das die Audio-Clips Play-Taste gestartet werden soll spielen und Aufzeichnung sollte auf Kanal 1 starten:

private void Play() 
    { 
     // allow change device 
     if (asioOut != null && 
      (asioOut.DriverName != GetDriverOutComboBoxText() || 
      asioOut.ChannelOffset != 0)) 
     { 
      asioOut.Dispose(); 
      asioOut = null; 
     } 

     int recordChannelCount = 0; 


     mix = new MixingWaveProvider32(); 

     //Console.WriteLine("CHannels: " + mix.WaveFormat.Channels); 
     mix.AddInputStream(reader); 
     mix.AddInputStream(reader2); 
     mix.AddInputStream(reader3); 
     mix.AddInputStream(reader4); 
     Console.WriteLine("CHannels: " + mix.WaveFormat.Channels); 

     if (asioOut == null) 
     { 
      asioOut = new AsioOut(GetDriverOutComboBoxText()); 
      recordChannelCount = 1; 
      asioOut.ChannelOffset = 0; 
      asioOut.InitRecordAndPlayback(mix , recordChannelCount, 96000); 
      asioOut.AudioAvailable += OnAsioOutAudioAvailable; 

     } 

     outFileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".wav"); 
     Console.WriteLine("File: " + outFileName); 
     writer = new WaveFileWriter(outFileName, new WaveFormat(96000, recordChannelCount)); 

     reader.Position = 0; 
     asioOut.Play(); 
     timer1.Enabled = true; 
     //SetButtonStates(); 
    } 

Ich benutze einen Mixingwaveprovider, um mehrere Dateien gleichzeitig abspielen zu können. Es funktioniert etwas, wenn die Audiofiles in den Lesern Stereo-Audio sind, bekomme ich Sound in beiden Lautsprechern und dem Mix.WaveFormat.Channels ist 2 vor und nach dem Hinzufügen der Datei-Reader zum Mixer. Wenn die Dateien Mono-Audio sind, werden sie alle entweder im linken oder rechten Lautsprecher abgespielt, abhängig davon, ob asioOut.ChannelOffset auf Null oder Eins gesetzt ist. Ich weiß nicht, wie ich einstellen soll, auf welchem ​​Kanal jedes Audiodatei abgespielt wird, und ich möchte das Panning einstellen können, d. Ein Mono-Sound wird in beiden Lautsprechern zu einem gewissen Grad abgespielt. Ich habe das Gefühl, dass etwas fehlt, das ich vermisse ... Ich habe das Patchbay-Beispielprogramm gesehen, das Mark Heath geschrieben hat, aber ich weiß nicht wirklich, wie ich das auf mein Projekt anwenden soll. Alle Audiodateien haben übrigens das gleiche Format.

Das andere Problem, das verwandt sein könnte, sonst werde ich eine neue Frage stellen, ist, dass das Audio aufgezeichnet wird (was übrigens gut funktioniert) ist nicht in den Lautsprechern während der Aufnahme, dh hörbar. keine Überwachung während der Aufnahme Wie kann ich dieses aufgenommene Signal an denselben Mixer senden, an den die Dateien gesendet werden?

Danke!

Antwort

0

Dies könnte eine späte Antwort sein, aber wenn ich Audio pannen muss, verwende ich die WaveChannel32 Klasse in NAudio. Dies ist ein einfaches VB.NET-Beispiel:

Dim mixer As New MixingWaveProvider32() 
    Dim audioreader As New AudioFileReader("SourceFile.mp3") 
    Dim wav32 As New WaveChannel32(audioreader) 

    wav32.Pan = -0.5 

    mixer.AddInputStream(wav32)