Acme-Morse-Audible

 view release on metacpan or  search on metacpan

Audible.pm  view on Meta::CPAN

package Acme::Morse::Audible;
use 5.006;
use strict;
use warnings;

our $VERSION = '1.10';

my $hearable = "\x4d\x54\x68\x64\0\0\0\6\0\0\0\1\x60\0\115\124\162\153";
my($long,$short)=("\xFF\x40\x90\x56\x50\x82\xDF\0\x80\x56\x00","\xFF\x40\x90\x56\x50\xFF\x40\x80\x56\x00");

sub record{
	local $_ = unpack 'b*', pop;
	s/(.)/$1?$long:$short/eg;
	$_="\0\xC0\x11\0\xFF\x59\x02\0\0$_\0\xFF\x2F";
	$hearable . pack('L', length($_)) . $_;
}

sub play{
	local $_ = pop;
	chomp;
	s/^$hearable.{4}.+?\0{2}//;s/\0\xFF\x2F$//;
	s/\xFF\x40(.+?)\x56\0/length($1)==7?1:0/ge;
	pack 'b*', $_;
}

open 0 or die "Cannot hear '$0'.\n";
(my $telegram = do{local $/=undef;<0>}) =~ s/.*^\s*(use|no)\s+Acme::Morse::Audible\s*;\n//sm;
close 0;

if($1 eq 'use'){
	if($telegram =~ /^$hearable/){
		eval play $telegram;
	}else{
		open my $rec,'>',$0 or die "Cannot record '$0'.\n";
		binmode($rec);
		print $rec "use Acme::Morse::Audible;\n" . record $telegram;
		close $rec;
	}
	exit;
}else{
	if($telegram =~ /^$hearable/){
		open my $pl,'>',$0 or die "Cannot record '$0'.\n";
		print $pl "no Acme::Morse::Audible;\n" . play $telegram;
		close $pl;
		exit;
	}
}
1;
		

__END__

=head1 NAME

Acme::Morse::Audible - Audio(Morse) Programming with Perl 

=head1 SYNOPSIS

	use Acme::Morse::Audible;
	print <<Message;
	"For there is no enchantment against Jacob, no divination against Israel; now it shall be said of Jacob and Israel, `What has God wrought!'"
	
		--Bible, Numbers 23:23
		
	(The first telegraphic message. Dispatched by Samuel F. B. Morse on May 24, 1844 from Washington D.C. to Baltimore.)
	Message

=head1 DESCRIPTION

The first time a program is run under C<use Acme::Morse::Audible;>, it will become
a playable MIDI file with the Morse encoding of the code. (Dots and dashes encoding, actually. 
Morse Code contains only alphabet.)
The program will continue to run as it did before, but will now also be audible.
(Some players might not play it unless you rename it to .mid.)

=head2 STATUS QUO ANTE BELLUM

	no Acme::Morse::Audible;

Running the audible program with C<no Acme::Morse::Audible;> instead of C<use Acme::Morse::Audible;> will make
it readable back again (and no longer audible). The C<no Acme::Morse::Audible;> has no affect on a readable program.

=head2 DIAGNOSTICS

=over 4

=item C<Cannot record '%s'.>

Acme::Morse::Audible could not access the source file to modify it (substitute readability with audibility or vice versa).

=item C<Cannot hear '%s'.>

Acme::Morse::Audible could not access the source file to read it.

=back



( run in 1.193 second using v1.01-cache-2.11-cpan-8dfa8b56332 )