Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Is there a way to play sound files (whether they be wav, mp3 or another comman format) inside the command line while using a perl script? The \a is boring, I want to play my own error beeps and things of that nature.

Replies are listed 'Best First'.
Re: playing sound files
by the_0ne (Pilgrim) on May 23, 2005 at 20:57 UTC
Re: playing sound files
by zentara (Cardinal) on May 24, 2005 at 10:23 UTC
    You can send audio direct to the /dev/dsp, but it can get tricky depending on your soundcard and sounddrivers. You need to make sure the wav is in the default input format for your sound system, or else you will hear static. Usually, you need to "set" the soundcard parameters before playing anything. Here is a way to generate your wav directly.
    #!/usr/bin/perl use warnings; use strict; use Audio::DSP; $| = 1; my $sample_rate = 22050; #44100 gives best sound, but highest cpu #8000 works my $channels = 1; my $format = AFMT_S16_LE; #8 bit won't work on SBLive my $buffer = 4096; my $dsp = new Audio::DSP(buffer => $buffer, channels => $channels, format => $format, rate => $sample_rate); $dsp->init() || die $dsp->errstr(); ############################################################ my $freq_adj = .1; my $vol = .5; my $toggle = 1; while(1){ make_tone($freq_adj, $vol); if(($freq_adj > 4) or ($freq_adj < .1)){ $toggle *= -1;} $freq_adj += ($toggle * .001); #higher increment numbers are slower #0 is pure tone } sub make_tone { my $rad = 0; my ($freq_adj, $vol) = @_; while ( $rad < 6.283 ){ $rad += $freq_adj; my $raw = ($vol*32768) * sin($rad); #max times my $num = pack( 'V', $raw ); $dsp->dwrite($num); } }

    I'm not really a human, but I play one on earth. flash japh
Re: playing sound files
by ghenry (Vicar) on May 23, 2005 at 21:00 UTC

    Update: Totally misread the node, sorry.

    For a beep, see Escape Sequences

    A \a will do it.

    HTH.

    Walking the road to enlightenment... I found a penguin and a camel on the way.....
    Fancy a yourname@perl.me.uk? Just ask!!!