#!/usr/bin/perl
#
# Programmer:    Craig Stuart Sapp <craig@ccrma.stanford.edu>
# Creation Date: Tue Feb 13 04:26:02 PST 2007
# Last Modified: Tue Feb 13 04:26:02 PST 2007
# Filename:      /disk/linux2/craigsites/mazurka/website/info/dyn/gbdyn/mazurka68-3/buildarray
# Syntax:        perl 5
#
# Description:	
#

use strict;


my @pids = getPids(".");


# indexes are assumbed to be 1-2-1, but that is not strictly correct,
# so there will be some bugs...
my %pidindex;      
my %performerindex;

buildindexes(@pids);


my @plist = sort keys %performerindex;
my $performer;
#print "@plist\n\n";
my @tags = getTags($performerindex{$plist[0]});
#print "@tags\n";


my $lastperformer = "";
my $lettercounter = 0;

my %outputlines;
my $i;
my $measure;
my $beat;
for ($i=0; $i<@tags; $i++) {
   if ($tags[$i] =~ /(\d+):(\d+)/) {
      $outputlines{$tags[$i]} = "$1\t$2\t";
   } else {
      die "Error in tag formating in file $performerindex{$plist[0]}";
   }
}


for ($i=0; $i<@plist; $i++) {
   processPid($performerindex{$plist[$i]});
   addTabs(@tags);
}

print ".\t.";
for ($i=0; $i<@plist; $i++) {
   # print the PID list 
   print "\t$performerindex{$plist[$i]}";
}
print "\n";

print "measure\tbeat";
for ($i=0; $i<@plist; $i++) {
   print "\t$plist[$i]";
}
print "\n";

my $line;
for ($i=0; $i<@tags-1; $i++) {
   $line = $outputlines{$tags[$i]};
   $line =~ s/\t\t/\t.\t/g;
   $line =~ s/\t\t/\t.\t/g;
   print "$line\n";
}


############################################################################

##############################
##
## addTabs --
##

sub addTabs {
   my (@tags) = @_;
   my $i;
   for ($i=0; $i<@tags; $i++) {
      $outputlines{$tags[$i]} .= "\t"; 
   }
}



##############################
##
## processPid --
##

sub processPid {
   my ($pid) = @_;

   open (ZFILE, "$pid.dyn") or die "Cannot read $pid.dyn";

   my $line;

   while ($line = <ZFILE>) {
      next if $line =~ /^\s*\#/;
      next if $line =~ /^\s*$/;
      my $time;
      my $dynam;
      my $tag;

      if ($line =~ /(.*)\t(.*)\t(.*)\s*$/) {
         $time  = $1;
         $dynam = $2;
         $tag   = $3;
         $outputlines{$tag} .= "$dynam";
      }
   }

   close ZFILE;


}



##############################
##
## getTags --
##

sub getTags {
   my ($pid) = @_;

   open (TAGS, "$pid.dyn") or die "Cannot open $pid.dyn\n";

   my @output;

   my $tag;
   my $line;
   while ($line = <TAGS>) {
      next if $line =~ /^\s*\#/;
      next if $line =~ /^\s*$/;
      if ($line =~ /(.*)\t(.*)\t(.*)/) {
         $tag = $3;
         $output[@output] = $tag;
      }
   }
   return @output;
}



##############################
##
## buildindexes --
##

sub buildindexes {
   my @pids = @_;

   my $pid;
   my $performer;

   my @temp;
   foreach $pid (@pids) {
      $performer = getPerformer($pid);
      $pidindex{$pid} = $performer;
      $temp[@temp] = "$performer\t$pid";
   }

   @temp = sort @temp;
   my $lastperformer = "none";
   my $perf = "";
   my $year = "";
   my $letter = 0;
   my $tagger = "";
   for ($i=0; $i<@temp; $i++) {
      $temp[$i] =~ /(.*)\t(pid.*)/;
      $performer = $1;
      $pid = $2;
      $performer =~ /(.*)\s+(\d\d\d\d)/;
      $perf = $1;
      $year = $2;
      if ($performer eq $lastperformer) {
         $letter++;
         $tagger = makeTagger($letter);
      } else {
         $letter = 0;
         $tagger = "";
      } 
      $performerindex{"$performer$tagger"} = "$pid";
      #$performerindex{"$pid"} = "$performer$tagger";
      $lastperformer = $performer;
   }

}



##############################
##
## makeTagger --
##

sub makeTagger {
   my ($letter) = @_;
   my $output = "";
   if    ($letter == 1)  { $output = "b"; }
   elsif ($letter == 2)  { $output = "c"; }
   elsif ($letter == 3)  { $output = "d"; }
   elsif ($letter == 4)  { $output = "e"; }
   elsif ($letter == 5)  { $output = "f"; }
   elsif ($letter == 6)  { $output = "g"; }
   elsif ($letter == 7)  { $output = "h"; }
   elsif ($letter == 8)  { $output = "i"; }
   elsif ($letter == 9)  { $output = "j"; }
   elsif ($letter == 10) { $output = "k"; }
   elsif ($letter == 11) { $output = "l"; }
   elsif ($letter == 12) { $output = "m"; }
   elsif ($letter == 13) { $output = "n"; }
   elsif ($letter == 14) { $output = "o"; }
   elsif ($letter == 15) { $output = "p"; }
   elsif ($letter == 16) { $output = "q"; }
   elsif ($letter == 17) { $output = "r"; }

   return $output;

}



##############################
##
## getPids --
##

sub getPids {
   my ($dir) = @_;

   my @output;
   opendir(DIR, $dir) or die "Cannot open directory $dir\n";
   my $file;
   while ($file = readdir(DIR)) {
      next if $file !~ /^pid/;
      next if $file !~ /\.dyn$/;
      $file =~ s/\.dyn$//;
      $output[@output] = $file;
   }
   closedir (DIR);
   
   return @output;
}



##############################
##
## getPerformer --
##

sub getPerformer {
   my ($pid) = @_;

   open (PFILE, "$pid.dyn") or die "Cannot read $pid.dyn";
   my $line;
   my $name = "";
   my $year = "";
   while ($line = <PFILE>) {
      if ($line =~ /performance-date.*(\d\d\d\d)/) {
         $year = $1;
      }
      if ($line =~ /performer.*\s+([^\s]+)\s*$/) {
         $name = $1;
      }

      last if $name !~ /^\s*$/ && $year !~ /^\s*$/;

   }

   close PFILE;
   
   $name =~ s/[^A-Za-z0-9]//g;
   if ($name =~ /Tsong/i) {
      $name = "Fou";
   }

   return "$name $year";
}





