Музыка в bash

Bash logoПишу понемноу на bash. Многе узнал в процессе, разные возможности сравнения и подобное. Однажды участвовал в обсуждении книги в читательском клубе и о музыке заговорили, о переводе цифр в музыку. Я подумал-подумал, и решил посмотреть как можно в bash’e музыку сгенерировать (через бипер).

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

В итоге, скрипт принимает два параметра: 1 — это первый музыкальный фрагмент, 2 — второй.

Чтобы сделать скрипт исполняемым, сохраните текст скрипта в файл и выполните в директории с файлом:

chmod +x music

А затем — запускайте скрипт, например так:

./music 1

А вот и текст скрипта:

#!/bin/bash
doo() {
  ( \speaker-test --frequency 262 --test sine > /dev/null )& 
  pid=$!
  \sleep 0.${1}s 
  \kill -9 $pid 
}
re() {
  ( \speaker-test --frequency 293 --test sine > /dev/null )& 
  pid=$!
  \sleep 0.${1}s 
  \kill -9 $pid 
}
mi() {
  ( \speaker-test --frequency 330 --test sine > /dev/null )& 
  pid=$!
  \sleep 0.${1}s 
  \kill -9 $pid 
}
fa() {
  ( \speaker-test --frequency 349 --test sine > /dev/null )& 
  pid=$!
  \sleep 0.${1}s 
  \kill -9 $pid 
}
sol() {
  ( \speaker-test --frequency 392 --test sine > /dev/null )& 
  pid=$!
  \sleep 0.${1}s 
  \kill -9 $pid 
}
sol_sharp() {
  ( \speaker-test --frequency 416 --test sine > /dev/null )& 
  pid=$!
  \sleep 0.${1}s 
  \kill -9 $pid 
}
la() {
  ( \speaker-test --frequency 440 --test sine > /dev/null )& 
  pid=$!
  \sleep 0.${1}s 
  \kill -9 $pid 
}
si() {
  ( \speaker-test --frequency 494 --test sine > /dev/null )& 
  pid=$!
  \sleep 0.${1}s 
  \kill -9 $pid 
}
doo1() {
  ( \speaker-test --frequency 538 --test sine > /dev/null )& 
  pid=$!
  \sleep 0.${1}s 
  \kill -9 $pid 
}

elochka() {
	doo 2
	la 2
	la 2
	sol 2
	la 2
	fa 2
	doo 2
	doo 2
	doo 2
	la 2
	la 2
	si 2
	sol 2
	doo1 6
	doo1 2
	re  2
	re 2
	si 2
	si 2
	la 2
	sol 2
	fa 2
	doo 2
	la 2
	la 2
	sol 2
	la 2 
	fa 4
}

kuznechik() {
	la 2
	mi 2
	la 2
	mi 2
	la 2
	sol_sharp 2
	sol_sharp 4
	sol_sharp 2
	mi 2
	sol_sharp 2
	mi 2
	sol_sharp 2
	la 2
	la 4
	la 2
	mi 2
	la 2
	mi 2
	sol_sharp 2
	sol_sharp 4
	sol_sharp 2
	mi 2
	sol_sharp 2
	mi 2
	sol_sharp 2
	la 6
	la 2
	si 2
	si 1
	si 1
	si 2
	si 2
	doo1 2
	doo1 1
	doo1 1
	doo1 2
	doo1 2
	doo1 2
	si 2
	la 2
	sol_sharp 2
	la 2
	la 4
	la 2
	si 2
	si 1
	si 1
	si 2
	si 2
	doo1 2
	doo1 1
	doo1 1
	doo1 2
	doo1 2
	doo1 2
	si 2
	la 2
	sol_sharp 2
	la 6
}

echo "Начинаем!"
#иногда без такой задержки первая нота проглатывается
doo 1
sleep 2s

if [[ $1 = 1 ]]; then
  elochka
elif [[ $1 = 2 ]]; then
  kuznechik
else
  echo "Непонятно..."
fi

Только не получилось полностью убрать вывод speaker-test. Просто прикольно, никаких бест-практис 🙂

 


Be the first to comment

Leave a Reply

Ваш Mail не будет опубликован.


*