#! /usr/bin/perl -w
# GENERATE THE FRACTIONS FOR PYTHAGOREAN TUNING (OR MEANTONEs )
# THIS IS JUST QUICK AND DIRTY CODE TO CACULATE THE THINGS THAT I WANT
use strict;
my( $num, $k, $n, $power3, $power2, %value2fraction, @ordered, $delta, $cents );
my( @noteNames, $sharps, %value2name, $p, $flats, $q, $action );
my( $tempered3rdHarm, %index2LogHarm, %index2LogRescaler, %index2PowerOf2,$count );
my( %index2Fraction, %index2NoteName, $flatString, $sharpString );
my( %index2value, $theta, $r, $factor,$theta_0, $r_0, $x, $pi );
my( $stretchForPicture );
#$num = 200; #NUMBER OF ITERATIONS -- NOW COMMAND LINE ARG
$tempered3rdHarm = 3;
#$tempered3rdHarm = 3 * (80/81)**(2/7);
#$tempered3rdHarm = 2**(19/12);
if( defined($ARGV[0] ) && defined( $ARGV[1] ) )
{
$num = $ARGV[0];
$action = $ARGV[1];
}
else
{
$action = "no args";
}
#HERE WE ITERATIVELY GENERATE THE NOTE SEQUENCE
@noteNames = qw( F C G D A E B );
$power2 = 2;
$sharps = 0; #ASCENDING
for( $k = 1; $k <= $num; $k++ )
{
$power3 = $tempered3rdHarm**$k;
$index2LogHarm{$k} = $k * log( $tempered3rdHarm );
$count = 1;
$power2 = 2;
until( $power3/$power2 < 2 )
{
$power2 = 2*$power2;
$count++;
}
$index2LogRescaler{$k} = -$count * log(2);
$index2PowerOf2{$k} = -$count;
#print "$k $power3\/$power2\n";
$index2value{ $k } = $power3/$power2;
$value2fraction{ $power3/$power2 } = $power3." / ".$power2;
$index2Fraction{ $k } = $power3." / ".$power2;
$value2name{ $power3/$power2 } = $noteNames[($k+1) % 7];
if( ($k % 7) == 6 )
{
$sharps++;
}
$sharpString = "";
$index2NoteName{$k} = $value2name{$power3/$power2 };
if( $sharps < 4 )
{
for( $p=1; $p <= $sharps; $p++ )
{
$value2name{$power3/$power2 } = $value2name{$power3/$power2 }."#";
$sharpString = $sharpString."#";
}
}
else
{
$sharpString = $sharps."#";
}
#print "$k $power3\/$power2 $value2name{$power3/$power2 }\n";
$index2NoteName{$k} = $index2NoteName{$k}."$sharpString";
}
$value2fraction{ 1 } = "1"; # MIDDLE C
$value2name{1 } = $noteNames[1];
$index2LogHarm{0} = 0 * log( $tempered3rdHarm );
$index2LogRescaler{0} = 0;
$index2PowerOf2{0} = 0;
$index2Fraction{0} = "1";
$index2NoteName{0} = "C";
$index2value{0} = 1;
$power2 = 2; #DESCENDING
$flats = 0;
for( $k = 1; $k <= $num; $k++ )
{
$power3 = $tempered3rdHarm**$k;
$index2LogHarm{-$k} = -$k * log( $tempered3rdHarm );
$count = 1;
$power2 = 2;
until( $power2/$power3 > 1 )
{
$power2 = $power2*2;
$count++;
}
$index2LogRescaler{-$k} = $count * log(2);
$index2PowerOf2{-$k} = $count;
#print "-$k $power2\/$power3\n";
$index2value{ -$k } = $power2/$power3;
$value2fraction{ $power2/$power3 } = $power2." / ".$power3;
$index2Fraction{ -$k } = $power2." / ".$power3;
$q = $k%7;
if( $q == 1 )
{
$value2name{$power2/$power3 } = $noteNames[0];
}
else
{
if( $q == 0)
{
$q = 7;
}
$value2name{$power2/$power3 } = $noteNames[8 - $q];
if( (8 - $q) == 6 ) #WE'RE ON THE NOTE B
{
$flats++;
}
}
$flatString = ""; #APPEND THE STRING OF FLAT SYMBOLS
$index2NoteName{-$k} = $value2name{$power2/$power3 };
if( $flats < 4 )
{
for( $p=1; $p <= $flats; $p++ )
{
$value2name{$power2/$power3 } = $value2name{$power2/$power3 }."b";
$flatString = $flatString."b";
}
}
else #JUST PUT A NUMBER
{
$flatString = $flats."b";
}
#print "$k $power2\/$power3 $value2name{$power2/$power3 }\n";
$index2NoteName{-$k} = $index2NoteName{-$k}."$flatString";
}
if( $action =~ /PLOT/ ) #- - - - - - - - - -- - - - - - - - - - - - - - - -
{ #THIS PLOTS THE LINES log(3^n) AND log(2^k(n))
open( FFF2, ">-");
open( FFF3, ">-");
for( $k= -$num; $k<=$num; $k++ ) # WRITE DATA FOR GNU-PLOT log(3)
{
write(FFF2);
}
print "\n";
for( $k= -$num; $k<=$num; $k++ ) # WRITE DATA FOR GNU-PLOT log(2)
{
write(FFF3);
}
close(FFF2);
close(FFF3);
}
elsif( $action =~ /SPIRAL5THS/ ) #- - - - - - - - - -- - - - - - - - - - --
{ #STANDARD SPIRAL IN POLAR CO-ORDS
open( POLARIS, ">-");
$pi = 3.141592653589793;
$theta_0 = $pi / 2;
$factor = log(3) / ( (19/12) * log(2) ) * $pi/6;
$stretchForPicture = 1.01;
$r_0 = 2;
#write( POLARIS );
for( $k = -$num; $k <= $num; $k++ ) # WRITE DATA FOR GNU-PLOT
{
$theta = $theta_0 - $k * $factor *$stretchForPicture;
$r = (0.2 / $pi) * ($theta - $theta_0) + $r_0;
write(POLARIS);
}
print "\n";
print "\n";
#for( $k=-$num*10; $k <= $num*10; $k++ ) #DATA FOR SMOOTH SPIRAL CURVE
#{
# $theta = $theta_0 - $k * $factor/10;
# $r = (0.2 / 3.141592653589793) * ($theta - $theta_0) + $r_0;
# write(POLARIS);
#}
#print "\n";
close(POLARIS);
}
elsif( $action =~ /MINORS/ ) #- - - - - - ----- - - -- - - - - - - - - - -
{
&harmonicMatchingIntervals( $num, %index2NoteName );
}
elsif( $action =~ /CLOSING/ ) #- - - - - - - -- - - - - - - - - - - - - - - -
{
&tableOfClosingValues( $num, $tempered3rdHarm, %index2value );
}
elsif( $action =~ /HTMLPOWERS/ ) #- - - - - - - -- - - - - - - - - - - - - - - -
{
open( POWERS_HEAD, ">-");
write( POWERS_HEAD );
for( $k= $num; $k >= -$num; $k-- ) # WRITE HTML TABLES OF POWERS
{
&printPowers();
}
close(POWERS_HEAD);
print "\n<\BODY>\n