Я следую этому руководству в блоге Microsoft Developer: https://blogs.msdn.microsoft.com/dawate/2009/06/24/intro-to-audio-programming-part-3-synthesizing-simple-wave-audio-using-c/
Учебник называется «Введение в звуковое программирование», и я выполнил все шаги, но, вероятно, что-то пропустил.
Это фрагмент конфигурации, извлеченный из класса WaveFormatChunk
в его методе омонимов:
sChunkID = "fmt ";
dwChunkSize = 16;
wFormatTag = 1;
wChannels = 2;
dwSamplesPerSec = 44100;
wBitsPerSample = 16;
wBlockAlign = (ushort)(wChannels * (wBitsPerSample / 8));
dwAvgBytesPerSec = dwSamplesPerSec * wBlockAlign;
wBitsPerSample
устанавливает битовую глубину сгенерированной функции, довольно простую до сих пор.
Затем, запустив программу, все работает с этими настройками.Генерация частоты 1 Гц с амплитудой 32760 при 16 бит / 44,1, например, это результат:
1 Гц, 16 бит 44,1 к
И это, очевидно, правильный вывод.
Теперь я процитирую это:
мы используем массив шорт, потому что у нас есть 16-битные выборки, как указано в блоке формата.Если вы хотите переключиться на 8-битный звук, используйте массив байтов.Если вы хотите использовать 32-битное аудио, используйте массив с плавающей точкой.
Говоря о shortArray
в WaveDataChunk
классе
public class WaveDataChunk
{
public string sChunkID; // "data"
public uint dwChunkSize; // Length of header in bytes
public short[] shortArray;
Затем, для 32-битного аудио,изменение shortArray
на число с плавающей точкой:
public float[] shortArray;
и wBitsPerSample
на 32:
wBitsPerSample = 32;
Это результат: 1 Гц, 32 бита, 44,1 К
Практически частота удваивается, и записывается только половина времени.Что я сделал не так??Что мне делать?