Генерировать белый шум


15

Задача состоит в том, чтобы создать аудиофайл из белого шума.
Требования и инструкции:

  • Ваша программа должна сгенерировать аудиофайл, содержащий только белый шум, то есть его интенсивность одинакова для всех (разумных) частот и отлична от нуля [см. Пример графика ];
  • Нужно уметь проигрывать аудиофайл на последней версии VLC [на момент написания своего ответа];
  • Программа не нуждается в криптографически сильной случайности, randфункциях или чтении из нее /dev/rand- это нормально;
  • Программа должна быть способна генерировать не менее 1 часа звука, по крайней мере, теоретически (то есть системные ограничения, такие как максимальный размер файла, не применяются);
  • Ваша оценка - это количество байтов в вашем исходном коде плюс все применяемые бонусы;
  • Использование любой сторонней, внешней библиотеки в порядке;
  • Программа должна работать без доступа в интернет.

Бонусы:

  • -15%: позволяет указать формат аудиофайла (как минимум два варианта; количество возможных вариантов не меняет счет);
  • -10%: Позволяет указать продолжительность аудио файла;
  • -5%: позволяет указать битрейт аудиофайла.

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


Спецификация проблемы, по-видимому, описывает проблему, связанную с обработкой кода, но теги говорят об обратном.
— подземный

Упс! Я исправлю это.
— Джулио Мускарелло

Возможно, проблема должна быть пересмотрена, чтобы разрешить только «существующие сторонние библиотеки» вместо «любой библиотеки».
— jpmc26

Вы собираетесь быть сторонником шума, являющегося белым? Если вы действительно хотите проверить: его автокоррелограмма должна иметь четкий всплеск около нуля и почти ничего при любой другой задержке. Если вы не собираетесь быть сторонником, я говорю, что бессмысленно указывать, что это будет белый шум. Просто скажи шум.
— Тим Сегин

Как насчет WebAudioAPI? Я кодировал js программу, которая играет белый шум
— Евгений Новиков

Ответы:


4

МАТЛАБ, 25

wavwrite(rand(8e3,1),'a')

записывает новый WAV-файл на диск с именем a. Он имеет частоту дискретизации 8 кГц и 16 бит на выборку в целочисленном формате со знаком. Исходные данные равномерно распределены по интервалу [0,1], который сопоставляется с интервалом [0,32767]после преобразования в целочисленный формат.

MATLAB, 28 - 4 (10% + 5%) = 24

Я не уверен, что имел в виду ОП о том, как настройки могут храниться в переменных, но я интерпретировал это так, как это удобно для этого случая. При условии, что:

  • Желаемая скорость передачи (в битах / секунду) предоставляется пользователем в переменной b. Биты на семпл жестко закодированы в 16.

  • Желаемая продолжительность файла (в образцах) указана в переменной d.

Результат:

wavwrite(rand(d,1),b/16,'a')

MATLAB, 16 - 4 (15% + 10%) = 12

Добавляя еще один слой для получения бонусов, я делаю еще одно предположение: в переменной должна быть указана желаемая функция для вывода файла f. Тогда код упрощается до:

f(rand(d,1),'a')

Допустимые значения для функции:

f = @wavwrite

или

f = @auwrite

Каждая функция заставит вышеуказанный фрагмент записать файл соответствующего формата (WAV или .au) с частотой дискретизации 8 кГц с указанной длительностью. Я снял бонус за спецификацию битрейта здесь, потому что по auwriteумолчанию 8 бит на семпл вместо 16, как wavwriteделает. Я не вижу способа гармонизировать их, не используя больше символов.


10

Баш, 34

dd if=/dev/sda of=file.wav count=1

Если вы не хотите «случайности» жесткого диска, (намного медленнее)

dd if=/dev/random of=file.wav count=9

СПИН, 28

word x=0
repeat
 word[?x]=?x

4
Почему-то я не думаю, что заголовок файла может быть совершенно случайным / таким же, как первый сектор жесткого диска
— Джон Дворжак

1
Герр Доктор может быть прав, если тестовый жгут VLC. VLC довольно прощающий.
— Джонатан Ван Матре

1
Вы создали шум, но разве это белый шум?
— Стивен Мелвин

1
/ dev / random также существует на Mac, ура! К сожалению, iTunes не может воспроизвести полученный WAV-файл. Не то чтобы я мог пожаловаться - я выбрал VLc из-за его прощения и множества нативных кодеков.
— Джулио Мускарелло

1
Вы можете сохранить пять символов, выполнив команду, пока рабочий каталог /dev.
— Дэвид Ричерби

4

Mathematica 52 - 5 = 47

gэкспортирует белый шум. WAV файл sсекунд и 8000 бит / с.

g@s_:=Export["p.wav",RandomReal@{-1,1}~Play~{t,0,s}]

Пример: экспортируется 6-секундный файл белого шума.

g[6]

p.wav


4

Суперколлайдер, 89 - 10% = 80,1 байта

К сожалению, несмотря на то, что он специально сделан для создания звука / звука, этот язык здесь не победит. Но это первое появление Supercollider на Code Golf, так что это круто!

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

Продолжительность файла задается путем изменения значения wait (). Я мог бы поместить это в переменную, но на самом деле в этом нет никакого смысла, так как Supercollider не имеет никакого упоминания о студии. Интерактивность заключается в манипулировании живым кодом, пока сервер все еще играет. По сути, IDE - это ввод-вывод (если вы не создадите пользовательский интерфейс для своего создания).

Вот версия для гольфа:

{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

Вот версия для игры в гольф с возможностью записи в формате aiff или wav и указанием примера формата (int16, int8 и float - все варианты). К сожалению, даже со всеми бонусами, версия выше тарифов лучше. Это будет 139 - 30% = 97,3 байта.

s.recSampleFormat='int16';s.recHeaderFormat='wav';{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

А вот последняя версия последнего, так что вы можете видеть, что происходит.

s.recSampleFormat='int16';
s.recHeaderFormat='wav';

{WhiteNoise.ar(1)}.play;
s.prepareForRecord;

Routine.run{
    s.record;
    wait(99);
    s.stopRecording
}

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

4

Bash + ALSA, оценка: 44 (52 символа - (10% + 5%) бонусов)

Дольше, чем другой bashответ, но принимает длительность и битрейт. Также добавляет в файл достаточно правильный заголовок, поэтому должен быть достаточно переносимым:

arecord -r$2|head -c44;head -c$[$2*$1] /dev/urandom

Сохраните как скрипт chmod +xи запустите:

$ ./wav.sh 1 44100 > c.wav
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 44100 Hz, Mono
$ 

Обратите внимание, что .wav выводится на стандартный вывод, поэтому он должен быть перенаправлен в файл.


Вы можете сэкономить около 1,20 символов, читая / dev / random вместо / dev / urandom, так как скорость не обязательна.
— Джулио Мускарелло

1
вывод на стандартный ввод ?
— user253751

0

C 127 115 байтов

#define H htonl
main(c){for(write(1,(int[]){H(779316836),H(24),-1,H(2),H(8000),H(1)},24);;write(1,&c,1))c=rand();}

Большая часть кода записывает заголовок для файла * .au. Это печатает псевдослучайный звуковой файл в стандартный формат.

Частота дискретизации может быть скорректирована путем изменения 8000.

Продолжительность можно регулировать, нажимая ctrl-cвсякий раз, когда вы хотите остановиться :-)


0

JavaScript, 167 байт

ВНИМАНИЕ: Уменьшите громкость перед запуском. Белый шум противный

Не создает файл, может быть, не то, что ожидалось.

-4 байта взломать игровой шум только на левом канале

c=new AudioContext()
n=c.createScriptProcessor(s=512)
n.connect(c.destination)
n.onaudioprocess=e=>{a=s;while(a--){e.outputBuffer.getChannelData(0)[a]=Math.random()}}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.