They Might Be Finished!

I've been working here and there on setting up a Linux based Dial-A-Song answering machine for They Might Be Giants. I promised it to them in April, really buckled down in October, and I'm finally (almost) done today. If you want to follow the saga read my previous posts explaining the project and detailing some of the issues. I did finally find a voice modem that works with vgetty - an old US Robotics external Voice/Fax/Data modem. After some trial and error I discovered that if I resampled the MP3s to 16-bit, 8Khz, mono sound files they'd work with the modem. It was such a thrill to dial up and hear a TMBG song on the other end.

The basics of the shell script follow - minus the extensive error checking code. If an error occurs anywhere (no CD, can't read the disc, etc.), the script falls back to a default message stored on the hard drive.

#! /bin/bash # ----------------------------------------------------------- # newsong - Leo Laporte, April-December 2003 # ----------------------------------------------------------- # this shell script is designed to be run hourly by cron # it pulls a random MP3 off a CD in drive, combines it with the # outgoing message (message.mp3) on the same disc, then # converts it to the appropriate RMD format and moves it # into the outgoing message directory for vgetty # # requires: # pickrandom - a perl script to pick a random song # SoX for the MP3 to WAV conversion # vgetty's PVF utilities to convert the WAV to RMD # # Written for They Might Be Giants Dial-A-Song # -----------------------------------------------------------

cd /var/spool/voice/work/ touch /var/spool/voice/work/startrun

# mount CD mount /dev/cdrom /mnt/cdrom ls /mnt/cdrom/*.mp3 >/var/spool/voice/work/files

# call an external perl script to select a random title from files tune=$(/var/spool/voice/work/pickrandom) echo "$tune" >currentsong.txt cp -f "$tune" tune.mp3 cp -f /mnt/cdrom/*message.mp3 message.mp3

# convert the MP3s to raw audio (signed, 16-bit, 8khz, mono)... sox -V tune.mp3 -s -w -r 8000 -c 1 tune.raw sox -V message.mp3 -s -w -r 8000 -c 1 message.raw

# combine the raw files... cat message.raw >>tune.raw

# convert to RMD via SoX and PVF tools... sox -V -s -w -r 8000 -c 1 tune.raw -s -w -r 8000 -c 1 standard.wav wavtopvf -16 standard.wav standard.pvf pvftormd US_Robotics 1 standard.pvf standard.rmd

# copy converted file to messages directory... mv -f standard.rmd /var/spool/voice/messages/standard.rmd

touch /var/spool/voice/work/endrun

The little randomizing perl script:

#!/usr/bin/perl # picks a random song from the file list my $tune; open(TUNES, "files") or die 1; srand; do { rand($.) < 1 && ($tune = $_) while ; } until $tune !=~ /message.mp3/i ; print $tune; exit 0;

A cron job will run the script hourly. I've been running it every ten minutes for several days and it's been working without a hitch. (Here's a cool little cron feature I've not used before. If you define a MAILTO environment variable in the crontab, cron will mail the output of each job to that address every time it runs. I've added MAILTO=root to the crontab, and now I can use pine to check the results of each run. Very handy for checking up on problems after the fact. )

Since this is a headless machine I'm planning to add audio error messages using pre-recorded WAVs on the hard drive. That way John can tell how the thing is working just by turning up the speaker.

We're ordering the parts and plan to build the machine this week. I'm going to put it in a small case with a Celeron, small hard drive, and 256MB RAM. It'll probably run SuSE Linux - my current favorite. Total cost well under $500. I'll set it up so that I can SSH into the box if something goes wrong, but it won't normally be connected to the network.

John and John live in Brooklyn so Joshua Brentano and I are hoping to fly out and deliver this to them for Christmas. With any luck it will run without maintenance for years.