![]() |
IntroBooting Debian takes a while, so I wanted to have it beep, when it's ready for use. Also, as I turn off the nslu2 via a remote control command, I like to know if it's actually started to shut down. ScriptPut a script like the following in #! /bin/sh
### BEGIN INIT INFO
# Provides: beep
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: S 0 1 6
# Short-Description: Beeps that indicate startup and shutdown
### END INIT INFO
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
NAME=beep
BEEP=/usr/bin/$NAME
MELODY_START="-f 65.4064 -l 100 -n -f 130.813 -l 100 -n -f 261.626 -l 100 -n -f 523.251 -l 100 -n -f 1046.50 -l 100 -n -f 2093.00 -l 100 -n -f 4186.01 -l 100"
MELODY_STOP="-f 523.251 -l 100 -D 100 -n -f 391.995 -l 100 -D 100 -n -f 329.628 -l 100 -D 100 -n -f 261.626 -l 200"
SCRIPTNAME=/etc/init.d/$NAME
ARGS="-e /dev/input/event0"
# Exit if the package is not installed
[ -x "$BEEP" ] || exit 0
case "$1" in
start)
$BEEP $ARGS $MELODY_START
;;
stop)
$BEEP $ARGS $MELODY_STOP
;;
restart|force-reload)
# Do nothing
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
Note: This Howto is also applicable for SlugOS. On Debian, /usr/bin/beep is installed by the "beep" package. Using ledsAlternatively make BEEP="/usr/bin/leds" and ARGS="beep" if you have ProblemsDid not work for me. Running the script works flawless but it won't beep on boot or shutdown. I'm using NSLU2 Stable 4.0r3. Shame on me: I simply forgot to do a Play tones from a fileI hacked together a simple bash script that plays the notes from a file, instead of having to specify them as arguments. #! /bin/bash
# slugtunes.sh - Play simple notes via the nslu2 speaker
# Usage: slugtunes.sh notes.txt
# notes.txt is a tab delimited file with the following format
# freq(hz) duration(ms) delay(ms)
# lines beginning with #'s are treated as comments
#
# Copyright Rajiv Narayan, 12.19.2008
# Based on the leds script in nslu2-utils debian package
BEEP="/usr/bin/beep"
if [ ! -f "$1" ]; then
echo "Usage: $0 notes.txt"
exit 1
else
declare -a notes
arg=
#read tunes
notes=(`grep -v '^#' $1`)
nnotes=$((${#notes[*]}/3))
if [ -x $BEEP ];
then
#search for speaker device
devices=`ls -d /sys/class/input/event*`
for device in $devices
do
module=`egrep PHYSDEVDRIVER $device'/uevent' | cut -d '=' -f 2`
if test "$module" = "ixp4xx-beeper";
then
devname=`basename "$device"`
arg="-e /dev/input/"$devname
break
fi
done
# play tunes
for i in $(seq 1 $nnotes)
do
st=$((($i-1)*3))
$BEEP $arg -f ${notes[$st]} -l ${notes[$(($st+1))]} -d ${notes[$(($st+2))]} 2>/dev/null
done
else
echo "$BEEP not found"
fi
fi
Sample input file# Beethoven's Für Elise # freq(hz) length(ms) pause(ms) 659 120 120 622 120 120 659 120 120 622 120 120 659 120 120 494 120 120 587 120 120 523 120 120 440 120 140 Play Nokia RTTL Ringtone from a fileHere's a tcl script that plays Nokia RTTL (Ring Tone Transfer Language) ring tones from a file as beeps. You need tcl installed but that's just an apt-get away for a Debian user:
#! /usr/bin/env tclsh
# nokia2beeps.tcl - Play an RTTL ringtone file as beeps
# Usage: ./nokia2beeps.tcl ringtone_file
set default_octave 4
set default_duration 4
set default_beat 100
set base_time 200000
array set scale {
C0 16.35 C#0 17.32 Db0 17.32 D0 18.35 D#0 19.45 Eb0 19.45
E0 20.60 F0 21.83 F#0 23.12 Gb0 23.12 G0 24.50 G#0 25.96
Ab0 25.96 A0 27.50 A#0 29.14 Bb0 29.14 B0 30.87 C1 32.70
C#1 34.65 Db1 34.65 D1 36.71 D#1 38.89 Eb1 38.89 E1 41.20
F1 43.65 F#1 46.25 Gb1 46.25 G1 49.00 G#1 51.91 Ab1 51.91
A1 55.00 A#1 58.27 Bb1 58.27 B1 61.74 C2 65.41 C#2 69.30
Db2 69.30 D2 73.42 D#2 77.78 Eb2 77.78 E2 82.41 F2 87.31
F#2 92.50 Gb2 92.50 G2 98.00 G#2 103.83 Ab2 103.83 A2 110.00
A#2 116.54 Bb2 116.54 B2 123.47 C3 130.81 C#3 138.59 Db3 138.59
D3 146.83 D#3 155.56 Eb3 155.56 E3 164.81 F3 174.61 F#3 185.00
Gb3 185.00 G3 196.00 G#3 207.65 Ab3 207.65 A3 220.00 A#3 233.08
Bb3 233.08 B3 246.94 C4 261.63 C#4 277.18 Db4 277.18 D4 293.66
D#4 311.13 Eb4 311.13 E4 329.63 F4 349.23 F#4 369.99 Gb4 369.99
G4 392.00 G#4 415.30 Ab4 415.30 A4 440.00 A#4 466.16 Bb4 466.16
B4 493.88 C5 523.25 C#5 554.37 Db5 554.37 D5 587.33 D#5 622.25
Eb5 622.25 E5 659.26 F5 698.46 F#5 739.99 Gb5 739.99 G5 783.99
G#5 830.61 Ab5 830.61 A5 880.00 A#5 932.33 Bb5 932.33 B5 987.77
C6 1046.50 C#6 1108.73 Db6 1108.73 D6 1174.66 D#6 1244.51 Eb6 1244.51
E6 1318.51 F6 1396.91 F#6 1479.98 Gb6 1479.98 G6 1567.98 G#6 1661.22
Ab6 1661.22 A6 1760.00 A#6 1864.66 Bb6 1864.66 B6 1975.53 C7 2093.00
C#7 2217.46 Db7 2217.46 D7 2349.32 D#7 2489.02 Eb7 2489.02 E7 2637.02
F7 2793.83 F#7 2959.96 Gb7 2959.96 G7 3135.96 G#7 3322.44 Ab7 3322.44
A7 3520.00 A#7 3729.31 Bb7 3729.31 B7 3951.07 C8 4186.01 C#8 4434.92
Db8 4434.92 D8 4698.64 D#8 4978.03 Eb8 4978.03
}
proc nokia2scale {note} {
global default_octave
set note [string toupper [regexp -inline {[a-gA-GpP].*} $note]]
if {$note != "P" && ![regexp {\d$} $note]} {
append note $default_octave
}
set note [string map {. ""} $note]
return $note
}
proc nokia2length {note} {
global default_duration default_beat base_time
set duration [regexp -inline {^\d+} $note]
if {$duration == ""} {
set duration $default_duration
}
return [expr {$base_time/$default_beat/$duration}]
}
proc playnote {note} {
global scale
set note [string trim $note]
if {$note == ""} return
puts -nonewline "$note "
flush stdout
set delay [nokia2length $note]
set note [nokia2scale $note]
if {$note == "P"} {
after $delay
} else {
exec beep -f $scale($note) -l $delay
}
}
proc playRTTL {str} {
global default_octave default_beat default_duration
foreach x [regexp -inline -all {[dob]=\d+} $str] {
regexp {(\w)=(\d+)} $x -> param value
switch $param {
d {set default_duration $value}
o {set default_octave $value}
b {set default_beat $value}
}
}
regexp {\:([^\:]+)$} $str -> str
puts "beat: $default_beat"
foreach x [split $str ,] {
playnote $x
}
puts done.
}
set f [open [lindex $argv 0]]
set data [read $f]
close $f
playRTTL $data
Sample RTTL file (Jingle Bells)JingleBells:d=4,o=5,b=125:8g,8e6,8d6,8c6,2g,8g,8e6,8d6,8c6,2a,8a,8f6,8e6, 8d6,8b,8g,8b,8d6,8g.6,16g6,8f6,8d6,2e6,8g,8e6,8d6,8c6,2g,16f#,8g,8e6, 8d6,8c6,2a,8a,8f6,8e6,8d6,8g6,16g6,16f#6,16g6,16f#6,16g6,16g#6,8a.6, 16g6,8e6,8d6,c6,g6,8e6,8e6,8e.6,16d#6,8e6,8e6,8e.6,16d#6,8e6,8g6,8c.6, 16d6,2e6,8f6,8f6,8f.6,16f6,8f6,8e6,8e6,16e6,16e6,8e6,8d6,8d6,8e6,2d6
view ·
edit ·
print ·
history ·
Last edited by slebetmanyahoocom.
Based on work by slebetmanyahoocom, Rajiv Narayan, setti, Nightwolf, astraw, Robert, MarkStinson, hs, and TBBle. Originally by hs. Page last modified on March 17, 2009, at 01:21 AM
|