john1990_1 Ответов: 3

Как создать случайные звуковые частоты, которые теоретически могут производить разумный звук?


Я пишу статью о том, что с бесконечным временем, если мы запустим случайные частоты, мы получим разумный звук, как показано ниже, я сделал для случайных изображений (видео) и включил этот код в статью, чтобы объяснить свою точку зрения, а также не могли бы вы научить меня, как производить, например, основной звуковой сигнал, который переходит от высокого тона к низкому или наоборот?

Что я уже пробовал:

private void Timer1_Tick(object sender, EventArgs e)
        {
            for (int x = 0; x < 400; x++)
                for (int y = 0; y < 400; y++)
                {
                    g.DrawRectangle(new Pen(Color.FromArgb(255,
                        RN.Next(256),
                        RN.Next(256),
                        RN.Next(256))),
                        x,y,
                        1,1);
                }
        }





Я не думаю, что beep будет делать работу разумного звука, как человеческая речь.

В ТИКе таймера 1 мс:


using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
public static extern bool Beep(int freq, int duration);

Beep.Play(RN.Next(MAX_HZ),1);


Делает ли он свою работу? если да, то как я не знаю о звуке, то какова частота диапазона в Гц, которую я должен запустить.

3 Ответов

Рейтинг:
1

lmoelleb

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

Увеличение высоты тона (например, уменьшение высоты тона будет просто теми же самыми данными в обратном направлении) в основном означает, что частота должна увеличиваться по мере воспроизведения файла. Скорее всего, вам понадобится sin-wave для вашего аудио, так как он звучит немного лучше, но если вы просто хотите действительно простой код, придерживайтесь прямоугольной волны.

Таким образом, цикл по длине буфера данных вашего волнового файла.
Типично вы бы использовали sin(x * <frequencydefiningconstant>) * <amplitude> где X-позиции в звуковом буфере. Если вы измените значение в sin на нелинейное выражение, вы получите изменение высоты тона. так что попробуй sin(x^y * <frequencydefiningconstant>) * <amplitude> (y должен быть очень близок к 1, так как сэмплы приходят довольно быстро в волновом файле). Не уверенный, что это лучший результат, вы можете играть с другими нелинейными функциями... или ждать и надеяться, что кто - то придет с лучшим ответом.

Я бы ожидал, что преобразование Фурье-это математически правильный способ сделать это, поскольку оно может преобразовываться между частотной областью (где вы можете указать линейное увеличение/уменьшение) и временной областью (ваш индекс выборки в волновом файле). Если это правильный подход для вашей статьи, вероятно, зависит от аудитории.


john1990_1

Какой класс, ссылку или самородок я должен использовать для создания аудио?

lmoelleb

Без понятия. Я нуждался в нем еще в дни .NET 1.0, поэтому мне пришлось написать свой собственный, я просто погуглил формат. PCM (несжатый). Может быть, Наудио сможет это сделать, но не уверен.

john1990_1

Спасибо, пожалуйста, смотрите обновленный вопрос.

Рейтинг:
1

john1990_1

Я и раньше знал про обезьяну, но как это связано со вторым звеном? кроме того, есть какая-нибудь информация о том, как генерировать аудио?

john1990_1

Спасибо, пожалуйста, смотрите обновленный вопрос.

Рейтинг:
0

GenJerDan

Не решение, а скорее предложение. Если вы имеете в виду музыку, когда говорите "разумный звук", я бы предложил генерировать случайные целочисленные значения от 0 до 127, используя это значение, как если бы это была MIDI-нота, а затем искать значение частоты этой ноты с помощью какой-то таблицы поиска. Пример: MIDI 60 = средний C = 261,6 Гц

Это для обычной "западной" диатонической музыки. Есть и другие.

Что касается воспроизведения звука, посмотрите на public static void Beep (int frequency, int duration) для наиболее простого способа его выполнения. Есть лучшие способы, используя компьютерные звуковые функции, а не звуковой сигнал.


john1990_1

Спасибо, пожалуйста, смотрите обновленный вопрос.