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


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.