#!/usr/bin/perl
#
# Programmer:    Craig Stuart Sapp <craig.stanford.edu>
# Creation Date: Sun Dec 14 17:12:12 PST 2008
# Last Modified: Sun Dec 14 17:12:12 PST 2008
# Filename:      /disk/linux3/craigsites/mazurka/website/auto/scorealign/ga
# Syntax:        perl 5
#
# Description:
#

use strict;

my %mazurkas = getMazurkaList("/project/mazurka/website/info/discography/mazurka-discography.txt");

my $options = "-h 0.050 -w 0.100";

my @pids = keys %mazurkas;
my $counter = 0;
my $pid;
my $difference;
my $start;
my $duration;
my $end;
foreach $pid (@pids) {
   if (-r "$mazurkas{$pid}/$pid-sadiff.txt") {
      print "$mazurkas{$pid}/$pid already processed...\n";
      next;
   }
   if (-r "/project/mazurka/website/info/revcond/$pid/$pid-clean.txt") {
      if (!-d "$mazurkas{$pid}") {
         print "Making directory $mazurkas{$pid}\n";
         mkdir($mazurkas{$pid}, 0755);
      }
      if (!-r "/project/mazurka/website/private/recording/$mazurkas{$pid}/$pid.mp4") {

         print "Cannot find $mazurkas{$pid}/$pid.mp4\n";
         exit(1);
      }
      `cp /project/mazurka/website/private/recording/$mazurkas{$pid}/$pid.mp4 .`;
      `faad $pid.mp4`;
      ($start, $end) = getStartEnd($pid);
      $duration = $end - $start;
      print "START $start\tEND $end\n";

      `sox $pid.wav temp.wav trim $start $duration`;
      if (!-r "/project/mazurka/website/info/revcond/$pid/$pid.score") {
         print "$pid ($mazurkas{$pid}) does not have a score\n";
         next;
         exit(1);
      }
      `hum2mid /project/mazurka/website/info/revcond/$pid/$pid.score -o temp.mid`;
      `scorealign $options -i /dev/null temp.wav temp.mid`;
      `bin/flipbeatmap beatmap.txt  > mapbeat.txt`;
      createDataFile($pid, $start, "mapbeat.txt");

      `rm -f $pid.wav`;
      `rm -f $pid.mp4`;
      `rm -f temp.mid`;
      `rm -f temp.wav`;
      `rm -f mapbeat.txt`;
      `rm -f beatmap.txt`;
      `rm -f debug-log.txt`;
      `rm -f beatmap.txt`;
      `rm -f path.data`;
      `rm -f midi.mid`;
      `rm -f smooth.data`;
      `rm -f transcription.txt`;

      print "$pid\t$mazurkas{$pid}\n";
      #$counter++;
      #last if $counter > 0;
   }
}



exit(0);

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


##############################
##
## createDataFile --
##

sub createDataFile {
   my ($pid, $start, $file) = @_;

   my @fields;
   my $satime;
   my $sabeat;
   my $clbeat;
   my $cltime;
   my $i;
   open (FILE, $file) or die;
   my @contents = <FILE>;
   close FILE;

   open (FILE, "/project/mazurka/website/info/revcond/$pid/$pid-clean.txt") 
         or die;
   my @contents2 = <FILE>;
   close FILE;

   `cp mapbeat.txt $mazurkas{$pid}/$pid-mapbeat.txt`;
   # print header information
   open (OFILE, ">$mazurkas{$pid}/$pid-sadiff.txt") or die;
   my $i;
   for ($i=0; $i<@contents2; $i++) {
      $contents2[$i] =~ s/\s*$//;
      if ($contents2[$i] !~ /^[\d\.\+\-]/) {
         print OFILE "$contents2[$i]\n";
      }
   }
   my $date = `date`;
   chomp $date;
   print OFILE "###scorealign-date:\t$date\n";
   print OFILE "###scorealign-parameters:\t$options\n";

   my @cllist;
   my @salist;

   my %realtimes;
   for ($i=0; $i<@contents2; $i++) {
      $contents2[$i] =~ s/\s*$//;
      next if $contents2[$i] !~ /^[\d\.\+\-]/;
      @fields = split(/\t/, $contents2[$i]);
      next if @fields != 2;
      $cltime = $fields[0];
      $clbeat = $fields[1];
      $clbeat =~ s/\./:/g;
      $cllist[@cllist] = $clbeat;
      $realtimes{$clbeat} = $cltime;
   }

   for ($i=0; $i<@contents; $i++) {
      $contents[$i] =~ s/\s*$//;
      @fields = split(/\t/, $contents[$i]);
      next if @fields != 2;
      $satime = $fields[0] + $start;
      $sabeat = $fields[1];
      $salist[@salist] = $sabeat;
   }

   my %beatmapping;
   for ($i=0; $i<@salist; $i++) {
      $beatmapping{$salist[$i]} = $cllist[$i];
   }

   for ($i=0; $i<@contents; $i++) {
      $contents[$i] =~ s/\s*$//;
      @fields = split(/\t/, $contents[$i]);
      next if @fields != 2;
      $satime = $fields[0] + $start;
      $sabeat = $fields[1];
      $salist[@salist] = $sabeat;
      #$sabeat =~ s/\./:/g;
      if ($realtimes{$beatmapping{$sabeat}} =~ /^\s*$/) {
         print "Ignoring $sabeat\n";
         next;
         # print "$sabeat :: $beatmapping{$sabeat} does not exist in realtimes\n";
         # exit(1);
      } else {
         #print "\t$sabeat --> $beatmapping{$sabeat}\n";
      }
      $difference = $satime - $realtimes{$beatmapping{$sabeat}};
      $difference = (int($difference * 1000 + 0.5))/1000.0;
      print OFILE "$beatmapping{$sabeat}\t$satime\t$difference\t$realtimes{$beatmapping{$sabeat}}\n";
   }
   close OFILE;

   open (OFILE, ">$mazurkas{$pid}/$pid-sa.txt") or die;
   my $i;
   for ($i=0; $i<@contents2; $i++) {
      if ($contents2[$i] !~ /^[\d\.\+\-]/) {
         print OFILE "$contents2[$i]\n";
      }
   }
   print OFILE "###scorealign-date:\t$date\n";
   print OFILE "###scorealign-parameters:\t$options\n";

   for ($i=0; $i<@contents; $i++) {
      @fields = split(/\t/, $contents[$i]);
      next if @fields != 2;
      $satime = $fields[0] + $start;
      $sabeat = $fields[1];
      $sabeat =~ s/\./:/g;
      if ($realtimes{$beatmapping{$sabeat}} =~ /^\s*$/) {
         print "Ignoring $sabeat\n";
         next;
      }
      $difference = $satime - $realtimes{$beatmapping{$sabeat}};
      $difference = (int($difference * 1000 + 0.5))/1000.0;
      print OFILE "$satime\t$beatmapping{$sabeat}\t$difference\n";
   }
   close OFILE;
}




##############################
##
## getStartEnd --
##

sub getStartEnd {
   my ($pid) = @_;
   my $start = -1;
   my $end = -1;

   open (FILE, "/project/mazurka/website/info/revcond/$pid/$pid-clean.txt") or die;
   my @contents = <FILE>;
   close FILE;

   my $i;
   for ($i=0; $i<@contents; $i++) {
      if ($contents[$i] =~ /^([\d\.\+\-]+)/) {
         $start = $1;
         last;
      }
   }

   for ($i=@contents-1; $i>0; $i--) {
      if ($contents[$i] =~ /^([\d\.\+\-]+)/) {
         $end = $1;
         last;
      }
   }

   die if $start == -1;
   die if $end == -1;

   return ($start, $end);
}



##############################
##
## getMazurkaList --
##

sub getMazurkaList {
   my ($file) = @_;
   my $line = "XXXX";
print line;

   open (FILE, $file) or die;

   my %output;
   my $maz;
   my $pid;
   my @fields;
   while ($line = <FILE>) {
print line;
      chomp $line;
      @fields = split(/\t/, $line);
      next if @fields < 8;
      $pid = $fields[7];
      $maz = $fields[0];
      next if $maz =~ /opus/;
      $maz =~ s/\./-/;
      if ($maz =~ /^.-/) {
         $maz = "0$maz";
      }
      $maz = "mazurka$maz";
      $pid = "pid$pid";
      $output{$pid} = $maz;
   }
   close FILE;

   return %output;
}








