Может кто-нибудь объяснить, как работает этот класс (который генерирует синусоидальную частоту, которую можно изменить)? - PullRequest
0 голосов
/ 28 февраля 2019

это код, который я где-то нашел в Интернете;это работает довольно хорошо, но я не совсем понимаю, как это преобразовать кучу математики в звуковую волну:

    public static void Beeps(int Amplitude, int Frequency, int Duration)
    {
        double A = ((Amplitude * (System.Math.Pow(2, 15))) / 1000) - 1;
        double DeltaFT = 2 * Math.PI * Frequency / 44100.0;

        int Samples = 441 * Duration / 10;
        int Bytes = Samples * 4;
        int[] Hdr = 
        { 0X46464952, 36 + Bytes, 0X45564157, 
        0X20746D66, 16, 0X20001, 44100, 176400, 0X100004, 
        0X61746164, Bytes };
        using (MemoryStream MS = new MemoryStream(44 + Bytes))
        {
            using (BinaryWriter BW = new BinaryWriter(MS))
            {
                for (int I = 0; I < Hdr.Length; I++)
                {
                    BW.Write(Hdr[I]);
                }
                for (int T = 0; T < Samples; T++)
                {
                    short Sample = System.Convert.ToInt16(A * Math.Sin(DeltaFT * T));
                    BW.Write(Sample);
                    BW.Write(Sample);
                }
                BW.Flush();
                MS.Seek(0, SeekOrigin.Begin);
                using (SoundPlayer SP = new SoundPlayer(MS))
                {
                    SP.PlaySync();
                }
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Этот ответ имеет хороший обзор того, как работают файлы wav:
Просто сэмплируйте сигнал с фиксированными интервалами и запишите амплитуду каждого интервала в ваш файл.
Вот что BW.Write звонки делают.T представляет время.

Для воспроизведения звука эти данные идут после секции Hdr, которая является просто правильным заголовком для стандартного файла .wav.0X46464952 означает «RIFF», а 0X45564157 - «WAVE».Игрок должен знать, с какой частотой была взята волна.В данном случае это 44100, что является общим стандартом.

0 голосов
/ 28 февраля 2019

Похоже, все, что он делает, это звуковой сигнал на определенных частотах.Причина, по которой математика преобразуется в звук, заключается в том, что когда данные поступают на динамик, они действительно сообщают ему, как вибрировать в этот момент.

Если вы спрашиваете о том, как работает звук, он основан на том, как вибрациидвигаться по воздуху.Вибрации существуют как волны;они буквально сотрясают воздух определенным образом, который ваш мозг интерпретирует как шум через ваши уши.Если звук имеет более высокую высоту, звуковые волны находятся ближе друг к другу, а если это более низкая высота, они находятся дальше.Вот почему компьютер может «преобразовать кучу математики в звуковую волну», потому что на самом деле это все звук: постоянно манипулируемая волна.Этот метод принимает длину волны (Frequency) и создает синусоидальную волну на ее основе, преобразует ее в байты и передает ее на динамик с определенной громкостью (Amplitude) и в течение определенной продолжительности.Классные вещи, верно?

Кроме того, вы смотрите на «метод», а не на класс.:)

Подробнее о звуке, если вам интересно: https://en.wikipedia.org/wiki/Sound#Sound_wave_properties_and_characteristics

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...