package chord;

require 5.005_62;
use strict;
use warnings;
use GD;
use utf8::all;
use PostScript::Simple;

require Exporter;

our @ISA = qw(Exporter);
our %chord;
our %t;

our @EXPORT = qw(
 &htmlchords 
 &latexchords 
 &local_chords
 &learn_chords
 &build_chord
 &build_chord_eps
 &build_chord_png
);
our $VERSION = '0.02';

#---------------------------------------------------------------------------
# chord2html.pl - is A Perl script to convert CHORD input files to HTML
# Copyright (C) 1998 Claudio Matsuoka <claudio@helllabs.org>
#
# chord.pm - is a perm module that uses many lines from chord2html.pl
# and makes html chords and LaTeX - PS - PDF chords
# Copyright (C) 2001 Jose Joao <jj@di.uminho.pt>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#---------------------------------------------------------------------------

sub htmlchords{
 my %opt = (local_chords => {}, rebuild => 0, dir => ".", relpath => ".");
 if(ref($_[0])){%opt = (%opt, %{shift(@_) });};
 my %h;
 @h{@_}=@_;
 my $r="";
 my $png;

 foreach (sort {lc($a) cmp lc($b)} keys (%h)) {
    if(defined $chord{lc($_)}) {$_ = lc($_) }
    my $nn =doyourbestwith($_,$opt{local_chords} ); 
    unless ($nn) {
	print STDERR "Warning: unknown chord '$_'\n";
        next;
    }
    my $chordname=$_;
    $chordname =~ s/\W/_/g;
    if ($opt{local_chords}{$nn}) {
          $png = namit($opt{local_chords}{$nn}[0],$opt{local_chords}{$nn}[1],$chordname).".png";}
    else {$png = namit($chord{$nn}[0],$chord{$nn}[1],$chordname).".png";}
    build_chord_png (\%opt,$_, $png);
    $r.= "<img alt=\"chord $_\" src=\"$opt{relpath}/$png\"> \n";
 }
 $r;
}

sub latexchords{
 my %opt = (chordsize => "1.6cm" ,local_chords => {}, rebuild => 0, 
     dir => ".", relpath => ".");
 if(ref($_[0])){%opt = (%opt, %{shift(@_)})};

 my %h;
 @h{@_}=@_;
 my $r="";
 my $eps;
 my $file;

 foreach (sort {lc($a) cmp lc($b)} keys (%h)) {
    if(defined $chord{lc($_)}) {$_ = lc($_) }
    my $nn =doyourbestwith($_,$opt{local_chords} ); 
    unless ($nn) {
	print STDERR "Warning: unknown chord '$_'\n";
        next;
    }
    my $chordname=$_;
    $chordname =~ s/\W/_/g;
    if ($opt{local_chords}{$nn}) {
          $file=namit($opt{local_chords}{$nn}[0],$opt{local_chords}{$nn}[1],$chordname);}
    else {$file=namit($chord{$nn}[0],$chord{$nn}[1],$chordname);}
    build_chord(\%opt, $_, $file);
    $r.= "\\includegraphics[width=$opt{chordsize}]{$opt{relpath}/$file}\n";
 }
 $r;
}

sub namit{
  my ($chord,$base,$name)=@_;
  $chord=~ s/[nNxX-]/N/g;
  "chord_${chord}_${base}_${name}";
}


sub doyourbestwith{
  my $c = shift;
  my $lc = shift;
  if( defined $lc->{$c} or defined $chord{$c})                       { $c }
  elsif( defined $lc->{lc($c)} or defined $chord{lc($c)})            { lc($c) }
  elsif( $c =~ s/-$/m/  and defined $lc->{$c} || defined $chord{$c}) { $c }
  elsif( $c =~ s/º/dim/ and defined $lc->{$c} || defined $chord{$c}) { $c }
  elsif( $c =~ s{(d[oó]|r[eé]|mi|f[aá]|sol|l[aá]|si)}{$t{lc($1)}}eig and  
               defined $lc->{$c} || defined $chord{$c})              { $c }
  else{  print STDERR "Desconhecido! $c\n"; undef }
}

sub build_chord {
    my @p = @_;
    my $f = pop(@p);
    build_chord_eps(@p,"$f.eps");
    my %opt = (local_chords=> {}, rebuild => 0, dir => ".");
    if(ref($p[0])){%opt = (%opt, %{$p[0]})};

    return () if (-f "$opt{dir}/$f.pdf" && not $opt{rebuild} );
    system("epstopdf $opt{dir}/$f.eps");
}

sub build_chord_eps {
    my %opt = (local_chords=> {}, rebuild => 0, dir => ".");
    if(ref($_[0])){%opt = (%opt, %{shift(@_)})};
    my $c = shift;
    my $eps = shift;
    my $c1 = doyourbestwith($c,$opt{local_chords});
    my $s = $opt{local_chords}{$c1}[0] || $chord{$c1}[0]; 
    my $f = $opt{local_chords}{$c1}[1] || $chord{$c1}[1]; 
    my $i;
    my $size = 64;
    mkdir $opt{dir} unless -d $opt{dir};
    return () if (-f "$opt{dir}/$eps" && not $opt{rebuild} );

    my $im = new PostScript::Simple(   xsize => $size,
                                       ysize => $size,
                                       reencode => "ISOLatin1Encoding",
                                       units => "pt");

    $im->setfont("Times-Roman-iso", 12);
    $im->text(12, $size-12, $c);

    ($f != 1) && $im->text(0, (3*10) , $f);

    for ($i = 0; $i < 6; $i++) {
	my $c = substr ($s, $i, 1);
	if ($c =~ m/[NnXx-]/) {
	    $im->line (10 + $i * 8, (4*10)+ 7, 14 + $i * 8, (4*10) + 3);
	    $im->line (14 + $i * 8, (4*10)+ 7, 10 + $i * 8, (4*10) + 3);
	} elsif ($c =~ m/[1234]/) {
	    $im->circle ({filled=>1},12 + $i * 8, (4-$c) * 10 + 5, 3);
	} elsif ($c =~ m/0/) {
	    $im->circle (12 + $i * 8, (4*10)+ 5  , 3 );
	}
    }

    for ($i = 12; $i < 60; $i += 8) {
	$im->line ($i, 0, $i, 40);
    }

    for ($i = 0 ; $i <= 40; $i += 10) {
	$im->line (12, $i, 52, $i);
    }
    $im->output("$opt{dir}/$eps");
}

sub build_chord_png {
    my %opt = (local_chords=> {}, rebuild => 0, dir => ".");
    if(ref($_[0])){%opt = (%opt, %{shift(@_)})};
    my $c = shift;
    my $png = shift;
    my $c1 = doyourbestwith($c,$opt{local_chords});
    my $s = $opt{local_chords}{$c1}[0] || $chord{$c1}[0]; 
    my $f = $opt{local_chords}{$c1}[1] || $chord{$c1}[1]; 

    mkdir $opt{dir} unless -d $opt{dir};
    return () if (-f "$opt{dir}/$png" && not $opt{rebuild} );

    my $im = new GD::Image (64, 64);
    my $white = $im->colorAllocate (0xff, 0xff, 0xff);
    my $black = $im->colorAllocate (0, 0, 0);
    my $h = gdLargeFont->height + 7;
    my $i;

    $im->transparent ($white);
    $im->interlaced (0);
    $im->string (gdSmallFont, 12, 0, $c, $black);
    ($f != 1) && $im->string (gdSmallFont, 0, $h, $f, $black);

    for ($i = 0; $i < 6; $i++) {
	my $c = substr ($s, $i, 1);
	if ($c =~ m/[NnXx-]/) {
	    $im->line (10 + $i * 8, $h - 7, 14 + $i * 8, $h - 3, $black);
	    $im->line (14 + $i * 8, $h - 7, 10 + $i * 8, $h - 3, $black);
	} elsif ($c =~ m/[1234]/) {
	    $im->arc (12 + $i * 8, $h + $c * 10 - 5, 5, 6, 0, 360, $black);
	    $im->fill (12 + $i * 8, $h + $c * 10 - 5, $black);
	} elsif ($c =~ m/0/) {
	    $im->arc (12 + $i * 8, $h - 5, 6, 6, 0, 360, $black);
	}
    }

    for ($i = 12; $i < 60; $i += 8) {
	$im->line ($i, $h, $i, 64, $black);
    }

    for ($i = $h; $i <= 64; $i += 10) {
	$im->line (12, $i, 52, $i, $black);
    }


    open FILE, ">$opt{dir}/$png";
    binmode FILE;
    print FILE $im->png;
    close FILE;
}

sub abs2chord{
   my $s = shift;
   my @a;
   my @b;
   $s =~ s/^\s*(.*?)\s*$/$1/;
   if($s =~m/\s/){ @a = split(/\s+/,$s) }             # "x 2 2 1 0 0"
   else          { @a = ($s =~ m/([0-9nNxX-])/g); }   # "x22100"
   warn("Invalid chord $s\n") if (@a != 6);
   @b = sort {$a <=> $b} (grep(/[1-9]/,@a));
   my $M= $b[-1];
   my $m= ($M <= 4) ? 1 : $b[0];
   $s = join("", map {s/([1-9]\d*)/$1-$m+1/e; $_ } @a );
   [$s,$m];
}

sub local_chords {
 my $a;
 if (ref($_[0] ) eq "HASH") { $a = shift }
 else                        { $a = +{@_} }
 my %local_chords=();
 for(keys(%$a)){
    if(ref($a->{$_}) ){ $local_chords{$_} = $a->{$_};}
    else              { $local_chords{$_} = abs2chord($a->{$_});} } 
 +{%local_chords};
}

#---------------------------------------------------------------------------
# Chord definitions from CHORD 3.5
# CHORD is Copyright (C) 1991-1993 by Martin Leclerc & Mario Dorion & J.Joao
#---------------------------------------------------------------------------
sub learn_chords {

 my %a = @_;
 if(%a) { for(keys(%a)){
            next if ($chord{$_});
            if(ref($a{$_}) ){ $chord{$_} = $a{$_};}
            else            { $chord{$_} = abs2chord($a{$_});} } }
 else {
    %chord = (

	"Ab"		=> [ "133211", 4 ],
	"Ab+"		=> [ "NN2110", 1 ],
	"Ab4"		=> [ "NN1124", 1 ],
	"Ab7"		=> [ "NN1112", 1 ],
	"Ab11"		=> [ "131311", 4 ],
	"Absus"		=> [ "NN1124", 1 ],
	"Absus4"	=> [ "NN1124", 1 ],
	"Abdim"		=> [ "NN0101", 1 ],
	"Abmaj"		=> [ "133211", 4 ],
	"Abmaj7"	=> [ "NN1113", 1 ],
	"Abmin"		=> [ "133111", 4 ],
	"Abm"		=> [ "133111", 4 ],
	"Abm7"		=> [ "NN1111", 4 ],
	"A"		=> [ "N02220", 1 ],
	"A+"		=> [ "N03221", 1 ],
	"A4"		=> [ "002200", 1 ],
	"A6"		=> [ "NN2222", 1 ],
	"A7"		=> [ "N02020", 1 ],
	"A7+"		=> [ "NN3221", 1 ],
	"A7(9+)"	=> [ "N22223", 1 ],
	"A9"		=> [ "N02100", 1 ],
	"A11"		=> [ "N42433", 1 ],
	"A13"		=> [ "N01231", 5 ],
	"A7sus4"	=> [ "002030", 1 ],
	"A9sus"		=> [ "N02100", 1 ],
	"Asus"		=> [ "NN2230", 1 ],
	"Asus2"		=> [ "002200", 1 ],
	"Asus4"		=> [ "NN2230", 1 ],
	"Adim"		=> [ "NN1212", 1 ],
	"Amaj"		=> [ "N02220", 1 ],
	"Amaj7"		=> [ "N02120", 1 ],
	"Adim"		=> [ "NN1212", 1 ],
	"Amin"		=> [ "N02210", 1 ],
	"A/D"		=> [ "NN0022", 1 ],
	"A/F#"		=> [ "202220", 1 ],
	"A/G#"		=> [ "402220", 1 ],
	"Am"		=> [ "N02210", 1 ],
	"Am#7"		=> [ "NN2110", 1 ],
	"Am(7#)"	=> [ "N02214", 1 ],
	"Am6"		=> [ "N02212", 1 ],
	"Am7"		=> [ "N02213", 1 ],
	"Am7sus4"	=> [ "000030", 1 ],
	"Am9"		=> [ "N01113", 5 ],
	"Am/G"		=> [ "302210", 1 ],
	"Amadd9"	=> [ "022210", 1 ],
	"Am(add9)"	=> [ "022210", 1 ],
	"A#"		=> [ "N13331", 1 ],
	"A#+"		=> [ "NN0332", 1 ],
	"A#4"		=> [ "NN3341", 1 ],
	"A#7"		=> [ "NN1112", 3 ],
	"A#sus"		=> [ "NN3341", 1 ],
	"A#sus4"	=> [ "NN3341", 1 ],
	"A#maj"		=> [ "N13331", 1 ],
	"A#maj7"	=> [ "N1323N", 1 ],
	"A#dim"		=> [ "NN2323", 1 ],
	"A#min"		=> [ "N13321", 1 ],
	"A#m"		=> [ "N13321", 1 ],
	"A#m7"		=> [ "N13121", 1 ],
	"Bb"		=> [ "N13331", 1 ],
	"Bb+"		=> [ "NN0332", 1 ],
	"Bb4"		=> [ "NN3341", 1 ],
	"Bb6"		=> [ "NN3333", 1 ],
	"Bb7"		=> [ "NN1112", 3 ],
	"Bb9"		=> [ "131213", 6 ],
	"Bb11"		=> [ "131341", 6 ],
	"Bbsus"		=> [ "NN3341", 1 ],
	"Bbsus4"	=> [ "NN3341", 1 ],
	"Bbmaj"		=> [ "N13331", 1 ],
	"Bbmaj7"	=> [ "N1323N", 1 ],
	"Bbdim"		=> [ "NN2323", 1 ],
	"Bbmin"		=> [ "N13321", 1 ],
	"Bbm"		=> [ "N13321", 1 ],
	"Bbm7"		=> [ "N13121", 1 ],
	"Bbm9"		=> [ "NNN113", 6 ],
	"B"		=> [ "N24442", 1 ],
	"B+"		=> [ "NN1004", 1 ],
	"B4"		=> [ "NN3341", 2 ],
	"B7"		=> [ "021202", 1 ],
	"B7+"		=> [ "N21203", 1 ],
	"B7+5"		=> [ "N21203", 1 ],
	"B7#9"		=> [ "N2123N", 1 ],
	"B7(#9)"	=> [ "N2123N", 1 ],
	"B9"		=> [ "131213", 7 ],
	"B11"		=> [ "133200", 7 ],
	"B11/13"	=> [ "N11113", 2 ],
	"B13"		=> [ "N21204", 1 ],
	"Bsus"		=> [ "NN3341", 2 ],
	"Bsus4"		=> [ "NN3341", 2 ],
	"Bmaj"		=> [ "N2434N", 1 ],
	"Bmaj7"		=> [ "N2434N", 1 ],
	"Bdim"		=> [ "NN0101", 1 ],
	"Bmin"		=> [ "N24432", 1 ],
	"B/F#"		=> [ "022200", 2 ],
	"BaddE"		=> [ "N24400", 1 ],
	"B(addE)"	=> [ "N24400", 1 ],
	"BaddE/F#"	=> [ "2N4400", 1 ],
	"Bm"		=> [ "N24432", 1 ],
	"Bm6"		=> [ "NN4434", 1 ],
	"Bm7"		=> [ "N13121", 2 ],
	"Bmmaj7"	=> [ "N1443N", 1 ],
	"Bm(maj7)"	=> [ "N1443N", 1 ],
	"Bmsus9"	=> [ "NN4422", 1 ],
	"Bm(sus9)"	=> [ "NN4422", 1 ],
	"Bm7b5"		=> [ "124231", 1 ],
	"C"		=> [ "N32010", 1 ],
	"C+"		=> [ "NN2110", 1 ],
	"C4"		=> [ "NN3013", 1 ],
	"C6"		=> [ "N02213", 1 ],
	"C7"		=> [ "032310", 1 ],
	"C9"		=> [ "131213", 8 ],
	"C9(11)"	=> [ "N3333N", 1 ],
	"C11"		=> [ "N13141", 3 ],
	"Csus"		=> [ "NN3013", 1 ],
	"Csus2"		=> [ "N3001N", 1 ],
	"Csus4"		=> [ "NN3013", 1 ],
	"Csus9"		=> [ "NN4124", 7 ],
	"Cmaj"		=> [ "032010", 1 ],
	"Cmaj7"		=> [ "N32000", 1 ],
	"Cmin"		=> [ "N13321", 3 ],
	"Cdim"		=> [ "NN1212", 1 ],
	"C/B"		=> [ "N22010", 1 ],
	"Cadd2/B"	=> [ "N20010", 1 ],
	"CaddD"		=> [ "N32030", 1 ],
	"C(addD)"	=> [ "N32030", 1 ],
	"Cadd9"		=> [ "N32030", 1 ],
	"C(add9)"	=> [ "N32030", 1 ],
	"Cm"		=> [ "N13321", 3 ],
	"Cm7"		=> [ "N13121", 3 ],
	"Cm11"		=> [ "N1314N", 3 ],
	"C#"		=> [ "NN3121", 1 ],
	"C#+"		=> [ "NN3221", 1 ],
	"C#4"		=> [ "NN3341", 4 ],
	"C#7"		=> [ "NN3424", 1 ],
	"C#7(b5)"	=> [ "N21212", 1 ],
	"C#sus"		=> [ "NN3341", 4 ],
	"C#sus4"	=> [ "NN3341", 4 ],
	"C#maj"		=> [ "N43111", 1 ],
	"C#maj7"	=> [ "N43111", 1 ],
	"C#dim"		=> [ "NN2323", 1 ],
	"C#min"		=> [ "NN2120", 1 ],
	"C#add9"	=> [ "N13311", 4 ],
	"C#(add9)"	=> [ "N13311", 4 ],
	"C#m"		=> [ "NN2120", 1 ],
	"C#m7"		=> [ "NN2424", 1 ],
	"Db"		=> [ "NN3121", 1 ],
	"Db+"		=> [ "NN3221", 1 ],
	"Db7"		=> [ "NN3424", 1 ],
	"Dbsus"		=> [ "NN3341", 4 ],
	"Dbsus4"	=> [ "NN3341", 4 ],
	"Dbmaj"		=> [ "NN3121", 1 ],
	"Dbmaj7"	=> [ "N43111", 1 ],
	"Dbdim"		=> [ "NN2323", 1 ],
	"Dbmin"		=> [ "NN2120", 1 ],
	"Dbm"		=> [ "NN2120", 1 ],
	"Dbm7"		=> [ "NN2424", 1 ],
	"D"		=> [ "NN0232", 1 ],
	"D+"		=> [ "NN0332", 1 ],
	"D4"		=> [ "NN0233", 1 ],
	"D6"		=> [ "N00202", 1 ],
	"D7"		=> [ "NN0212", 1 ],
	"D7#9"		=> [ "N21233", 4 ],
	"D7(#9)"	=> [ "N21233", 4 ],
	"D9"		=> [ "131213",10 ],
	"D11"		=> [ "300210", 1 ],
	"Dsus"		=> [ "NN0233", 1 ],
	"Dsus2"		=> [ "000230", 1 ],
	"Dsus4"		=> [ "NN0233", 1 ],
	"D7sus2"	=> [ "N00210", 1 ],
	"D7sus4"	=> [ "N00213", 1 ],
	"Dmaj"		=> [ "NN0232", 1 ],
	"Dmaj7"		=> [ "NN0222", 1 ],
	"Ddim"		=> [ "NN0101", 1 ],
	"Dmin"		=> [ "NN0231", 1 ],
	"D/A"		=> [ "N00232", 1 ],
	"D/B"		=> [ "N20232", 1 ],
	"D/C"		=> [ "N30232", 1 ],
	"D/C#"		=> [ "N40232", 1 ],
	"D/E"		=> [ "N1111N", 7 ],
	"D/G"		=> [ "3N0232", 1 ],
	"D5/E"		=> [ "0111NN", 7 ],
	"Dadd9"		=> [ "000232", 1 ],
	"D(add9)"	=> [ "000232", 1 ],
	"D9add6"	=> [ "133200",10 ],
	"D9(add6)"	=> [ "133200",10 ],
	"Dm"		=> [ "NN0231", 1 ],
	"Dm6(5b)"	=> [ "NN0101", 1 ],
	"Dm7"		=> [ "NN0211", 1 ],
	"Dm#5"		=> [ "NN0332", 1 ],
	"Dm(#5)"	=> [ "NN0332", 1 ],
	"Dm#7"		=> [ "NN0221", 1 ],
	"Dm(#7)"	=> [ "NN0221", 1 ],
	"Dm/A"		=> [ "N00231", 1 ],
	"Dm/B"		=> [ "N20231", 1 ],
	"Dm/C"		=> [ "N30231", 1 ],
	"Dm/C#"		=> [ "N40231", 1 ],
	"Dm9"		=> [ "NN3210", 1 ],
	"D#"		=> [ "NN3121", 3 ],
	"D#+"		=> [ "NN1004", 1 ],
	"D#4"		=> [ "NN1344", 1 ],
	"D#7"		=> [ "NN1323", 1 ],
	"D#sus"		=> [ "NN1344", 1 ],
	"D#sus4"	=> [ "NN1344", 1 ],
	"D#maj"		=> [ "NN3121", 3 ],
	"D#maj7"	=> [ "NN1333", 1 ],
	"D#dim"		=> [ "NN1212", 1 ],
	"D#min"		=> [ "NN4342", 1 ],
	"D#m"		=> [ "NN4342", 1 ],
	"D#m7"		=> [ "NN1322", 1 ],
	"Eb"		=> [ "NN3121", 3 ],
	"Eb+"		=> [ "NN1004", 1 ],
	"Eb4"		=> [ "NN1344", 1 ],
	"Eb7"		=> [ "NN1323", 1 ],
	"Ebsus"		=> [ "NN1344", 1 ],
	"Ebsus4"	=> [ "NN1344", 1 ],
	"Ebmaj"		=> [ "NN1333", 1 ],
	"Ebmaj7"	=> [ "NN1333", 1 ],
	"Ebdim"		=> [ "NN1212", 1 ],
	"Ebadd9"	=> [ "N11341", 1 ],
	"Eb(add9)"	=> [ "N11341", 1 ],
	"Ebmin"		=> [ "NN4342", 1 ],
	"Ebm"		=> [ "NN4342", 1 ],
	"Ebm7"		=> [ "NN1322", 1 ],
	"E"		=> [ "022100", 1 ],
	"E+"		=> [ "NN2110", 1 ],
	"E5"		=> [ "0133NN", 7 ],
	"E6"		=> [ "NN3333", 9 ],
	"E7"		=> [ "022130", 1 ],
	"E7#9"		=> [ "022133", 1 ],
	"E7(#9)"	=> [ "022133", 1 ],
	"E7(5b)"	=> [ "N10130", 1 ],
	"E7b9"		=> [ "020132", 1 ],
	"E7(b9)"	=> [ "020132", 1 ],
	"E7(11)"	=> [ "022230", 1 ],
	"E9"		=> [ "131213", 1 ],
	"E11"		=> [ "111122", 1 ],
	"Esus"		=> [ "022200", 1 ],
	"Esus4"		=> [ "022200", 0 ],
	"Emaj"		=> [ "022100", 1 ],
	"Emaj7"		=> [ "02110N", 1 ],
	"Edim"		=> [ "NN2323", 1 ],
	"Emin"		=> [ "022000", 1 ],
	"Em"		=> [ "022000", 1 ],
	"Em6"		=> [ "022020", 1 ],
	"Em7"		=> [ "022030", 1 ],
	"Em/B"		=> [ "N22000", 1 ],
	"Em/D"		=> [ "NN0000", 1 ],
	"Em7/D"		=> [ "NN0000", 1 ],
	"Emsus4"	=> [ "002000", 1 ],
	"Em(sus4)"	=> [ "002000", 1 ],
	"Emadd9"	=> [ "024000", 1 ],
	"Em(add9)"	=> [ "024000", 1 ],
	"F"		=> [ "133211", 1 ],
	"F+"		=> [ "NN3221", 1 ],
	"F+7+11"	=> [ "133200", 1 ],
	"F4"		=> [ "NN3311", 1 ],
	"F6"		=> [ "N3323N", 1 ],
	"F7"		=> [ "131211", 1 ],
	"F9"		=> [ "242324", 1 ],
	"F11"		=> [ "131311", 1 ],
	"Fsus"		=> [ "NN3311", 1 ],
	"Fsus4"		=> [ "NN3311", 1 ],
	"Fmaj"		=> [ "133211", 1 ],
	"Fmaj7"		=> [ "N33210", 1 ],
	"Fdim"		=> [ "NN0101", 1 ],
	"Fmin"		=> [ "133111", 1 ],
	"F/A"		=> [ "N03211", 1 ],
	"F/C"		=> [ "NN3211", 1 ],
	"F/D"		=> [ "NN0211", 1 ],
	"F/G"		=> [ "333211", 1 ],
	"F7/A"		=> [ "N03011", 1 ],
	"Fmaj7/A"	=> [ "N03210", 1 ],
	"Fmaj7/C"	=> [ "N33210", 1 ],
	"Fmaj7(+5)"	=> [ "NN3220", 1 ],
	"Fadd9"		=> [ "303211", 1 ],
	"F(add9)"	=> [ "303211", 1 ],
	"FaddG"		=> [ "1N3213", 1 ],
	"FaddG"		=> [ "1N3213", 1 ],
	"Fm"		=> [ "133111", 1 ],
	"Fm6"		=> [ "NN0111", 1 ],
	"Fm7"		=> [ "131111", 1 ],
	"Fmmaj7"	=> [ "N33110", 1 ],
	"F#"		=> [ "244322", 1 ],
	"F#+"		=> [ "NN4332", 1 ],
	"F#7"		=> [ "NN4320", 1 ],
	"F#9"		=> [ "N12122", 1 ],
	"F#11"		=> [ "242422", 1 ],
	"F#sus"		=> [ "NN4422", 1 ],
	"F#sus4"	=> [ "NN4422", 1 ],
	"F#maj"		=> [ "244322", 0 ],
	"F#maj7"	=> [ "NN4321", 1 ],
	"F#dim"		=> [ "NN1212", 1 ],
	"F#min"		=> [ "244222", 1 ],
	"F#/E"		=> [ "044322", 1 ],
	"F#4"		=> [ "NN4422", 1 ],
	"F#m"		=> [ "244222", 1 ],
	"F#m6"		=> [ "NN1222", 1 ],
	"F#m7"		=> [ "NN2222", 1 ],
	"F#m7-5"	=> [ "102333", 2 ],
	"F#m/C#m"	=> [ "NN4222", 1 ],
	"Gb"		=> [ "244322", 1 ],
	"Gb+"		=> [ "NN4332", 1 ],
	"Gb7"		=> [ "NN4320", 1 ],
	"Gb9"		=> [ "N12122", 1 ],
	"Gbsus"		=> [ "NN4422", 1 ],
	"Gbsus4"	=> [ "NN4422", 1 ],
	"Gbmaj"		=> [ "244322", 1 ],
	"Gbmaj7"	=> [ "NN4321", 1 ],
	"Gbdim"		=> [ "NN1212", 1 ],
	"Gbmin"		=> [ "244222", 1 ],
	"Gbm"		=> [ "244222", 1 ],
	"Gbm7"		=> [ "NN2222", 1 ],
	"G"		=> [ "320003", 1 ],
	"G+"		=> [ "NN1004", 1 ],
	"G4"		=> [ "NN0013", 1 ],
	"G6"		=> [ "3N0000", 1 ],
	"G7"		=> [ "320001", 1 ],
	"G7+"		=> [ "NN4332", 1 ],
	"G7b9"		=> [ "NN0101", 1 ],
	"G7(b9)"	=> [ "NN0101", 1 ],
	"G7#9"		=> [ "13N244", 3 ],
	"G7(#9)"	=> [ "13N244", 3 ],
	"G9"		=> [ "3N0201", 1 ],
	"G9(11)"	=> [ "131313", 3 ],
	"G11"		=> [ "3N0211", 1 ],
	"Gsus"		=> [ "NN0013", 1 ],
	"Gsus4"		=> [ "NN0011", 1 ],
	"G6sus4"	=> [ "020010", 1 ],
	"G6(sus4)"	=> [ "020010", 1 ],
	"G7sus4"	=> [ "330011", 1 ],
	"G7(sus4)"	=> [ "330011", 1 ],
	"Gmaj"		=> [ "320003", 1 ],
	"Gmaj7"		=> [ "NN1234", 2 ],
	"Gmaj7sus4"	=> [ "NN0012", 1 ],
	"Gmaj9"		=> [ "114121", 2 ],
	"Gmin"		=> [ "133111", 3 ],
	"Gdim"		=> [ "NN2323", 1 ],
	"Gadd9"		=> [ "13N213", 3 ],
	"G(add9)"	=> [ "13N213", 3 ],
	"G/A"		=> [ "N00003", 1 ],
	"G/B"		=> [ "N20003", 1 ],
	"G/D"		=> [ "N22100", 4 ],
	"G/F#"		=> [ "220003", 1 ],
	"Gm"		=> [ "133111", 3 ],
	"Gm6"		=> [ "NN2333", 1 ],
	"Gm7"		=> [ "131111", 3 ],
	"Gm/Bb"		=> [ "3221NN", 4 ],
	"G#"		=> [ "133211", 4 ],
	"G#+"		=> [ "NN2110", 1 ],
	"G#4"		=> [ "133111", 4 ],
	"G#7"		=> [ "NN1112", 1 ],
	"G#sus"		=> [ "NN1124", 1 ],
	"G#sus4"	=> [ "NN1124", 1 ],
	"G#maj"		=> [ "133211", 4 ],
	"G#maj7"	=> [ "NN1113", 1 ],
	"G#dim"		=> [ "NN0101", 1 ],
	"G#min"		=> [ "133111", 4 ],
	"G#m"		=> [ "133111", 4 ],
	"G#m6"		=> [ "NN1101", 1 ],
	"G#m7"		=> [ "NN1111", 4 ],
	"G#m9maj7"	=> [ "NN1303", 1 ],
	"G#m9(maj7)"	=> [ "NN1303", 1 ],


	"h7"		=> [ "021202", 1 ],
    );
  }
}



BEGIN{ 
  %t = (
  "dó" => "C",
  "do" => "C",
  "ré" => "D",
  "re" => "D",
  "mi" => "E",
  "fá" => "F",
  "fa" => "F",
  "sol" => "G",
  "lá" => "A",
  "la" => "A",
  "si" => "B");
   chord::learn_chords(); }
1;

__END__

=head1 NAME

chord - Perl extension for generation of guitar chords images

=head1 SYNOPSIS

 use chord;
 print latexchords({dir=>"EPS"},"A","lá","dó7");
 print htmlchords({dir=>"PNG"},"A","lá","dó7");
 build_chord( "Am", "filename")  --> filenama.eps + filename.pdf
 build_chord_eps( "Am", "filename.eps")
 build_chord_png( {rebuilt => 1 }, "Bm7", "filename.png")
 learn_chords( z1 => "NN3555", z2 => "N1N011")
 learn_chords( z1 => ["NN1333",3] , z2 => "N1N011")
 
 $lc = local_chords( z1 => ["NN1333",3] , z2 => "N1N011")
 print latexchords({local_chords => $lc },"z1","lá");

=head1 DESCRIPTION

C<chord> was built to help in the production of HTML and LaTeX documents
containing guitar chords.

C<chord> makes EPS and PNG images and returns the HTML and LaTeX parts.

C<Chord> know about the most common chords. Chords can understand chord names
in "A", "Bm", "Dm7", ... notation and in "lá", "sim", "dóm7".

=head1 EXPORT

=head2 htmlchords

Creates a set of png file images (using build_chord_png) of the chords 
received as parameters. Whenever possible, it reuses previous images
unless rebuild parameter is given. If a directory is provided, it will be used.
This function returns a HTML line ready to be included in a HTML document. 

Examples:

  print htmlchords({dir=>"PNG",relpath=>"../PNG"},"A","Cm7");

=head2 latexchords

Creates a set of eps file images (using build_chord_eps) of the chords 
received as parameters. Whenever possible, it reuses previous images
unless rebuild parameter is given. If a directory is provided, it will be used.
This function returns a latex line ready to be included in a latex document. 
The main latex text where this line is included, should "usepackage" graphicx.

Examples:

  print latexchords({dir=>"EPS"},"lá","dó7");

  $lc = local_chords( z1 => ["NN1333",3] , z2 => "N1N011")
  print latexchords({rebuilt => 1, local_chords => $lc },"z1","lá","dó7");

=head2 learn_chords

This function defines a new chord. The most common chords are built-in
in the module, so they need not be defined this way. When a new chord is
defined, there are 3 notations acepted - see the examples.

New chords are valid just in the current process.

Example:

  learn_chords( z1 => "NN3555", z2 => "N1N011")
  learn_chords( z1 => ["NN1333",3] , z2 => "N1N011")
  learn_chords( z1 => "N N 0 12 12 12")

=head2 build_chord_eps 

Creates a eps file image of chord using GD. It reuses previous image unless
rebuild parameter is given.

Examples:

  build_chord_eps( "Am", "filename.eps")
  build_chord_eps( {rebuilt => 1 }, "Bm7", "filename.eps")

=head2 build_chord_png 

Creates PNG file image of chord using GD

Examples:

  build_chord_png( "Am", "filename.png")
  build_chord_png( {rebuilt => 1 }, "Bm7", "filename.png")

=head1 AUTHOR

J.Joao Almeida, jj@di.uminho.pt

=head1 SEE ALSO

perl(1).
GD(3)

LaTeX(1).
graphicx(3latex)

PostScript::Simple(3pm)

=cut      

	"láb"		=> [ "133211", 4 ],
	"láb+"		=> [ "NN2110", 1 ],
	"láb4"		=> [ "NN1124", 1 ],
	"láb7"		=> [ "NN1112", 1 ],
	"láb11"		=> [ "131311", 4 ],
	"lábsus"	=> [ "NN1124", 1 ],
	"lábsus4"	=> [ "NN1124", 1 ],
	"lábdim"	=> [ "NN0101", 1 ],
	"lábmaj"	=> [ "133211", 4 ],
	"lábmaj7"	=> [ "NN1113", 1 ],
	"lábmin"	=> [ "133111", 4 ],
	"lábm"		=> [ "133111", 4 ],
	"lábm7"		=> [ "NN1111", 4 ],
	"lá"		=> [ "N02220", 1 ],
	"lá+"		=> [ "N03221", 1 ],
	"lá4"		=> [ "002200", 1 ],
	"lá6"		=> [ "NN2222", 1 ],
	"lá7"		=> [ "N02020", 1 ],
	"lá7+"		=> [ "NN3221", 1 ],
	"lá7(9+)"	=> [ "N22223", 1 ],
	"lá9"		=> [ "N02100", 1 ],
	"lá11"		=> [ "N42433", 1 ],
	"lá13"		=> [ "N01231", 5 ],
	"lá7sus4"	=> [ "002030", 1 ],
	"lá9sus"	=> [ "N02100", 1 ],
	"lásus"		=> [ "NN2230", 1 ],
	"lásus2"	=> [ "002200", 1 ],
	"lásus4"	=> [ "NN2230", 1 ],
	"ládim"		=> [ "NN1212", 1 ],
	"lámaj"		=> [ "N02220", 1 ],
	"lámaj7"	=> [ "N02120", 1 ],
	"ládim"		=> [ "NN1212", 1 ],
	"lámin"		=> [ "N02210", 1 ],
	"lá/ré"		=> [ "NN0022", 1 ],
	"lá/fá#"		=> [ "202220", 1 ],
	"lá/sol#"		=> [ "402220", 1 ],
	"lám"		=> [ "N02210", 1 ],
	"lám#7"		=> [ "NN2110", 1 ],
	"lám(7#)"	=> [ "N02214", 1 ],
	"lám6"		=> [ "N02212", 1 ],
	"lám7"		=> [ "N02213", 1 ],
	"lám7sus4"	=> [ "000030", 1 ],
	"lám9"		=> [ "N01113", 5 ],
	"lám/sol"		=> [ "302210", 1 ],
	"lámadd9"	=> [ "022210", 1 ],
	"lám(add9)"	=> [ "022210", 1 ],
	"lá#"		=> [ "N13331", 1 ],
	"lá#+"		=> [ "NN0332", 1 ],
	"lá#4"		=> [ "NN3341", 1 ],
	"lá#7"		=> [ "NN1112", 3 ],
	"lá#sus"	=> [ "NN3341", 1 ],
	"lá#sus4"	=> [ "NN3341", 1 ],
	"lá#maj"	=> [ "N13331", 1 ],
	"lá#maj7"	=> [ "N1323N", 1 ],
	"lá#dim"	=> [ "NN2323", 1 ],
	"lá#min"	=> [ "N13321", 1 ],
	"lá#m"		=> [ "N13321", 1 ],
	"lá#m7"		=> [ "N13121", 1 ],
	"sib"		=> [ "N13331", 1 ],
	"sib+"		=> [ "NN0332", 1 ],
	"sib4"		=> [ "NN3341", 1 ],
	"sib6"		=> [ "NN3333", 1 ],
	"sib7"		=> [ "NN1112", 3 ],
	"sib9"		=> [ "131213", 6 ],
	"sib11"		=> [ "131341", 6 ],
	"sibsus"	=> [ "NN3341", 1 ],
	"sibsus4"	=> [ "NN3341", 1 ],
	"sibmaj"	=> [ "N13331", 1 ],
	"sibmaj7"	=> [ "N1323N", 1 ],
	"sibdim"	=> [ "NN2323", 1 ],
	"sibmin"	=> [ "N13321", 1 ],
	"sibm"		=> [ "N13321", 1 ],
	"sibm7"		=> [ "N13121", 1 ],
	"sibm9"		=> [ "NNN113", 6 ],
	"si"		=> [ "N24442", 1 ],
	"si+"		=> [ "NN1004", 1 ],
	"si4"		=> [ "NN3341", 2 ],
	"si7"		=> [ "021202", 1 ],
	"si7+"		=> [ "N21203", 1 ],
	"si7+5"		=> [ "N21203", 1 ],
	"si7#9"		=> [ "N2123N", 1 ],
	"si7(#9)"	=> [ "N2123N", 1 ],
	"si9"		=> [ "131213", 7 ],
	"si11"		=> [ "133200", 7 ],
	"si11/13"	=> [ "N11113", 2 ],
	"si13"		=> [ "N21204", 1 ],
	"sisus"		=> [ "NN3341", 2 ],
	"sisus4"	=> [ "NN3341", 2 ],
	"simaj"		=> [ "N2434N", 1 ],
	"simaj7"	=> [ "N2434N", 1 ],
	"sidim"		=> [ "NN0101", 1 ],
	"simin"		=> [ "N24432", 1 ],
	"si/fá#"		=> [ "022200", 2 ],
	"siaddE"	=> [ "N24400", 1 ],
	"si(addE)"	=> [ "N24400", 1 ],
	"siaddE/fá#"	=> [ "2N4400", 1 ],
	"sim"		=> [ "N24432", 1 ],
	"sim6"		=> [ "NN4434", 1 ],
	"sim7"		=> [ "N13121", 2 ],
	"simmaj7"	=> [ "N1443N", 1 ],
	"sim(maj7)"	=> [ "N1443N", 1 ],
	"simsus9"	=> [ "NN4422", 1 ],
	"sim(sus9)"	=> [ "NN4422", 1 ],
	"sim7b5"	=> [ "124231", 1 ],
	"dó"		=> [ "N32010", 1 ],
	"dó+"		=> [ "NN2110", 1 ],
	"dó4"		=> [ "NN3013", 1 ],
	"dó6"		=> [ "N02213", 1 ],
	"dó7"		=> [ "032310", 1 ],
	"dó9"		=> [ "131213", 8 ],
	"dó9(11)"	=> [ "N3333N", 1 ],
	"dó11"		=> [ "N13141", 3 ],
	"dósus"		=> [ "NN3013", 1 ],
	"dósus2"	=> [ "N3001N", 1 ],
	"dósus4"	=> [ "NN3013", 1 ],
	"dósus9"	=> [ "NN4124", 7 ],
	"dómaj"		=> [ "032010", 1 ],
	"dómaj7"	=> [ "N32000", 1 ],
	"dómin"		=> [ "N13321", 3 ],
	"dódim"		=> [ "NN1212", 1 ],
	"dó/si"		=> [ "N22010", 1 ],
	"dóadd2/si"	=> [ "N20010", 1 ],
	"dóaddD"	=> [ "N32030", 1 ],
	"dó(addD)"	=> [ "N32030", 1 ],
	"dóadd9"	=> [ "N32030", 1 ],
	"dó(add9)"	=> [ "N32030", 1 ],
	"dóm"		=> [ "N13321", 3 ],
	"dóm7"		=> [ "N13121", 3 ],
	"dóm11"		=> [ "N1314N", 3 ],
	"dó#"		=> [ "NN3121", 1 ],
	"dó#+"		=> [ "NN3221", 1 ],
	"dó#4"		=> [ "NN3341", 4 ],
	"dó#7"		=> [ "NN3424", 1 ],
	"dó#7(b5)"	=> [ "N21212", 1 ],
	"dó#sus"	=> [ "NN3341", 4 ],
	"dó#sus4"	=> [ "NN3341", 4 ],
	"dó#maj"	=> [ "N43111", 1 ],
	"dó#maj7"	=> [ "N43111", 1 ],
	"dó#dim"	=> [ "NN2323", 1 ],
	"dó#min"	=> [ "NN2120", 1 ],
	"dó#add9"	=> [ "N13311", 4 ],
	"dó#(add9)"	=> [ "N13311", 4 ],
	"dó#m"		=> [ "NN2120", 1 ],
	"dó#m7"		=> [ "NN2424", 1 ],
	"réb"		=> [ "NN3121", 1 ],
	"réb+"		=> [ "NN3221", 1 ],
	"réb7"		=> [ "NN3424", 1 ],
	"rébsus"	=> [ "NN3341", 4 ],
	"rébsus4"	=> [ "NN3341", 4 ],
	"rébmaj"	=> [ "NN3121", 1 ],
	"rébmaj7"	=> [ "N43111", 1 ],
	"rébdim"	=> [ "NN2323", 1 ],
	"rébmin"	=> [ "NN2120", 1 ],
	"rébm"		=> [ "NN2120", 1 ],
	"rébm7"		=> [ "NN2424", 1 ],
	"ré"		=> [ "NN0232", 1 ],
	"ré+"		=> [ "NN0332", 1 ],
	"ré4"		=> [ "NN0233", 1 ],
	"ré6"		=> [ "N00202", 1 ],
	"ré7"		=> [ "NN0212", 1 ],
	"ré7#9"		=> [ "N21233", 4 ],
	"ré7(#9)"	=> [ "N21233", 4 ],
	"ré9"		=> [ "131213",10 ],
	"ré11"		=> [ "300210", 1 ],
	"résus"		=> [ "NN0233", 1 ],
	"résus2"	=> [ "000230", 1 ],
	"résus4"	=> [ "NN0233", 1 ],
	"ré7sus2"	=> [ "N00210", 1 ],
	"ré7sus4"	=> [ "N00213", 1 ],
	"rémaj"		=> [ "NN0232", 1 ],
	"rémaj7"	=> [ "NN0222", 1 ],
	"rédim"		=> [ "NN0101", 1 ],
	"rémin"		=> [ "NN0231", 1 ],
	"ré/lá"		=> [ "N00232", 1 ],
	"ré/si"		=> [ "N20232", 1 ],
	"ré/dó"		=> [ "N30232", 1 ],
	"ré/dó#"		=> [ "N40232", 1 ],
	"ré/mi"		=> [ "N1111N", 7 ],
	"ré/sol"		=> [ "3N0232", 1 ],
	"ré5/mi"		=> [ "0111NN", 7 ],
	"réadd9"	=> [ "000232", 1 ],
	"ré(add9)"	=> [ "000232", 1 ],
	"ré9add6"	=> [ "133200",10 ],
	"ré9(add6)"	=> [ "133200",10 ],
	"rém"		=> [ "NN0231", 1 ],
	"rém6(5b)"	=> [ "NN0101", 1 ],
	"rém7"		=> [ "NN0211", 1 ],
	"rém#5"		=> [ "NN0332", 1 ],
	"rém(#5)"	=> [ "NN0332", 1 ],
	"rém#7"		=> [ "NN0221", 1 ],
	"rém(#7)"	=> [ "NN0221", 1 ],
	"rém/lá"		=> [ "N00231", 1 ],
	"rém/si"		=> [ "N20231", 1 ],
	"rém/dó"		=> [ "N30231", 1 ],
	"rém/dó#"	=> [ "N40231", 1 ],
	"rém9"		=> [ "NN3210", 1 ],
	"ré#"		=> [ "NN3121", 3 ],
	"ré#+"		=> [ "NN1004", 1 ],
	"ré#4"		=> [ "NN1344", 1 ],
	"ré#7"		=> [ "NN1323", 1 ],
	"ré#sus"	=> [ "NN1344", 1 ],
	"ré#sus4"	=> [ "NN1344", 1 ],
	"ré#maj"	=> [ "NN3121", 3 ],
	"ré#maj7"	=> [ "NN1333", 1 ],
	"ré#dim"	=> [ "NN1212", 1 ],
	"ré#min"	=> [ "NN4342", 1 ],
	"ré#m"		=> [ "NN4342", 1 ],
	"ré#m7"		=> [ "NN1322", 1 ],
	"mib"		=> [ "NN3121", 3 ],
	"mib+"		=> [ "NN1004", 1 ],
	"mib4"		=> [ "NN1344", 1 ],
	"mib7"		=> [ "NN1323", 1 ],
	"mibsus"	=> [ "NN1344", 1 ],
	"mibsus4"	=> [ "NN1344", 1 ],
	"mibmaj"	=> [ "NN1333", 1 ],
	"mibmaj7"	=> [ "NN1333", 1 ],
	"mibdim"	=> [ "NN1212", 1 ],
	"mibadd9"	=> [ "N11341", 1 ],
	"mib(add9)"	=> [ "N11341", 1 ],
	"mibmin"	=> [ "NN4342", 1 ],
	"mibm"		=> [ "NN4342", 1 ],
	"mibm7"		=> [ "NN1322", 1 ],
	"mi"		=> [ "022100", 1 ],
	"mi+"		=> [ "NN2110", 1 ],
	"mi5"		=> [ "0133NN", 7 ],
	"mi6"		=> [ "NN3333", 9 ],
	"mi7"		=> [ "022130", 1 ],
	"mi7#9"		=> [ "022133", 1 ],
	"mi7(#9)"	=> [ "022133", 1 ],
	"mi7(5b)"	=> [ "N10130", 1 ],
	"mi7b9"		=> [ "020132", 1 ],
	"mi7(b9)"	=> [ "020132", 1 ],
	"mi7(11)"	=> [ "022230", 1 ],
	"mi9"		=> [ "131213", 1 ],
	"mi11"		=> [ "111122", 1 ],
	"misus"		=> [ "022200", 1 ],
	"misus4"	=> [ "022200", 0 ],
	"mimaj"		=> [ "022100", 1 ],
	"mimaj7"	=> [ "02110N", 1 ],
	"midim"		=> [ "NN2323", 1 ],
	"mimin"		=> [ "022000", 1 ],
	"mim"		=> [ "022000", 1 ],
	"mim6"		=> [ "022020", 1 ],
	"mim7"		=> [ "022030", 1 ],
	"mim/si"		=> [ "N22000", 1 ],
	"mim/ré"		=> [ "NN0000", 1 ],
	"mim7/ré"	=> [ "NN0000", 1 ],
	"mimsus4"	=> [ "002000", 1 ],
	"mim(sus4)"	=> [ "002000", 1 ],
	"mimadd9"	=> [ "024000", 1 ],
	"mim(add9)"	=> [ "024000", 1 ],
	"fá"		=> [ "133211", 1 ],
	"fá+"		=> [ "NN3221", 1 ],
	"fá+7+11"	=> [ "133200", 1 ],
	"fá4"		=> [ "NN3311", 1 ],
	"fá6"		=> [ "N3323N", 1 ],
	"fá7"		=> [ "131211", 1 ],
	"fá9"		=> [ "242324", 1 ],
	"fá11"		=> [ "131311", 1 ],
	"fásus"		=> [ "NN3311", 1 ],
	"fásus4"	=> [ "NN3311", 1 ],
	"fámaj"		=> [ "133211", 1 ],
	"fámaj7"	=> [ "N33210", 1 ],
	"fádim"		=> [ "NN0101", 1 ],
	"fámin"		=> [ "133111", 1 ],
	"fá/lá"		=> [ "N03211", 1 ],
	"fá/dó"		=> [ "NN3211", 1 ],
	"fá/ré"		=> [ "NN0211", 1 ],
	"fá/sol"		=> [ "333211", 1 ],
	"fá7/lá"		=> [ "N03011", 1 ],
	"fámaj7/lá"	=> [ "N03210", 1 ],
	"fámaj7/dó"	=> [ "N33210", 1 ],
	"fámaj7(+5)"	=> [ "NN3220", 1 ],
	"fáadd9"	=> [ "303211", 1 ],
	"fá(add9)"	=> [ "303211", 1 ],
	"fáaddG"	=> [ "1N3213", 1 ],
	"fáaddG"	=> [ "1N3213", 1 ],
	"fám"		=> [ "133111", 1 ],
	"fám6"		=> [ "NN0111", 1 ],
	"fám7"		=> [ "131111", 1 ],
	"fámmaj7"	=> [ "N33110", 1 ],
	"fá#"		=> [ "244322", 1 ],
	"fá#+"		=> [ "NN4332", 1 ],
	"fá#7"		=> [ "NN4320", 1 ],
	"fá#9"		=> [ "N12122", 1 ],
	"fá#11"		=> [ "242422", 1 ],
	"fá#sus"	=> [ "NN4422", 1 ],
	"fá#sus4"	=> [ "NN4422", 1 ],
	"fá#maj"	=> [ "244322", 0 ],
	"fá#maj7"	=> [ "NN4321", 1 ],
	"fá#dim"	=> [ "NN1212", 1 ],
	"fá#min"	=> [ "244222", 1 ],
	"fá#/mi"		=> [ "044322", 1 ],
	"fá#4"		=> [ "NN4422", 1 ],
	"fá#m"		=> [ "244222", 1 ],
	"fá#m6"		=> [ "NN1222", 1 ],
	"fá#m7"		=> [ "NN2222", 1 ],
	"fá#m7-5"	=> [ "102333", 2 ],
	"fá#m/C#m"	=> [ "NN4222", 1 ],
	"solb"		=> [ "244322", 1 ],
	"solb+"		=> [ "NN4332", 1 ],
	"solb7"		=> [ "NN4320", 1 ],
	"solb9"		=> [ "N12122", 1 ],
	"solbsus"	=> [ "NN4422", 1 ],
	"solbsus4"	=> [ "NN4422", 1 ],
	"solbmaj"	=> [ "244322", 1 ],
	"solbmaj7"	=> [ "NN4321", 1 ],
	"solbdim"	=> [ "NN1212", 1 ],
	"solbmin"	=> [ "244222", 1 ],
	"solbm"		=> [ "244222", 1 ],
	"solbm7"	=> [ "NN2222", 1 ],
	"sol"		=> [ "320003", 1 ],
	"sol+"		=> [ "NN1004", 1 ],
	"sol4"		=> [ "NN0013", 1 ],
	"sol6"		=> [ "3N0000", 1 ],
	"sol7"		=> [ "320001", 1 ],
	"sol7+"		=> [ "NN4332", 1 ],
	"sol7b9"	=> [ "NN0101", 1 ],
	"sol7(b9)"	=> [ "NN0101", 1 ],
	"sol7#9"	=> [ "13N244", 3 ],
	"sol7(#9)"	=> [ "13N244", 3 ],
	"sol9"		=> [ "3N0201", 1 ],
	"sol9(11)"	=> [ "131313", 3 ],
	"sol11"		=> [ "3N0211", 1 ],
	"solsus"	=> [ "NN0013", 1 ],
	"solsus4"	=> [ "NN0011", 1 ],
	"sol6sus4"	=> [ "020010", 1 ],
	"sol6(sus4)"	=> [ "020010", 1 ],
	"sol7sus4"	=> [ "330011", 1 ],
	"sol7(sus4)"	=> [ "330011", 1 ],
	"solmaj"	=> [ "320003", 1 ],
	"solmaj7"	=> [ "NN1234", 2 ],
	"solmaj7sus4"	=> [ "NN0012", 1 ],
	"solmaj9"	=> [ "114121", 2 ],
	"solmin"	=> [ "133111", 3 ],
	"soldim"	=> [ "NN2323", 1 ],
	"soladd9"	=> [ "13N213", 3 ],
	"sol(add9)"	=> [ "13N213", 3 ],
	"sol/lá"		=> [ "N00003", 1 ],
	"sol/si"		=> [ "N20003", 1 ],
	"sol/ré"		=> [ "N22100", 4 ],
	"sol/fá#"	=> [ "220003", 1 ],
	"solm"		=> [ "133111", 3 ],
	"solm6"		=> [ "NN2333", 1 ],
	"solm7"		=> [ "131111", 3 ],
	"solm/sib"	=> [ "3221NN", 4 ],
	"sol#"		=> [ "133211", 4 ],
	"sol#+"		=> [ "NN2110", 1 ],
	"sol#4"		=> [ "133111", 4 ],
	"sol#7"		=> [ "NN1112", 1 ],
	"sol#sus"	=> [ "NN1124", 1 ],
	"sol#sus4"	=> [ "NN1124", 1 ],
	"sol#maj"	=> [ "133211", 4 ],
	"sol#maj7"	=> [ "NN1113", 1 ],
	"sol#dim"	=> [ "NN0101", 1 ],
	"sol#min"	=> [ "133111", 4 ],
	"sol#m"		=> [ "133111", 4 ],
	"sol#m6"	=> [ "NN1101", 1 ],
	"sol#m7"	=> [ "NN1111", 4 ],
	"sol#m9maj7"	=> [ "NN1303", 1 ],
	"sol#m9(maj7)"	=> [ "NN1303", 1 ],
=cut
