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

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

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

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

# You can set time signal algorithm here:
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
#
# You can set time signal algorithm here:
time_signal_alg="church_bell";
#run time_signal_alg every $time_signal_period minutes
time_signal_period="10";
#
# That's all settings! :)
#
##### ##### ##### ##### ##### ##### ##### ##### ##### #####
#####   DO NOT EDIT ANYTHING BEHIND THIS LINE!  ##### #####
##### ##### ##### ##### ##### ##### ##### ##### ##### #####

# getting hours and minutes

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

# logging date

date

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

# Debug values
#hr="7";
#mn="50";

# 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 ~/timesignal/chimes/Old_Clock_Chimes_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 ~/timesignal/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 ~/timesignal/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 ~/timesignal/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 ~/timesignal/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 ~/timesignal/church_bell/Ding.mp3 -endpos 2
		done
	
	else

	#each min sound
	mplayer ~/timesignal/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 ~/timesignal/ship/Ship-Bell-Two-time_signal.mp3 -endpos 1

		done

	fi

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

		mplayer ~/timesignal/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 ~/timesignal/shofar/shofar.mp3 -endpos 17
			done
 
		fi
 
 
		if [ $(( $hr % 3 )) -eq "1" ]; then
			mplayer ~/timesignal/shofar/shofar.mp3 -endpos 5.9
		fi

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

		#shofar mode end

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

	
	else

	#each min sound
	mplayer ~/timesignal/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 ~/timesignal/beep_beep/Answering-machine-beep.mp3
			done
 
		fi
 
 
		if [ $(( $hr % 3 )) -eq "1" ]; then
			mplayer ~/timesignal/beep_beep/Answering-machine-beep.mp3 -endpos 0.05
		fi

		if [ $(( $hr % 3 )) -eq "2" ]; then
			mplayer ~/timesignal/beep_beep/Answering-machine-beep.mp3 -endpos 0.05
			mplayer ~/timesignal/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 ~/timesignal/beep_beep/Beep-tone.mp3
		done

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

	#each min sound
	mplayer ~/timesignal/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 ~/timesignal/sonar_ping/Sonar-ping-sound.mp3 -endpos 7.2
			done
 
		fi
 
 
		if [ $(( $hr % 3 )) -eq "1" ]; then
			mplayer ~/timesignal/sonar_ping/Sonar-ping-sound.mp3 -endpos 2
		fi

		if [ $(( $hr % 3 )) -eq "2" ]; then
			mplayer ~/timesignal/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 ~/timesignal/sonar_ping/Ping-sound.mp3 -endpos 2
		done
	
	else

	#each min sound
	mplayer ~/timesignal/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

Планы по развитию проекта и расширению функционала:

  1. Независимые модульные алгоритмы
  2. Пользовательские алгоритмы
  3. Будильники
  4. Улучшение интерфейса
  5. Библиотека алгоритмов
  6. Таймеры
  7. Инсталлятор