Time Signal — звуковые сигналы о времени для Linux

В iOS встроена приятная функция — звуковое оповещение о времени, при этом можно задавать частоту оповещения. Я решил реализовать такой же функционал для Linux. Для работоспособности нужен плеер, способный проигрывать аудио файлы с заданной позиции (в данном случае — mplayer).

Скрипт написан на bash, режим задается значением переменной time_signal_alg, задающей алгоритм для воспроизведения зауков. Я начал с реализацию с классических домашних курантов (такие часы с боем были у меня в детстве), срабатывающие каждые 10 минут по схеме: бой в начале часа (количество ударов соответствует времени, т.е. в полдень и полночь — 12 раз), 1, 2, 4 и 5 "тик-так" в 10, 20, 40 и 50 минут соответственно, и 1 удар в середине часа. Это режим работы программы по умолчанию (time_signal_function="chimes").

Также, реализованы режимы: церковный колокол, корабельный колокол (склянки), шофар, гудок, сонар. Например, если Вы хотите себя почувствовать как в подводной лодке, смените режим:

#!/bin/bash
time_signal_alg="sonar_ping";

Звуковое сопровождение предоставлено сайтом http://www.orangefreesounds.com

#!/bin/bash
#
# Time Signal - sound time informer 
# Developed by Andrey Ugnich (http://ugnich.info).
# Project status: Alpha
#
# function	: recomended period(-s)
#
# church_bell	: 10 
# chimes	: 10
# shofar	: 30
# ship		: 30
# beep_beep	: 10
# sonar_ping	: 10

time_signal_alg="chimes";
time_signal_period="10";	#run time_signal_alg every $time_signal_period minutes 

##### ##### ##### ##### ##### ##### ##### ##### ##### #####
#####   DO NOT EDIT ANYTHING BEHIND THIS LINE!  ##### #####
##### ##### ##### ##### ##### ##### ##### ##### ##### #####

# getting hours and minutes

hr=`date +"%l"`;
mn=`date +"%-M"`;

# logging date

date

##### ##### ##### ##### #####

# Debug values
# hr="9";
# mn="20";

# Signal algorithms description start

# Chimes algorithm

function chimes(){

	echo "chimes"
	if   [ "$mn" -eq "0" ]; then

		#ding dong mode start

		for i in $(seq 1 $hr);
		do
			echo Ding Dong $i!
			mplayer ~/time_signal/chimes/Old_Clock_time_signal_at_Midnight.mp3 -ss 1 -endpos 1.6
		done

		#ding dong mode end
	fi

	if   [ "$mn" -eq "30" ]; then
		#ding dong half-hour start
		echo Ding Dong half-hour!
		mplayer ~/time_signal/chimes/Old_Clock_Chimes_at_Midnight.mp3 -ss 1 -endpos 1.6
		#ding dong half-hour end
	fi

	if   [ $(( $time_signal_period % 10 )) -eq "0" ]; then
		#signal at 10, 20, 30, 40, 50 min
		for i in $(seq 1 $(( $mn / 10 )));
		do
			echo Tick Tock 10: $i!
			mplayer ~/time_signal/chimes/Ticking-clock-grandfather.mp3 -endpos 0.8
		done
	fi
}


function church_bell(){

	echo "church_bell"
	if   [ "$mn" -eq "0" ]; then

		#Church bell mode start

		for i in $(seq 1 $hr);
		do
			echo Church bell $i!
			mplayer ~/time_signal/church_bell/Bell-ringing-church-bell.mp3 -ss 1 -endpos 1.6
		done

	elif   [ "$time_signal_period" -eq "15" ]; then
	
		for i in $(seq 1 $(( $mn / 15 )));
		do
			echo Church bell $i!
			mplayer ~/time_signal/church_bell/Church-bell-single-hit.mp3 -endpos 4
		done
	
	elif   [ "$time_signal_period" -eq "10" ]; then
	
		for i in $(seq 1 $(( $mn / 10 )));
		do
			echo Church bell $i!
			mplayer ~/time_signal/church_bell/Ding.mp3 -endpos 2
		done
	
	else

	#each min sound
	mplayer ~/time_signal/church_bell/Church-bell-single-hit.mp3

	fi

	#church_bell mode end
}



function ship(){

	echo "ship"
	
	for i in $(seq 1 $hr);
	do

		double_hits="$(( $double_hits + 1 ))";

		if [ "$double_hits" -eq "5" ]; then
			double_hits="1"
		fi

	done

	if   [ \( "$mn" -eq "30" \) -a \( "$double_hits" -eq "4" \) ]; then
			echo No doubles
	else
		for i in $(seq 1 $double_hits);
		do
			mplayer ~/time_signal/ship/Ship-Bell-Two-time_signal.mp3 -endpos 1

		done

	fi

	if [ "$mn" -eq "30" ]; then

		mplayer ~/time_signal/ship/Ship-Bell-Single-Ring.mp3

	fi
}


function shofar(){

	echo "shofar"
	if   [ "$mn" -eq "0" ]; then

		#shofar mode start

		if [ $(( $hr / 3 )) -gt "0" ]; then

			for i in $(seq 1 $(( $hr / 3 )));
			do
				echo "Triple shofar!"
				mplayer ~/time_signal/shofar/shofar.mp3 -endpos 17
			done
 
		fi
 
 
		if [ $(( $hr % 3 )) -eq "1" ]; then
			mplayer ~/time_signal/shofar/shofar.mp3 -endpos 5.9
		fi

		if [ $(( $hr % 3 )) -eq "2" ]; then
			mplayer ~/time_signal/shofar/shofar.mp3 -endpos 11
		fi

		#shofar mode end

	elif   [ "$mn" -eq "30" ]; then
	
		mplayer ~/time_signal/shofar/shofar.mp3 -endpos 5.9

	
	else

	#each min sound
	mplayer ~/time_signal/shofar/shofar.mp3 -endpos 5.9

	fi

}



function beep_beep(){

	echo "beep_beep"
	if   [ "$mn" -eq "0" ]; then

		#beep mode start

		if [ $(( $hr / 3 )) -gt "0" ]; then

			for i in $(seq 1 $(( $hr / 3 )));
			do
				echo "Triple beep!"
				mplayer ~/time_signal/beep_beep/Answering-machine-beep.mp3
			done
 
		fi
 
 
		if [ $(( $hr % 3 )) -eq "1" ]; then
			mplayer ~/time_signal/beep_beep/Answering-machine-beep.mp3 -endpos 0.05
		fi

		if [ $(( $hr % 3 )) -eq "2" ]; then
			mplayer ~/time_signal/beep_beep/Answering-machine-beep.mp3 -endpos 0.05
			mplayer ~/time_signal/beep_beep/Answering-machine-beep.mp3 -endpos 0.05
		fi

		#beep mode end
	elif   [ $(( $time_signal_period % 10 )) -eq "0" ]; then
	
		#signal at 10, 20, 30, 40, 50 min
		for i in $(seq 1 $(( $mn / 10 )));
		do
			echo Tick Tock 10: $i!
			mplayer ~/time_signal/beep_beep/Beep-tone.mp3
		done

	elif   [ "$mn" -eq "15" ]; then
	
		#signal at 15 min
		mplayer ~/time_signal/beep_beep/Beep-tone.mp3
	
	elif   [ "$mn" -eq "30" ]; then
	
		mplayer ~/time_signal/beep_beep/Beep-tone.mp3
		mplayer ~/time_signal/beep_beep/Beep-tone.mp3
	
	elif   [ "$mn" -eq "45" ]; then
	
		#signal at 45 min
		mplayer ~/time_signal/beep_beep/Beep-tone.mp3
		mplayer ~/time_signal/beep_beep/Beep-tone.mp3
		mplayer ~/time_signal/beep_beep/Beep-tone.mp3
	
	else

	#each min sound
	mplayer ~/time_signal/beep_beep/Beep-tone.mp3

	fi

}



function sonar_ping(){

	echo "sonar_ping"
	if   [ "$mn" -eq "0" ]; then

		#beep mode start

		if [ $(( $hr / 3 )) -gt "0" ]; then

			for i in $(seq 1 $(( $hr / 3 )));
			do
				echo "Triple beep!"
				mplayer ~/time_signal/sonar_ping/Sonar-ping-sound.mp3 -endpos 7.2
			done
 
		fi
 
 
		if [ $(( $hr % 3 )) -eq "1" ]; then
			mplayer ~/time_signal/sonar_ping/Sonar-ping-sound.mp3 -endpos 2
		fi

		if [ $(( $hr % 3 )) -eq "2" ]; then
			mplayer ~/time_signal/sonar_ping/Sonar-ping-sound.mp3 -endpos 4
		fi

		#beep mode end
	elif   [ $(( $time_signal_period % 10 )) -eq "0" ]; then
	
		#signal at 10, 20, 30, 40, 50 min
		for i in $(seq 1 $(( $mn / 10 )));
		do
			echo sonar_ping 10: $i!
			mplayer ~/time_signal/sonar_ping/Ping-sound.mp3 -endpos 2
		done
	
	else

	#each min sound
	mplayer ~/time_signal/sonar_ping/Beep-tone.mp3

	fi

}



# time_signal functions description start


# running time_signal function

if   [ $(( $mn % $time_signal_period )) -eq "0" ]; then

$time_signal_alg

fi