Last active
December 16, 2015 14:20
-
-
Save vi/5447962 to your computer and use it in GitHub Desktop.
Output music from Perl
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/perl | |
| # Output monophonic Mozart - Rondo Alla Turca to stdout | |
| # Implemented by Vitaly "_Vi" Shukela | |
| # Usage: ./rondo.pl | aplay -f cd | |
| # Used mozk331c.mid as reference | |
| our $vq = 0.2; | |
| sub tone($$) { | |
| my $freq = shift; | |
| my $len = shift; | |
| $len = int($len * 44100); | |
| my $vol = 500 + 10000000/$freq; | |
| $vol = 20000 if $vol > 20000; | |
| $vol*=$vq; | |
| for my $i (0..$len) { | |
| my $b = int(sin($i*2*3.14159264358*$freq/44100)*$vol*(1-0.5*$i/$len)); | |
| $b+=65535 if($b<0); | |
| print pack("vv", $b, $b); | |
| } | |
| } | |
| sub note($$) { | |
| my $num = shift; | |
| my $len = shift; | |
| tone(440*(2**($num/12)), $len); | |
| } | |
| sub parse($) { | |
| $_ = shift; | |
| if (not m!^(.*)([0-9A-F])!) { | |
| #print STDERR "Error\n"; | |
| return; | |
| } | |
| my $l = $2; | |
| my $tmp = $1; $tmp =~ s![^ #]!!g; my $n = length($tmp); | |
| #my $n=length($1 =~ s![^ #]!!gr); | |
| $l = 16 if $l eq '0'; | |
| $l = ord($l)-ord('A')+10 unless $l eq int($l); | |
| #print STDERR "l=$l n=$n\n"; | |
| note($n, $l/16.0); | |
| } | |
| sub p1($) { | |
| my $v = shift; | |
| parse("| # # # # # | #2# # # # | # # # # # |"); | |
| parse("| # # # # # |2# # # # # | # # # # # |"); | |
| parse("| # # # # #2| # # # # # | # # # # # |"); | |
| parse("| # # # # # |2# # # # # | # # # # # |"); | |
| parse("| # # # # # | # 8 # # # | # # # # # |"); | |
| parse("| # # # # # | # # 2# # # | # # # # # |"); | |
| parse("| # # # # # | # 2 # # # | # # # # # |"); | |
| parse("| # # # # # | #2# # # # | # # # # # |"); | |
| parse("| # # # # # | # 2 # # # | # # # # # |"); | |
| parse("| # # # # # | # # #8# # | # # # # # |"); | |
| parse("| # # # # # | # # # 2 # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # 2 # # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # | # 8 # # # |"); | |
| if ($v == 0) { | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # # | # 4 # # # |"); | |
| parse("| # # # # # | # # # # 1 | # # # # # |"); | |
| parse("| # # # # # | # # # # # |1# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # 4 | # # # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # 1 | # # # # # |"); | |
| parse("| # # # # # | # # # # # |1# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # 4 | # # # # # |"); | |
| parse("| # # # # # | # # # # # |3# # # # # |"); | |
| parse("| # # # # # | # # # # 1 | # # # # # |"); | |
| parse("| # # # # # | # # # # # |1# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # 4 | # # # # # |"); | |
| parse("| # # # # # | # # # #4# | # # # # # |"); | |
| parse("| # # # # # | # # #8 # | # # # # # |"); | |
| } else { | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # # | # 4 # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # #4| # # # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # #4# # | # # # # # |"); | |
| parse("| # # # # # | # # # 4 # | # # # # # |"); | |
| parse("| # # # # # | # # 4# # # | # # # # # |"); | |
| parse("| # # # # # | # 8 # # # | # # # # # |"); | |
| parse("| # # # # # | #6# # # # | # # # # # |"); | |
| parse("| # # # # # |1# # # # # | # # # # # |"); | |
| parse("| # # # # # | 1 # # # # | # # # # # |"); | |
| parse("| # # # # # |8# # # # # | # # # # # |"); | |
| parse("| # # # # # | # # # # # | # # # # # |"); | |
| } | |
| } | |
| sub p2($) { | |
| my $v = shift; | |
| parse("| # # # # # | # # #4# # | # # # # # |"); | |
| parse("| # # # # # | # # # 4 # | # # # # # |"); | |
| parse("| # # # # # | # # # # 4 | # # # # # |"); | |
| parse("| # # # # # | # # # # 4 | # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # 2 | # # # # # |"); | |
| parse("| # # # # # | # # # 2 # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # 4# # # | # # # # # |") unless $v; | |
| parse("| # # # # 4 | # # # # # | # # # # # |") unless $v; | |
| parse("| # # # # # | # # 8# # # | # # # # # |") if $v; | |
| } | |
| sub p3($) { | |
| my $v = shift; | |
| parse("| # # # # # | # 4 # # # | # # # # # |"); | |
| parse("| # # # # # | # # 4# # # | # # # # # |"); | |
| parse("| # # # # # | # # #4# # | # # # # # |"); | |
| parse("| # # # # # | # # #4# # | # # # # # |"); | |
| parse("| # # # # # | # # # 2 # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # 2# # # | # # # # # |"); | |
| parse("| # # # # # | # 2 # # # | # # # # # |"); | |
| parse("| # # # # # | #4# # # # | # # # # # |") unless $v; | |
| parse("| # # #4# # | # # # # # | # # # # # |") unless $v; | |
| parse("| # # # # # | #8# # # # | # # # # # |") if $v; | |
| } | |
| sub p4() { | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # # | # #8 # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # # | # #4 # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # #4| # # # # # |"); | |
| parse("| # # # # # | # # # #4# | # # # # # |"); | |
| parse("| # # # # # | # # # # #4| # # # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # #4| # # # # # |"); | |
| parse("| # # # # # | # # #4# # | # # # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # # | # #8 # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # # | # #4 # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # #4| # # # # # |"); | |
| parse("| # # # # # | # # # #4# | # # # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| parse("| # # # # # | # # # # #4| # # # # # |"); | |
| parse("| # # # # # | # # #4# # | # # # # # |"); | |
| parse("| # # # # # | # # # # # |8# # # # # |"); | |
| } | |
| sub p5($) { | |
| my $v = shift; | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # # 2# # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | # # 2 # # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # # 2 # | # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # 2 # # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # 2 # # # |"); | |
| if ($v == 0) { | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # # 2# # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | # # 2 # # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | # # 2 # # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # 2 # # | # # # # # |"); | |
| parse("| # # # # # | # 2 # # # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | # # 2 # # | # # # # # |"); | |
| parse("| # # # # # | # 2 # # # | # # # # # |"); | |
| parse("| # # # # # | # #8 # # # | # # # # # |"); | |
| } else { | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # 2 # # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | 2 # # # # |"); | |
| parse("| # # # # # | # # # # # | # # 2# # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # # 2# # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # # 2# # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # # 2# # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # # 2# # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # 2 # | # # # # # |"); | |
| parse("| # # # # # | # # # #8# | # # # # # |"); | |
| } | |
| } | |
| sub p6($) { | |
| my $v = shift; | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # 2# # # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | #2# # # # | # # # # # |"); | |
| parse("| # # # # # |2# # # # # | # # # # # |"); | |
| parse("| # # # # # | #2# # # # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | # # 2# # # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| if (!$v) { | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # 2# # # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | #2# # # # | # # # # # |"); | |
| parse("| # # # # # |2# # # # # | # # # # # |"); | |
| parse("| # # # # # | #2# # # # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | # # 2# # # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # # #2# | # # # # # |"); | |
| parse("| # # # # # | # # # # #2| # # # # # |"); | |
| parse("| # # # # # | # # # # # |2# # # # # |"); | |
| parse("| # # # # # | # # # # # | 4 # # # # |"); | |
| parse("| # # # # # | # # # # # | #4# # # # |"); | |
| } else { | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # | # # 2# # # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | #2# # # # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | # # #2# # | # # # # # |"); | |
| parse("| # # # # # |2# # # # # | # # # # # |"); | |
| parse("| # # # # # | # #2 # # # | # # # # # |"); | |
| parse("| # # # # # | #2# # # # | # # # # # |"); | |
| parse("| # # # # # | # # 2# # # | # # # # # |"); | |
| parse("| # # # # #2| # # # # # | # # # # # |"); | |
| parse("| # # # # # | #2# # # # | # # # # # |"); | |
| parse("| # # # # # |8# # # # # | # # # # # |"); | |
| } | |
| } | |
| sub p7($) { | |
| my $v = shift; | |
| parse("| # # # # # | # # # # # | # #0 # # # |"); | |
| parse("| # # # # # | # # # # # | # #0 # # # |"); | |
| parse("| # # # # # | # # # # # | # # 2# # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # # 2# # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # | # #2 # # # |"); | |
| parse("| # # # # # | # # # # # | # # 0# # # |"); | |
| if (not $v) { | |
| parse("| # # # # # | # # # # # | # 1 # # # |"); | |
| parse("| # # # # # | # # # # # | # #3 # # # |"); | |
| parse("| # # # # # | # # # # # | # 1 # # # |"); | |
| parse("| # # # # # | # # # # # | # #3 # # # |"); | |
| parse("| # # # # # | # # # # # | # 1 # # # |"); | |
| parse("| # # # # # | # # # # # | # #3 # # # |"); | |
| parse("| # # # # # | # # # # # | # 1 # # # |"); | |
| parse("| # # # # # | # # # # # | # #3 # # # |"); | |
| parse("| # # # # # | # # # # # | #C# # # # |"); | |
| parse("| # # # # # | # # # # # | # # #4# # |"); | |
| } else { | |
| parse("| # # # # # | # # # # # | #2# # # # |"); | |
| parse("| # # # # # | # # # # # | # #E # # # |"); | |
| parse("| # # # # # | # # # # # | 1 # # # # |"); | |
| parse("| # # # # # | # # # # # | #3# # # # |"); | |
| parse("| # # # # # | # # # # # | 1 # # # # |"); | |
| parse("| # # # # # | # # # # # | #3# # # # |"); | |
| parse("| # # # # # | # # # # # | 1 # # # # |"); | |
| parse("| # # # # # | # # # # # | #3# # # # |"); | |
| parse("| # # # # # | # # # # # | 1 # # # # |"); | |
| parse("| # # # # # | # # # # # | #3# # # # |"); | |
| if($v!=2) { | |
| parse("| # # # # # | # # # # # |0# # # # # |"); | |
| } | |
| } | |
| } | |
| p1(0); | |
| p1(0); | |
| p2(0); | |
| p2(1); | |
| p3(0); | |
| p3(1); | |
| p1(1); | |
| p2(0); | |
| p2(1); | |
| p3(0); | |
| p3(1); | |
| p1(1); | |
| $vq=0.4; | |
| p4(); | |
| p4(); | |
| $vq=0.2; | |
| p5(0); | |
| p5(0); | |
| $vq=0.4; | |
| p6(0); | |
| p6(1); | |
| $vq=0.2; | |
| p5(1); | |
| $vq=0.4; | |
| p6(0); | |
| p6(1); | |
| $vq=0.2; | |
| p5(1); | |
| $vq=0.4; | |
| p4(); | |
| p4(); | |
| $vq=0.2; | |
| p1(0); | |
| p1(0); | |
| p2(0); | |
| p2(1); | |
| p3(0); | |
| p3(1); | |
| p1(1); | |
| p2(0); | |
| p2(1); | |
| p3(0); | |
| p3(1); | |
| p1(1); | |
| $vq=0.4; | |
| p4(); | |
| p4(); | |
| $vq=0.5; | |
| p7(0); | |
| p7(1); | |
| $vq=0.3; | |
| p7(0); | |
| $vq=0.5; | |
| p7(2); | |
| parse("| # # # # # | # # # # # |C# # # # # |"); | |
| parse("| # # # # # | # # # # # | # #4 # # # |"); | |
| parse("| # # # # # | # # # # # |C# # # # # |"); | |
| parse("| # # # # # | # # # # # | # # #4# # |"); | |
| parse("| # # # # # | # # # # # |C# # # # # |"); | |
| parse("| # # # # # | # # # # # | # #4 # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # # | # #4 # # # |"); | |
| parse("| # # # # # | # # # # # |4# # # # # |"); | |
| parse("| # # # # # | # # # # # | # # #4# # |"); | |
| parse("| # # # # # | # # # # # |8# # # # # |"); | |
| parse("| # # # # # | # # # # # |8# # # # # |"); | |
| parse("| # # # # # | # # # # # |0# # # # # |"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment