Зробити білий шум


15

Завдання полягає в тому, щоб створити аудіофайл із білого шуму.
Вимоги та інструкції:

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

Бонуси:

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

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


Схоже, що специфікація проблеми описує виклик кольфірування коду, але теги говорять інакше.
підземниймонорельс

Ого! Я це виправлю.
Джуліо Мускарелло

Можливо, виклик слід переглянути, щоб дозволити "існуючі сторонні бібліотеки" замість "будь-якої бібліотеки".
jpmc26

Ви збираєтесь бути наклейкою на те, що шум буде білим? Якщо ви дійсно хочете перевірити: його автокорелограма повинна мати чіткий шип навколо нуля, і майже нічого при будь-якій іншій затримці. Якщо ви не збираєтеся бути наклейкою, я кажу, що безглуздо вказувати, що це білий шум. Просто скажіть шум.
Тім Сегейн

А як щодо WebAudioAPI? Я зашифрував програму js, яка відтворює білий шум
Євгеній Новиков

Відповіді:


4

MATLAB, 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 також існує на Macs, так! На жаль, iTunes не може відтворити отриманий WAV-файл. Не те, що я можу поскаржитися - я вибрав VLc через його прощення та безліч рідних кодеків.
Джуліо Мускарелло

1
Ви можете зберегти п’ять символів, виконавши команду, поки працює робочий каталог /dev.
Девід Річербі

4

Математика 52 - 5 = 47

gекспортує білий шум .wav-файл із sсекундами та 8000 bps.

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

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

g[6]

п.вав


4

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

На жаль, незважаючи на те, що вона була навмисно створена для генерації звуку / аудіо, ця мова тут не виграє. Але це перша поява Supercollider на Code Golf, так що це круто!

Це подання втрачається насамперед через те, що налаштування запису та втілення його є багатослівним процесом завдяки дизайну цієї мови клієнт / сервер. Тим не менш, це класна мова з великою потужністю в дуже маленькому коді, коли ви попросите це зробити речі складніші, ніж просто білий шум.

Тривалість файлу встановлюється зміною значення wait (). Я міг би поставити це в змінну, але насправді немає сенсу в цьому, оскільки про Supercollider немає жодного stdio. Інтерактивність полягає в маніпулюванні кодом в реальному часі, поки сервер все ще грає. По суті, 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
}

один голос за використання Supercollider. Є багато інших головоломок, для яких це було б ВЕЛИКО. Перевірте музику та аудіо
Не те, що Чарльз

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 вихід - це stdout, тому його слід переспрямувати у файл.


Ви можете зберегти близько 1,20 символів, читаючи / dev / random замість / dev / urandom, оскільки швидкість не є обов'язковою.
Джуліо Мускарелло

1
вихід на stdin ?
користувач253751

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.