Мой DirectX звуковой буфер имеет статический шум

Поэтому мне нравится работать над заданиями в колледже (чтобы сохранить некоторые из моих навыков), и я решил заняться этим:

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

Я запускаю приложение MSVS2015 C#/Console вместе с пакетом SharpDX, который дает мне доступ к некоторым базовым возможностям DirectSound. Я просто пытаюсь создать и сыграть 2-секундную ноту "А", когда они переходят в первый пример. Когда я запускаю следующий код, он воспроизводит 2 секунды, но он очень статичен. Я предполагаю, что с моими вычислениями что-то не так, но я не могу понять, что именно. У кого-нибудь есть опыт написания собственных цифровых звуковых буферов?

Спасибо, Джефф

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();
    }
}

1 ответ

Потому что var bits = 16; ожидаемое значение должно быть коротким (-32768, +32767), поэтому просто замените bufferData на new short[bufferDescription.BufferBytes]; и окончательный расчет bufferData[sample] = (short)(value * short.MaxValue); надо надеяться исправить шум

Другие вопросы по тегам