January 10, 2001 v 0.1

This perl program is cool for those guitar/stringed instrument players who like a little bit o' help when it comes to rememeber scale positions. I always have a problem with some of the last major positions and it always helped me to look at the scales on a diagram. Enter this guy:

#!/usr/bin/perl -w

use strict;

my %octave = ('A', '-', 'A#', '-', 'B', '-', 'C', '-', 
              'C#', '-', 'D', '-', 'D#', '-', 'E', '-', 
              'F', '-', 'F#', '-', 'G', '-', 'G#', '-');
my @strings = ('G', 'D', 'A', 'E');
my @notes = @ARGV;
my $note;

foreach $note (@notes) {
        $note = uc($note);
        if($note =~ /^([A-G])B$/) {
                if($1 eq "A") { $note = "G#"; }
                else { $note = chr(ord($1) - 1) . "#"; } 
        }

        $octave{$note} = $note;
}

my @octave_old = sort keys %octave;
my @octave_new = ();
foreach (@octave_old) {
        push(@octave_new, $octave{$_});
}

print "   0    1    2    3    4    5    6    7    8    9   10   11   12\n";
foreach $note (@strings) {
        while ($note ne $octave_old[0]) {
                push(@octave_new, shift(@octave_new));
                push(@octave_old, shift(@octave_old));
        }
        
        foreach $note (@octave_new) {
                print "| $note ";
                if ($note !~ /[#]/) {
                        print " ";
                }
        }
        print "| $octave_new[0]\n";
}
So if I want to print out a diagram of major scale in C (C, D, E, F, G, A, B), this little jewel works great. Just type this on your console and out pops your diagram:

neckdia.pl C D E F G A B

   0    1    2    3    4    5    6    7    8    9   10   11   12
| G  | -  | A  | -  | B  | C  | -  | D  | -  | E  | F  | -  | G
| D  | -  | E  | F  | -  | G  | -  | A  | -  | B  | C  | -  | D
| A  | -  | B  | C  | -  | D  | -  | E  | F  | -  | G  | -  | A
| E  | F  | -  | G  | -  | A  | -  | B  | C  | -  | D  | -  | E

Boom, I got a major C diagram over one octave on my neck. I've got this setup for standard tuning on a four string bass, but it's easy to change that. Not far from the top of the program is a line that says

my @strings = ('G', 'D', 'A', 'E');
If I want a standard guitar tuning I just change this line of code to

my @strings = ('E', 'B', 'G', 'D', 'A', 'E');
Or if I want drop D tuning on my bass (who would want that, honestly?), bang:

my @strings = ('G', 'D', 'A', 'D');

This is pretty basic right now. I just whipped this up the other day out of frustration. Please note that if you enter flats on the command line that they will be switched to the appropriate shrap for simplicity sake. DO NOT put flats in the @strings array. That will produce unruly behavior.

I want to develop it some more. Perhaps I will add a little text file of scales and labels so I don't have to remember all the notes or a feature that will allow me to enter major C and tell it to shit the scale down to major A even if I dont know the notes in major A. Lot's of stuff. Watch the date and version number at the top of the writeup for these juicy details...