В 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
Планы по развитию проекта и расширению функционала:
- Независимые модульные алгоритмы
- Пользовательские алгоритмы
- Будильники
- Улучшение интерфейса
- Библиотека алгоритмов
- Таймеры
- Инсталлятор