#!/usr/bin/perl -w use Audio::Data; use Audio::Play; my $freq = 400; my $dot = 0.07; my $dash = 3*$dot; my %morse = ( A => '.-', B => '-...', C => '-.-.', D => '-..', E => '.', F => '..-.', G => '--.', H => '....', I => '..', J => '.---', K => '-.-', L=> '.-..', M => '--', N => '-.', O => '---', P => '.--.', Q => '--.-', R => '.-.', S => '...', T => '-', U => '..-', V => '...-', W => '.--', X => '-..-', Y => '-.--', Z => '--..', 1 => '.----', 2 => '..---', 3 => '...--', 4 => '....-', 5 => '.....', 6 => '-....', 7 => '--...', 8 => '---..', 9 => '----.', 0 => '-----', ' ' => ' '); my $au = Audio::Data->new(rate => 8000); sub morse { my ($au,$s) = @_; while (length $s) { my $sym = $morse{uc(substr($s,0,1))}; if (defined $sym) { while (length($sym)) { for (substr($sym,0,1)) { $au->tone($freq,$dot) if (/\./); $au->tone($freq,$dash) if (/-/); $au->silence(3*$dash) if (/\s/); } $au->silence($dot); substr($sym,0,1) = ""; } $au->silence($dash); } substr($s,0,1) = ""; } } foreach (@ARGV) { morse($au,$_); } my $svr = Audio::Play->new; $svr->play($au); open(F,">out.au") || die; $au->Save(\*F); close(F); system("sox out.au -u data/out1.wav");