2016-12-01 1 views
0

Also auf College-Zuweisungen ich gerne gemacht (einige meiner Fähigkeiten scharf zu halten), und ich habe beschlossen, diese zu bewältigen:Mein directx Tonsignalpuffer hat statisches Rauschen

http://introcs.cs.princeton.edu/java/assignments/dsp.html

Ich bin mit MSVS2015 C#/Console-App zusammen mit dem SharpDX-Paket, das mir Zugriff auf einige grundlegende DirectSound-Funktionen gibt. Ich versuche gerade, eine 2-Sekunden-Note "A" zu erzeugen und abzuspielen, wenn sie im ersten Beispiel übergehen. Wenn ich den folgenden Code starte, spielt er die 2 Sekunden ab, aber es ist sehr statisch-y. Ich gehe davon aus, dass mit meinen Berechnungen etwas nicht stimmt, aber ich kann nicht genau herausfinden, was genau ist. Hat jemand Erfahrung beim Schreiben eigener digitaler Tonpuffer?

Danke, - Jeff

public class Execution : IDisposable 
{ 
    IntPtr Handle; 
    DirectSound Device; 
    SecondarySoundBuffer Buffer; 
  
    public Execution() 
    { 
     Handle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; 
  
     Device = new DirectSound(); 
     Device.SetCooperativeLevel(Handle, CooperativeLevel.Priority); 
  
     var rate = 44100; 
     var bits = 16; 
     var channels = 1; 
     var waveFormat = new WaveFormat(rate, bits, channels); 
  
     // Create a buffer with 2 seconds of sample data 
     var seconds = 2; 
  
     var bufferDescription = new SoundBufferDescription() { Format = waveFormat, BufferBytes = waveFormat.AverageBytesPerSecond * seconds }; 
     Buffer = new SecondarySoundBuffer(Device, bufferDescription); 
  
     var noteFrequency = 440f;  // A 
     var bufferData = new float[bufferDescription.BufferBytes]; 
  
     var count = 0; 
     for (var sample = 0; sample < bufferDescription.BufferBytes; sample++) 
     { 
      var sampleInSeconds = (float)sample/(float)bufferDescription.BufferBytes * (float)seconds; 
      var value = (float)Math.Sin(2f * Math.PI * noteFrequency * sampleInSeconds); 
      bufferData[sample] = value; 
     } 
  
     Buffer.Write(bufferData, 0, LockFlags.EntireBuffer); 
    } 
  
    public void Execute() 
    { 
     Buffer.Play(0, 0); 
    } 
  
    public void Dispose() 
    { 
     Buffer.Dispose(); 
     Device.Dispose(); 
    } 
} 

Antwort

0

Wegen var bits = 16; des Erwartungswert ein kurz sein sollte (-32768, 32767), so einfach buffer zu einem new short[bufferDescription.BufferBytes]; und der endgültigen Berechnung ersetzt bufferData[sample] = (short)(value * short.MaxValue); hoffentlich beheben soll Geräusch