LINUX.ORG.RU
ФорумTalks

Консольный композитор?


0

0

Думаю, многие из вас пробовали пропускать различные файлы или /dev/urandom через /dev/dsp, но увы, на выходе получается не музыка, а щелчки или прочий белый шум. Так вот, сегодня я представляю вам свой скрипт, позволяющий извлекать из /dev/dsp довольно приятную мелодию, а не белый шум. Вот он:
$ while true; do yes `head -c 23 /dev/urandom` > /dev/dsp & sleep .2 && kill $! && sleep .01; done 2>/dev/null

Запускается в bash, В zsh придумывайте сами. Есть и другие варианты.
(перед применением скрипта следует отключить подстановку истории через set +H, иначе шелл может ругаться на event not fount)
$ while true; do yes `head -c 23 /dev/urandom` | aplay & sleep .2 && kill $! && sleep .01; done 2>/dev/null

То же самое, только не требует эмуляции OSS. У некоторых нет /dev/dsp
/dev/dsp можно заменить на /dev/audio. Другие варианты сами предложите.
$ while true; do yes `head -c 100 /dev/urandom` > /dev/dsp & sleep .2 && kill $! ; done 2>/dev/null

А вот первый вариант, несколько менее мелодично, но кому-то может понравиться.
Как понимаете, можно менять числа и получать мелодии разной тональности и мелодичности. Если что-то интересное придумаете, прошу поделиться.

★★★★★
Ответ на: комментарий от dagger

Я же специально поставил $, а не # — под юзером, который есть в группе audio (хотя, наверное, можно и под рутом)

Xenius ★★★★★
() автор топика

зачет тебе мен, автоматом. прямо только что настраивали слаку, надо было звук проверить - захожу в толксы - а тут сразу и подсказка :)

k0l0b0k ★★
()

неплохо, напоминает музыку народов севера. :-)

splinter ★★★★★
()
Ответ на: комментарий от k0l0b0k

> самое главное - попробуй потом заткнуть эту какофонию :)

я наверное примитивен, но я сделал так:
# fuser /dev/dsp
/dev/dsp:            11772
# kill -9 11772

а музычка ничотак. однообразная правда.

Komintern ★★★★★
()

/me запустил несколько экземпляров и наслаждается полифонией.

Deleted
()

Вот так лучше, не оставляет в фоне процессов после выхода:
while yes `head -c 23 /dev/urandom` | aplay & sleep .2 && kill $! && sleep .01; do : ; done 2>/dev/null

Xenius ★★★★★
() автор топика

Хм, а нет, всё равно в фоне звук остается... Но так, зато, короче:
while yes `head -c 23 /dev/urandom` > /dev/dsp & do sleep .2 && kill $! && sleep .01; done 2>/dev/null

Xenius ★★★★★
() автор топика

Еще бы неплохо сказать как вырубить звук на выходе, после ctrl+c остается фоновый звук...

gh0stwizard ★★★★★
()

А вот вы все пробуете, а ведь есть вероятность, что /dev/urandom выдаст последовательность типа "`rm -rf /*`" и она выполнится.
И самое страшное, что я крутил это несколько часов... И временами слышал перерывы в звучании...

Xenius ★★★★★
() автор топика

yes `head -c $(($RANDOM%500)) /dev/urandom` > /dev/dsp

Не так однообразно

Можно рандом и в другие части засунуть

EmStudio
()
Ответ на: комментарий от Xenius

> Только вот... Скрипт-то не безопасен, хе-хе

Сделай генерацию поменьше - ничего страшного создать оно не сможет

EmStudio
()
Ответ на: комментарий от Deprecated

>(нет в наличии dsp && urandom)

сказали же - в баше! в венде то нет и баша

Klayman
()
Ответ на: комментарий от Xenius

> А вот вы все пробуете, а ведь есть вероятность, что /dev/urandom выдаст последовательность типа "`rm -rf /*`" и она выполнится.

Где она выполнится? Запускал в директории yes rm * и yes "rm *", все файлы целы.

question4 ★★★★★
()
Ответ на: комментарий от question4

Ага, если вместо $(($RANDOM%500)) поставить $(($RANDOM%35)) или даже $(($RANDOM%15)), получается намного приятнее.

question4 ★★★★★
()
Ответ на: комментарий от Xenius

>> А оно играет только, не знаю, как записать...

Вместо "> /dev/dsp" - ">> /path/to/file" и открыть получившийся файл как "Raw PCM" в любом аудиоредакторе.

narayan
()
Ответ на: комментарий от Deprecated

> нет в наличии dsp && urandom

Если есть ALSA — есть asound. Вариант для него есть в самом начале.

question4 ★★★★★
()
Ответ на: комментарий от Xenius

Хм, а оно не выполняется.
$ echo `cat evilfile`
; echo something ; dewfgrgdshdshdhshsdb
Всё-таки, не опасен на моей версии coreutils

Xenius ★★★★★
() автор топика
Ответ на: комментарий от narayan

Получится только если файл будет записываться достаточно медленно (будет на медленном носителе), так как скорость винта больше скорости /dev/dsp:
$ time head -c 102400 /dev/urandom > /dev/dsp
real 0m13.076s
user 0m0.004s
sys 0m0.236s
$ bc -lq <<<'100/13.076'
7.64759865402263689201
$ dd if=/dev/zero of=/dev/dsp count=100
100+0 записей считано
100+0 записей написано
скопировано 51200 байт (51 kB), 6,66731 c, 7,7 kB/c

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

> $ echo `cat evilfile`

В evilfile записал «rm *». Результат — многократно пишет «rm <список файлов в текущей директории>», но ничего не стирает.

> не опасен на моей версии coreutils

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

question4 ★★★★★
()
Ответ на: комментарий от question4

Я только у себя проверил. Но судя по тому, что у тебя -- достаточно написать что-то вроде $(rm *) или : ; rm * ;
Только осторожней, может и начать удалять.
Лучше пробовать на yes.

Xenius ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.