#!/usr/bin/perl
# punktabulator
# $Id: punktabulator,v 1.5 2001/03/06 02:43:08 btanaka Exp $

########################################################################
#
# e barres, use number.
#
# a barres, use number followed immediately by an underscore.
#
# Lines starting with space are comments and are printed as is.
#
# Vertical bar used as bar end.
#
# Assumes 4/4 time.
#
# Use "-" to indicate blank tablature for by-hand editing (if, for
# instance, you don't want to use an a barre or e barre.
#
# eg:
#
# 7_ 7_ 7 7 | 5_ 5_ 5 5 |
# 7_ 7_ 7 7 | 5_ 5_ 5 5 |
# 7_ 7_ 7 7 | 5_ 5_ 5 5 |
# 7 7 7 7 | 6 + 7 7 7 |
# 
#  (x2)
#
########################################################################


#
# vars
#

#$d = 1; # debug. uncomment to turn on debugging

@hie=("E ||"); @b=("B ||"); @g=("G ||"); @d=("D ||"); @a=("A ||"); @loe=("E ||");

@anotes=("A ", "A#", "B ", "C ", "C#", "D ", "D#", "E ", "F ", "F#", "G ", "G#",
"A ", "A#", "B ", "C ", "C#", "D ", "D#", "E ", "F ", "F#", "G ", "G#",
"A ", "A#", "B ", "C ", "C#", "D ", "D#", "E ", "F ", "F#", "G ", "G#");

@enotes=("E ", "F ", "F#", "G ", "G#", "A ", "A#", "B ", "C ", "C#", "D ", "D#", 
"E ", "F ", "F#", "G ", "G#", "A ", "A#", "B ", "C ", "C#", "D ", "D#", 
"E ", "F ", "F#", "G ", "G#", "A ", "A#", "B ", "C ", "C#", "D ", "D#");



#
# main
#

open (F, "$ARGV[0]") || die "$0: could not open file \"$ARGV[0]\": $!\n";

# preamble
print "$ARGV[0]\n\n";
print "4/4 time.\n";
print "\">\" indicates a fret slide.\n";
print "\n";

while ($line = <F>) {

    print "\n----------------------------------------------------\n" if $d;

    # grab comments and blank lines
    if ($line =~ m/^\s/) {
	# this is a comment so leave alone
	print $line;	
	next;
    }

    # initialize all six arrays after newline
    @hie=("E ||"); @b=("B ||"); @g=("G ||"); @d=("D ||"); @a=("A ||"); @loe=("E ||");
    @notes_array=("    ");

    # split line into an array
    ( @linearray ) = split ( / /, $line );

    # a barres
    foreach my $elem (@linearray) {
	print "$elem" if $d;
	if ( $elem =~ m/(\d+)_/ ) {
	    $base = $1;
	    print "looksA" if $d;
    	    push (@hie, "$base");
	    push (@b, ($base + 2) );
	    push (@g, ($base + 2) );
	    push (@d, ($base + 2) );
	    push (@a, "$base");
	    push (@loe, "$base");
	    push (@notes_array, " $anotes[$base]");

	} elsif ( $elem =~ m/(\d+)\b/ ) {
	    $base = $1;
	    print "looksE" if $d;
	    push (@hie, "$base");
	    push (@b, "$base");
	    push (@g, ($base + 1) );
	    push (@d, ($base + 2) );
	    push (@a, ($base + 2) );
	    push (@loe, "$base");
	    push (@notes_array, " $enotes[$base]");

	} elsif ( $elem =~ m/\+/ ) {
	    push (@hie, ">");
	    push (@b, ">");
	    push (@g, ">");
	    push (@d, ">");
	    push (@a, ">");
	    push (@loe, ">");
	    push (@notes_array, " ");

	} elsif ( $elem =~ m/-/ ) {
	    push (@hie, "---");
	    push (@b, "---");
	    push (@g, "---");
	    push (@d, "---");
	    push (@a, "---");
	    push (@loe, "---");
	    push (@notes_array, "   ");

	} elsif ( $elem =~ m/|/ ) {
	    push (@hie, "-|-");
	    push (@b, "-|-");
	    push (@g, "-|-");
	    push (@d, "-|-");
	    push (@a, "-|-");
	    push (@loe, "-|-");
	    push (@notes_array, "   ");

	}
    }

    # print arrays

    foreach my $stringelem (@hie) {
    	if ( $stringelem > 9 ) {
	    print "-$stringelem-";
	} else {
	    print "--$stringelem-";
	}
    }
    print "\n";

    foreach my $stringelem (@b) {
    	if ( $stringelem > 9 ) {
	    print "-$stringelem-";
	} else {
	    print "--$stringelem-";
	}
    }
    print "\n";

    foreach my $stringelem (@g) {
    	if ( $stringelem > 9 ) {
	    print "-$stringelem-";
	} else {
	    print "--$stringelem-";
	}
    }
    print "\n";

    foreach my $stringelem (@d) {
    	if ( $stringelem > 9 ) {
	    print "-$stringelem-";
	} else {
	    print "--$stringelem-";
	}
    }
    print "\n";

    foreach my $stringelem (@a) {
    	if ( $stringelem > 9 ) {
	    print "-$stringelem-";
	} else {
	    print "--$stringelem-";
	}
    }
    print "\n";

    foreach my $stringelem (@loe) {
    	if ( $stringelem > 9 ) {
	    print "-$stringelem-";
	} else {
	    print "--$stringelem-";
	}
    }
    print "\n";

    foreach my $stringelem (@notes_array) {
	    print " $stringelem ";
    }
    print "\n\n";

}

close (F);
