#!/usr/local/bin/perl -w ### prime forms -- returns the prime forms of each n note set ### in a way that allows them to be sorted my $set_size = 12; my $previous_set = ""; print "attacks | normal form | position | original form\n"; foreach () { for (my $walk = 0; $walk < (length($_) - $set_size); $walk += $set_size) { my $examined_set = substr($_, $walk, $set_size); # next if $examined_set eq $previous_set; $previous_set = $examined_set; #### eliminate pitch distinctions $examined_set =~ s/0/o/g; $examined_set =~ s/\d/x/g; # print $examined_set, "\n"; my $set_form = ""; my $current_interval = 0; my $initial_rests = 0; my $attacks = 0; for (my $set_walk = 0; $set_walk < $set_size; $set_walk++) { my $current_attack = substr($examined_set, $set_walk, 1); if ($set_walk != 0 && $current_attack eq "x") { if ($attacks) { $current_interval = one_digit($current_interval); $set_form .= $current_interval; $current_interval = 1; $attacks++; # print "$set_form\n"; } else { ## tack initial rests to end of set $initial_rests = $current_interval; $current_interval = 1; $attacks++; # print "inital_rests: $initial_rests ... $set_form\n"; } } elsif ($set_walk == 0 && $current_attack eq "x") { $attacks++; $current_interval++; } else { $current_interval++; } } my $final_interval = $current_interval + $initial_rests; $final_interval = one_digit($final_interval); $set_form .= $final_interval; my $normal_set = find_normal_form($set_form); my $position = ($walk/$set_size)+1; if ($attacks == 0) { $normal_set = "-"; $set_form = "-";} printf(" %2s | %12s | %3s | %12s \n", $attacks, $normal_set, $position, $set_form); } } sub one_digit { my $line = shift; if ($line < 10) {return $line} elsif ($line == 10) {return "A"} elsif ($line == 11) {return "B"} elsif ($line == 12) {return "C"} elsif ($line == 13) {return "D"} elsif ($line == 14) {return "E"} elsif ($line == 15) {return "F"} elsif ($line == 16) {return "G"} else {return "*"} } sub find_normal_form { my $set = shift; my @set_rotation; for (my $i = 0; $i < length($set); $i++) { $set_rotation[$i] = substr($set, $i) . substr($set, 0, $i); # print "$i $set_rotation[$i]\n"; } my @sort_set = sort @set_rotation; my $normal_form = $sort_set[0]; # print "sorted: $normal_form\n"; return $normal_form; }