/[cvs]/nfo/php/scripts/phpChoPro/chord2html.php
ViewVC logotype

Annotation of /nfo/php/scripts/phpChoPro/chord2html.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Mon Jan 20 18:38:54 2003 UTC (21 years, 5 months ago) by joko
Branch: MAIN
CVS Tags: HEAD
+ initial check-in

1 joko 1.1 <?
2     #!/usr/bin/php
3     #---------------------------------------------------------------------------
4     # chord2html.php - A PHP script to convert CHORD input files to HTML
5     # Copyright (C) 2002 Andreas Motl <andreas.motl@ilo.de>
6     #
7     # idea to port it to php and integrate with phpWiki:
8     # Copyright (C) 2002 Christoph Drieschner <christoph.drieschner@texorama.de>
9     #
10     # original perl version (chord2html.pl):
11     # Copyright (C) 1998,2002 Claudio Matsuoka <claudio@helllabs.org>
12     # with contributions from:
13     # Per Egil Kummervold <peregil@abex.no> and Erwin Burgstaller <i@wuell.net>
14     #
15     # This program is free software; you can redistribute it and/or modify
16     # it under the terms of the GNU General Public License as published by
17     # the Free Software Foundation; either version 2 of the License, or
18     # (at your option) any later version.
19     #
20     # This program is distributed in the hope that it will be useful,
21     # but WITHOUT ANY WARRANTY; without even the implied warranty of
22     # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23     # GNU General Public License for more details.
24     #
25     # You should have received a copy of the GNU General Public License
26     # along with this program; if not, write to the Free Software
27     # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28     #---------------------------------------------------------------------------
29    
30     // pre-set some of the formerly expected options ...
31     $opt_d = "img";
32     // ... and introduce some new ones
33     $opt_i = $input;
34     $opt_i = "itgwo.chopro";
35     $opt_v = 1;
36     $opt_t = 1;
37     $opt_s = "chord2html.css";
38     $opt_T = "png";
39    
40     //use GD;
41     //use Getopt::Std;
42    
43     //getopts ('d:hlno:qs:T:tVv');
44    
45     // Defaults
46     // gnu date formats its date this way (by default): "Fri Oct 25 08:50:55 CEST 2002"
47     $date = date("D M d H:m:s T Y");
48     $version = "0.1";
49     $bg_color = "white";
50     $format = "png";
51     $color = "color=\"blue\"";
52     $style = $opt_s;
53     //$me = $0;
54    
55     //$opt_q && ($opt_v = 0);
56    
57     //if ($opt_V) {
58     print "chord2html.php $version<br>\n";
59     //exit;
60     //}
61    
62     /*
63     if ($opt_h) {
64     print STDERR <<EOF;
65     chord2html $version
66     Copyright (C) 1998,2002 Claudio Matsuoka <claudio\@helllabs.org>,
67     (C) 2002 Per Egil Kummervold <peregil\@abex.no>, (C) 2002 Erwin
68     Burgstaller <ber\@aon.at>
69    
70     Usage: $me [options] input_file
71     Options:
72     -d dirname Create images in the given directory (default is current)
73     -h Print a summary of the command line options
74     -l Print lyrics only
75     -n Don\'t overwrite chord images that already exist
76     -o name Write output to file (default is stdout)
77     -q Quiet mode (turn off warnings)
78     -s filename Style sheet name (default is $style)
79     -T format Image format for generated chord grids (default is $format)
80     -t Add timestamp at the end of the generated page
81     -V Print version number
82     -v Verbose mode
83    
84     This program is free software; you can redistribute it and/or modify it
85     under the terms of the GNU General Public License as published by the
86     Free Software Foundation; either version 2 of the License, or (at your
87     option) any later version.
88    
89     This program is distributed in the hope that it will be useful, but
90     WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
91     or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
92     for more details.
93     EOF
94     exit 0;
95     }
96     */
97    
98     //$opt_o && (open (STDOUT, ">$opt_o") || die "$me: Can't create $opt_o\n");
99    
100     if ($opt_d) {
101     /*
102     if (opendir TESTDIR, $opt_d) {
103     closedir TESTDIR;
104     } else {
105     mkdir ($opt_d, 0755) || die "$me: Can't create directory $opt_d\n";
106     }
107     */
108     if (!preg_match('/\/$/', $opt_d)) { $opt_d .= "/"; }
109     }
110    
111     function m($pattern, &$matches) {
112     global $line;
113     if (preg_match($pattern, $line, $matches)) {
114     return 1;
115     }
116     }
117    
118     function mg($pattern, &$matches) {
119     global $line;
120     if (preg_match_all($pattern, $line, $matches)) {
121     return 1;
122     }
123     }
124    
125     function r($pattern, $replacement) {
126     global $line;
127     if ($line = preg_replace($pattern, $replacement, $line)) {
128     return 1;
129     }
130     }
131    
132     function logp($logstring) {
133     global $opt_v, $log;
134     if (!$opt_v) return;
135     $log .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=>" . $logstring . "\n";
136     //print $logstring . "<br>";
137     }
138    
139     function done() {
140     $space = 0;
141     $opt_l && print "<br>";
142     }
143    
144    
145    
146     # =======================================
147     # main
148     # =======================================
149    
150     learn_chords();
151    
152     $log = "";
153     $line = "";
154     $space = 1; # Initialize as 1 to remove garbage before {t: }
155     $line_nr = 0;
156     $header = array();
157    
158     // Parse input file
159     print "parsing input file $opt_i ...<br><hr>";
160     $file = file($opt_i);
161     foreach ($file as $line) {
162     $line_nr++;
163    
164     r("/\n/", "");
165    
166     $opt_t && logp("&nbsp;&nbsp;&nbsp;--->" . $line);
167    
168     r("/^\s*#.*/", ""); // Clean up comments
169    
170     // TODO:
171     // if (/{eot}/) { $tab = 0; %opt_l && next; print "\n</pre>\n"; next; }
172     // $opt_l && $tab && next;
173     // $tab && goto done;
174    
175     if (m("/{t:(.*)}/", $r) || m("/{title:(.*)}/", $r)) {
176     logp("Title: $r[1]");
177     $header['title'] = $r[1];
178     continue;
179     }
180    
181     if (m("/{st:(.*)}/", $r) || m("/{subtitle:(.*)}/", $r)) {
182     logp("Subtitle: $r[1]");
183     $header['subtitle'] = $r[1];
184     continue;
185     }
186    
187     if (is_array($header) && count($header) != -1) {
188     do_header($header);
189     unset($header);
190     }
191    
192     // TODO:
193     // Print lyrics only if -l is used
194     /*
195     if ($opt_l) {
196     m!{c[ib]?:(.*)}! && next;
197     m!{comment\w*:(.*)}! && next;
198     } else {
199     s!{c[ib]?:(.*)}!<h3>$1</h3>! && goto done;
200     s!{comment\w*:(.*)}!<p class="comment">$1</p>! && goto done;
201     }
202     */
203    
204     // Handle chord definition in old & new formats
205    
206     if (m("/{define:\s*([^\s]+) (\w) (\w) (\w) (\w) (\w) (\w) (\w)}/", $r)) {
207     logp("Chord $r[8]$r[7]$r[6]$r[5]$r[4]$r[3]:$r[2]: $r[1] (old format)");
208     $chord[$r[1]] = array( "$r[8]$r[7]$r[6]$r[5]$r[4]$r[3]", $r[2] );
209     continue;
210     }
211    
212     if (m("/{define\s*([^\s]+) base-fret (.) frets (.) (.) (.) (.) (.) (.)}/", $r)) {
213     logp("Chord $r[8]$r[7]$r[6]$r[5]$r[4]$r[3]:$r[2]: $r[1] (new format)");
214     $chord[$r[1]] = array( "$r[8]$r[7]$r[6]$r[5]$r[4]$r[3]", $r[2] );
215     continue;
216     }
217    
218     // TODO:
219     // if (/{sot}/) { $tab = 1; $opt_l && next; print "\n<pre>\n"; next; }
220    
221     if (m("/{soc}/", $r)) {
222     r("/{soc}/", '/\n<div class="chorus">\n/');
223     logp("{soc} -> div");
224     done();
225     continue;
226     }
227     if (m("/{eoc}/", $r)) {
228     r("/{eoc}/", "/\n</div>\n/");
229     logp("{eoc} -> /div");
230     done();
231     continue;
232     }
233    
234     if (m("/^\s*{(.*)}\s*$/", $r)) {
235     logp("Warning: $line: unknown directive \"$r[1]\"");
236     continue;
237     }
238    
239     if (!$space && m("/^\s*$/", $r)) {
240     r("/^\s*$/", "/\n<p>\n/");
241     $space = 1;
242     done();
243     continue;
244     }
245    
246     if (m("/^\s*$/", $r)) continue;
247     $space = 0;
248    
249     // TODO:
250     // Lyrics only mode
251     if ($opt_l) {
252     //s!\[[^\]]+\]!!g;
253     //goto done;
254     }
255    
256     // Extract chords
257     //@c = /\[([^\]]+)\]/g;
258     $pattern_chord = "/\[([^\]]+)\]/";
259    
260     print "<table cellspacing=0 cellpadding=0 border=0><tr>\n";
261     $td = ""; if (!m("/^\s*\[/", $r)) { print $td = "<td>\n"; }
262    
263     if (mg($pattern_chord, $r)) {
264     $entries = $r[0];
265     foreach ($entries as $entry) {
266     $entry = str_replace("[", "", $entry);
267     $entry = str_replace("]", "", $entry);
268     $h[$entry] = 1;
269     print "<td class=\"chord\">$entry</td>\n";
270     }
271     }
272    
273     r("/\[[^\]]+\]\s\s+/", "<td> &nbsp; &nbsp; &nbsp; &nbsp; ");
274     r("/\[[^\]]+\]\s+/", "<td> &nbsp; &nbsp; ");
275     r("/\[[^\]]+\]/", "<td>");
276     r("/ <td>/", "&nbsp;<td>");
277    
278     print "<tr>\n$td$line</tr></table>\n\n";
279    
280    
281     }
282    
283     print "<hr>";
284     print "<pre style=\"font-size:10px;\">log-output:\n\n$log</pre><hr>";
285    
286     //unless ($opt_l) {
287     // Display chord grids
288     print "<div class=\"grids\">\n";
289     foreach ($h as $key => $value) {
290     //print "key: $key<br>";
291     if (!$chord[$key]) {
292     logp("Warning: unknown chord '$i'");
293     continue;
294     }
295     $tmp = "chord_" . $chord[$key][0] . "_" . $chord[$key][1] . "." . $format;
296     print "<img alt=\"$key\" src=\"$opt_d$tmp\"> \n";
297     build_chord($key, $tmp);
298     }
299     print "</div>\n";
300     //
301    
302    
303     //if ($opt_t) {
304     ?>
305     <br>
306     <div class="timestamp">
307     Generated with chord2html.php <?= $version ?>, <?= $date ?>.
308     </div>
309     <?
310     //}
311    
312     ?>
313     </body>
314     </html>
315     <?
316    
317     #---------------------------------------------------------------------------
318     # Create html header
319     #---------------------------------------------------------------------------
320    
321     function do_header($t) {
322     global $version, $bg_color, $style;
323     if ($header_done) return;
324    
325     ?>
326     <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
327     <html>
328     <head>
329     <title><?= $t[title] ?></title>
330     <meta name="generator" content="chord2html <?= $version ?>">
331     <meta name="description" content="<?= $t[subtitle] ?>">
332     <meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
333     <link rel="StyleSheet" href="<?= $style ?>" type="text/css">
334     </head>
335     <body bgcolor="<?= $bg_color ?>">
336     <?
337    
338     $opt_l || print "<h1>$t[title]</h1>\n<h2>$t[subtitle]</h2>\n";
339    
340     $header_done = 1;
341     }
342    
343     #---------------------------------------------------------------------------
344     # Create PNG image of chord using GD
345     #---------------------------------------------------------------------------
346    
347     function build_chord($c, $image) {
348     global $chord, $opt_d, $format;
349    
350     $s = $chord[$c][0];
351     $f = $chord[$c][1];
352    
353     $imgfile = "$opt_d$image";
354    
355     // TODO: introduce an argument "rebuild"
356     if (0 && file_exists($imgfile)) {
357     logp("chord image $s:$f already exists -- skipping");
358     return;
359     }
360    
361     $im = ImageCreate(64, 64);
362     $white = ImageColorAllocate ($im, 0xff, 0xff, 0xff);
363     $black = ImageColorAllocate ($im, 0, 0, 0);
364     //$h = gdLargeFont->height + 7;
365     $h = 12 + 7;
366     $i;
367    
368     ImageColorTransparent($im, $white);
369    
370     ImageInterlace($im, 0);
371     ImageString($im, gdSmallFont, 12, 0, $c, $black);
372     ($f != 1) && ImageString($im, gdSmallFont, 0, $h, $f, $black);
373    
374     for ($i = 0; $i < 6; $i++) {
375     $c = substr($s, $i, 1);
376     if (preg_match("/[NnXx-]/", $c)) {
377     ImageLine($im, 10 + $i * 8, $h - 7, 14 + $i * 8, $h - 3, $black);
378     ImageLine($im, 14 + $i * 8, $h - 7, 10 + $i * 8, $h - 3, $black);
379     } elseif (preg_match("/[1234]/", $c)) {
380     ImageArc($im, 12 + $i * 8, $h + $c * 10 - 5, 5, 6, 0, 360, $black);
381     ImageFill($im, 12 + $i * 8, $h + $c * 10 - 5, $black);
382     } elseif (preg_match("/0/", $c)) {
383     ImageArc($im, 12 + $i * 8, $h - 5, 6, 6, 0, 360, $black);
384     }
385     }
386    
387     for ($i = 12; $i < 60; $i += 8) {
388     ImageLine($im, $i, $h, $i, 64, $black);
389     }
390    
391     for ($i = $h; $i <= 64; $i += 10) {
392     ImageLine($im, 12, $i, 52, $i, $black);
393     }
394    
395     logp("Creating chord image $s:$f > $imgfile");
396    
397     #$fp = fopen($imgfile);
398     #binmode FILE;
399     if ($format == "png") {
400     logp("Writing png to $imgfile");
401     ImagePng($im, $imgfile);
402     } elseif ($format == "gif") {
403     logp("Writing gif to $imgfile");
404     ImageGif($im, $imgfile);
405     } else {
406     logp("Unknown image format: $format");
407     }
408     #fclose($fp);
409    
410     }
411    
412    
413     #---------------------------------------------------------------------------
414     # Chord definitions from CHORD 3.5
415     # CHORD is Copyright (C) 1991-1993 by Martin Leclerc & Mario Dorion
416     #---------------------------------------------------------------------------
417    
418     function learn_chords() {
419     global $chord;
420     $chord = array(
421     "Ab" => array( "133211", 4 ),
422     "Ab+" => array( "NN2110", 1 ),
423     "Ab4" => array( "NN1124", 1 ),
424     "Ab7" => array( "NN1112", 1 ),
425     "Ab11" => array( "131311", 4 ),
426     "Absus" => array( "NN1124", 1 ),
427     "Absus4" => array( "NN1124", 1 ),
428     "Abdim" => array( "NN0101", 1 ),
429     "Abmaj" => array( "133211", 4 ),
430     "Abmaj7" => array( "NN1113", 1 ),
431     "Abmin" => array( "133111", 4 ),
432     "Abm" => array( "133111", 4 ),
433     "Abm7" => array( "NN1111", 4 ),
434     "A" => array( "N02220", 1 ),
435     "A+" => array( "N03221", 1 ),
436     "A4" => array( "002200", 1 ),
437     "A6" => array( "NN2222", 1 ),
438     "A7" => array( "N02020", 1 ),
439     "A7+" => array( "NN3221", 1 ),
440     "A7(9+)" => array( "N22223", 1 ),
441     "A9" => array( "N02100", 1 ),
442     "A11" => array( "N42433", 1 ),
443     "A13" => array( "N01231", 5 ),
444     "A7sus4" => array( "002030", 1 ),
445     "A9sus" => array( "N02100", 1 ),
446     "Asus" => array( "NN2230", 1 ),
447     "Asus2" => array( "002200", 1 ),
448     "Asus4" => array( "NN2230", 1 ),
449     "Adim" => array( "NN1212", 1 ),
450     "Amaj" => array( "N02220", 1 ),
451     "Amaj7" => array( "N02120", 1 ),
452     "Adim" => array( "NN1212", 1 ),
453     "Amin" => array( "N02210", 1 ),
454     "A/D" => array( "NN0022", 1 ),
455     "A/F#" => array( "202220", 1 ),
456     "A/G#" => array( "402220", 1 ),
457     "Am" => array( "N02210", 1 ),
458     "Am#7" => array( "NN2110", 1 ),
459     "Am(7#)" => array( "N02214", 1 ),
460     "Am6" => array( "N02212", 1 ),
461     "Am7" => array( "N02213", 1 ),
462     "Am7sus4" => array( "000030", 1 ),
463     "Am9" => array( "N01113", 5 ),
464     "Am/G" => array( "302210", 1 ),
465     "Amadd9" => array( "022210", 1 ),
466     "Am(add9)" => array( "022210", 1 ),
467     "A#" => array( "N13331", 1 ),
468     "A#+" => array( "NN0332", 1 ),
469     "A#4" => array( "NN3341", 1 ),
470     "A#7" => array( "NN1112", 3 ),
471     "A#sus" => array( "NN3341", 1 ),
472     "A#sus4" => array( "NN3341", 1 ),
473     "A#maj" => array( "N13331", 1 ),
474     "A#maj7" => array( "N1323N", 1 ),
475     "A#dim" => array( "NN2323", 1 ),
476     "A#min" => array( "N13321", 1 ),
477     "A#m" => array( "N13321", 1 ),
478     "A#m7" => array( "N13121", 1 ),
479     "Bb" => array( "N13331", 1 ),
480     "Bb+" => array( "NN0332", 1 ),
481     "Bb4" => array( "NN3341", 1 ),
482     "Bb6" => array( "NN3333", 1 ),
483     "Bb7" => array( "NN1112", 3 ),
484     "Bb9" => array( "131213", 6 ),
485     "Bb11" => array( "131341", 6 ),
486     "Bbsus" => array( "NN3341", 1 ),
487     "Bbsus4" => array( "NN3341", 1 ),
488     "Bbmaj" => array( "N13331", 1 ),
489     "Bbmaj7" => array( "N1323N", 1 ),
490     "Bbdim" => array( "NN2323", 1 ),
491     "Bbmin" => array( "N13321", 1 ),
492     "Bbm" => array( "N13321", 1 ),
493     "Bbm7" => array( "N13121", 1 ),
494     "Bbm9" => array( "NNN113", 6 ),
495     "B" => array( "N24442", 1 ),
496     "B+" => array( "NN1004", 1 ),
497     "B4" => array( "NN3341", 2 ),
498     "B7" => array( "021202", 1 ),
499     "B7+" => array( "N21203", 1 ),
500     "B7+5" => array( "N21203", 1 ),
501     "B7#9" => array( "N2123N", 1 ),
502     "B7(#9)" => array( "N2123N", 1 ),
503     "B9" => array( "131213", 7 ),
504     "B11" => array( "133200", 7 ),
505     "B11/13" => array( "N11113", 2 ),
506     "B13" => array( "N21204", 1 ),
507     "Bsus" => array( "NN3341", 2 ),
508     "Bsus4" => array( "NN3341", 2 ),
509     "Bmaj" => array( "N2434N", 1 ),
510     "Bmaj7" => array( "N2434N", 1 ),
511     "Bdim" => array( "NN0101", 1 ),
512     "Bmin" => array( "N24432", 1 ),
513     "B/F#" => array( "022200", 2 ),
514     "BaddE" => array( "N24400", 1 ),
515     "B(addE)" => array( "N24400", 1 ),
516     "BaddE/F#" => array( "2N4400", 1 ),
517     "Bm" => array( "N24432", 1 ),
518     "Bm6" => array( "NN4434", 1 ),
519     "Bm7" => array( "N13121", 2 ),
520     "Bmmaj7" => array( "N1443N", 1 ),
521     "Bm(maj7)" => array( "N1443N", 1 ),
522     "Bmsus9" => array( "NN4422", 1 ),
523     "Bm(sus9)" => array( "NN4422", 1 ),
524     "Bm7b5" => array( "124231", 1 ),
525     "C" => array( "N32010", 1 ),
526     "C+" => array( "NN2110", 1 ),
527     "C4" => array( "NN3013", 1 ),
528     "C6" => array( "N02213", 1 ),
529     "C7" => array( "032310", 1 ),
530     "C9" => array( "131213", 8 ),
531     "C9(11)" => array( "N3333N", 1 ),
532     "C11" => array( "N13141", 3 ),
533     "Csus" => array( "NN3013", 1 ),
534     "Csus2" => array( "N3001N", 1 ),
535     "Csus4" => array( "NN3013", 1 ),
536     "Csus9" => array( "NN4124", 7 ),
537     "Cmaj" => array( "032010", 1 ),
538     "Cmaj7" => array( "N32000", 1 ),
539     "Cmin" => array( "N13321", 3 ),
540     "Cdim" => array( "NN1212", 1 ),
541     "C/B" => array( "N22010", 1 ),
542     "Cadd2/B" => array( "N20010", 1 ),
543     "CaddD" => array( "N32030", 1 ),
544     "C(addD)" => array( "N32030", 1 ),
545     "Cadd9" => array( "N32030", 1 ),
546     "C(add9)" => array( "N32030", 1 ),
547     "Cm" => array( "N13321", 3 ),
548     "Cm7" => array( "N13121", 3 ),
549     "Cm11" => array( "N1314N", 3 ),
550     "C#" => array( "NN3121", 1 ),
551     "C#+" => array( "NN3221", 1 ),
552     "C#4" => array( "NN3341", 4 ),
553     "C#7" => array( "NN3424", 1 ),
554     "C#7(b5)" => array( "N21212", 1 ),
555     "C#sus" => array( "NN3341", 4 ),
556     "C#sus4" => array( "NN3341", 4 ),
557     "C#maj" => array( "N43111", 1 ),
558     "C#maj7" => array( "N43111", 1 ),
559     "C#dim" => array( "NN2323", 1 ),
560     "C#min" => array( "NN2120", 1 ),
561     "C#add9" => array( "N13311", 4 ),
562     "C#(add9)" => array( "N13311", 4 ),
563     "C#m" => array( "NN2120", 1 ),
564     "C#m7" => array( "NN2424", 1 ),
565     "Db" => array( "NN3121", 1 ),
566     "Db+" => array( "NN3221", 1 ),
567     "Db7" => array( "NN3424", 1 ),
568     "Dbsus" => array( "NN3341", 4 ),
569     "Dbsus4" => array( "NN3341", 4 ),
570     "Dbmaj" => array( "NN3121", 1 ),
571     "Dbmaj7" => array( "N43111", 1 ),
572     "Dbdim" => array( "NN2323", 1 ),
573     "Dbmin" => array( "NN2120", 1 ),
574     "Dbm" => array( "NN2120", 1 ),
575     "Dbm7" => array( "NN2424", 1 ),
576     "D" => array( "NN0232", 1 ),
577     "D+" => array( "NN0332", 1 ),
578     "D4" => array( "NN0233", 1 ),
579     "D6" => array( "N00202", 1 ),
580     "D7" => array( "NN0212", 1 ),
581     "D7#9" => array( "N21233", 4 ),
582     "D7(#9)" => array( "N21233", 4 ),
583     "D9" => array( "131213",10 ),
584     "D11" => array( "300210", 1 ),
585     "Dsus" => array( "NN0233", 1 ),
586     "Dsus2" => array( "000230", 1 ),
587     "Dsus4" => array( "NN0233", 1 ),
588     "D7sus2" => array( "N00210", 1 ),
589     "D7sus4" => array( "N00213", 1 ),
590     "Dmaj" => array( "NN0232", 1 ),
591     "Dmaj7" => array( "NN0222", 1 ),
592     "Ddim" => array( "NN0101", 1 ),
593     "Dmin" => array( "NN0231", 1 ),
594     "D/A" => array( "N00232", 1 ),
595     "D/B" => array( "N20232", 1 ),
596     "D/C" => array( "N30232", 1 ),
597     "D/C#" => array( "N40232", 1 ),
598     "D/E" => array( "N1111N", 7 ),
599     "D/G" => array( "3N0232", 1 ),
600     "D5/E" => array( "0111NN", 7 ),
601     "Dadd9" => array( "000232", 1 ),
602     "D(add9)" => array( "000232", 1 ),
603     "D9add6" => array( "133200",10 ),
604     "D9(add6)" => array( "133200",10 ),
605     "Dm" => array( "NN0231", 1 ),
606     "Dm6(5b)" => array( "NN0101", 1 ),
607     "Dm7" => array( "NN0211", 1 ),
608     "Dm#5" => array( "NN0332", 1 ),
609     "Dm(#5)" => array( "NN0332", 1 ),
610     "Dm#7" => array( "NN0221", 1 ),
611     "Dm(#7)" => array( "NN0221", 1 ),
612     "Dm/A" => array( "N00231", 1 ),
613     "Dm/B" => array( "N20231", 1 ),
614     "Dm/C" => array( "N30231", 1 ),
615     "Dm/C#" => array( "N40231", 1 ),
616     "Dm9" => array( "NN3210", 1 ),
617     "D#" => array( "NN3121", 3 ),
618     "D#+" => array( "NN1004", 1 ),
619     "D#4" => array( "NN1344", 1 ),
620     "D#7" => array( "NN1323", 1 ),
621     "D#sus" => array( "NN1344", 1 ),
622     "D#sus4" => array( "NN1344", 1 ),
623     "D#maj" => array( "NN3121", 3 ),
624     "D#maj7" => array( "NN1333", 1 ),
625     "D#dim" => array( "NN1212", 1 ),
626     "D#min" => array( "NN4342", 1 ),
627     "D#m" => array( "NN4342", 1 ),
628     "D#m7" => array( "NN1322", 1 ),
629     "Eb" => array( "NN3121", 3 ),
630     "Eb+" => array( "NN1004", 1 ),
631     "Eb4" => array( "NN1344", 1 ),
632     "Eb7" => array( "NN1323", 1 ),
633     "Ebsus" => array( "NN1344", 1 ),
634     "Ebsus4" => array( "NN1344", 1 ),
635     "Ebmaj" => array( "NN1333", 1 ),
636     "Ebmaj7" => array( "NN1333", 1 ),
637     "Ebdim" => array( "NN1212", 1 ),
638     "Ebadd9" => array( "N11341", 1 ),
639     "Eb(add9)" => array( "N11341", 1 ),
640     "Ebmin" => array( "NN4342", 1 ),
641     "Ebm" => array( "NN4342", 1 ),
642     "Ebm7" => array( "NN1322", 1 ),
643     "E" => array( "022100", 1 ),
644     "E+" => array( "NN2110", 1 ),
645     "E5" => array( "0133NN", 7 ),
646     "E6" => array( "NN3333", 9 ),
647     "E7" => array( "022130", 1 ),
648     "E7#9" => array( "022133", 1 ),
649     "E7(#9)" => array( "022133", 1 ),
650     "E7(5b)" => array( "N10130", 1 ),
651     "E7b9" => array( "020132", 1 ),
652     "E7(b9)" => array( "020132", 1 ),
653     "E7(11)" => array( "022230", 1 ),
654     "E9" => array( "131213", 1 ),
655     "E11" => array( "111122", 1 ),
656     "Esus" => array( "022200", 1 ),
657     "Esus4" => array( "022200", 0 ),
658     "Emaj" => array( "022100", 1 ),
659     "Emaj7" => array( "02110N", 1 ),
660     "Edim" => array( "NN2323", 1 ),
661     "Emin" => array( "022000", 1 ),
662     "Em" => array( "022000", 1 ),
663     "Em6" => array( "022020", 1 ),
664     "Em7" => array( "022030", 1 ),
665     "Em/B" => array( "N22000", 1 ),
666     "Em/D" => array( "NN0000", 1 ),
667     "Em7/D" => array( "NN0000", 1 ),
668     "Emsus4" => array( "002000", 1 ),
669     "Em(sus4)" => array( "002000", 1 ),
670     "Emadd9" => array( "024000", 1 ),
671     "Em(add9)" => array( "024000", 1 ),
672     "F" => array( "133211", 1 ),
673     "F+" => array( "NN3221", 1 ),
674     "F+7+11" => array( "133200", 1 ),
675     "F4" => array( "NN3311", 1 ),
676     "F6" => array( "N3323N", 1 ),
677     "F7" => array( "131211", 1 ),
678     "F9" => array( "242324", 1 ),
679     "F11" => array( "131311", 1 ),
680     "Fsus" => array( "NN3311", 1 ),
681     "Fsus4" => array( "NN3311", 1 ),
682     "Fmaj" => array( "133211", 1 ),
683     "Fmaj7" => array( "N33210", 1 ),
684     "Fdim" => array( "NN0101", 1 ),
685     "Fmin" => array( "133111", 1 ),
686     "F/A" => array( "N03211", 1 ),
687     "F/C" => array( "NN3211", 1 ),
688     "F/D" => array( "NN0211", 1 ),
689     "F/G" => array( "333211", 1 ),
690     "F7/A" => array( "N03011", 1 ),
691     "Fmaj7/A" => array( "N03210", 1 ),
692     "Fmaj7/C" => array( "N33210", 1 ),
693     "Fmaj7(+5)" => array( "NN3220", 1 ),
694     "Fadd9" => array( "303211", 1 ),
695     "F(add9)" => array( "303211", 1 ),
696     "FaddG" => array( "1N3213", 1 ),
697     "FaddG" => array( "1N3213", 1 ),
698     "Fm" => array( "133111", 1 ),
699     "Fm6" => array( "NN0111", 1 ),
700     "Fm7" => array( "131111", 1 ),
701     "Fmmaj7" => array( "N33110", 1 ),
702     "F#" => array( "244322", 1 ),
703     "F#+" => array( "NN4332", 1 ),
704     "F#7" => array( "NN4320", 1 ),
705     "F#9" => array( "N12122", 1 ),
706     "F#11" => array( "242422", 1 ),
707     "F#sus" => array( "NN4422", 1 ),
708     "F#sus4" => array( "NN4422", 1 ),
709     "F#maj" => array( "244322", 0 ),
710     "F#maj7" => array( "NN4321", 1 ),
711     "F#dim" => array( "NN1212", 1 ),
712     "F#min" => array( "244222", 1 ),
713     "F#/E" => array( "044322", 1 ),
714     "F#4" => array( "NN4422", 1 ),
715     "F#m" => array( "244222", 1 ),
716     "F#m6" => array( "NN1222", 1 ),
717     "F#m7" => array( "NN2222", 1 ),
718     "F#m7-5" => array( "102333", 2 ),
719     "F#m/C#m" => array( "NN4222", 1 ),
720     "Gb" => array( "244322", 1 ),
721     "Gb+" => array( "NN4332", 1 ),
722     "Gb7" => array( "NN4320", 1 ),
723     "Gb9" => array( "N12122", 1 ),
724     "Gbsus" => array( "NN4422", 1 ),
725     "Gbsus4" => array( "NN4422", 1 ),
726     "Gbmaj" => array( "244322", 1 ),
727     "Gbmaj7" => array( "NN4321", 1 ),
728     "Gbdim" => array( "NN1212", 1 ),
729     "Gbmin" => array( "244222", 1 ),
730     "Gbm" => array( "244222", 1 ),
731     "Gbm7" => array( "NN2222", 1 ),
732     "G" => array( "320003", 1 ),
733     "G+" => array( "NN1004", 1 ),
734     "G4" => array( "NN0013", 1 ),
735     "G6" => array( "3N0000", 1 ),
736     "G7" => array( "320001", 1 ),
737     "G7+" => array( "NN4332", 1 ),
738     "G7b9" => array( "NN0101", 1 ),
739     "G7(b9)" => array( "NN0101", 1 ),
740     "G7#9" => array( "13N244", 3 ),
741     "G7(#9)" => array( "13N244", 3 ),
742     "G9" => array( "3N0201", 1 ),
743     "G9(11)" => array( "131313", 3 ),
744     "G11" => array( "3N0211", 1 ),
745     "Gsus" => array( "NN0013", 1 ),
746     "Gsus4" => array( "NN0011", 1 ),
747     "G6sus4" => array( "020010", 1 ),
748     "G6(sus4)" => array( "020010", 1 ),
749     "G7sus4" => array( "330011", 1 ),
750     "G7(sus4)" => array( "330011", 1 ),
751     "Gmaj" => array( "320003", 1 ),
752     "Gmaj7" => array( "NN1234", 2 ),
753     "Gmaj7sus4" => array( "NN0012", 1 ),
754     "Gmaj9" => array( "114121", 2 ),
755     "Gmin" => array( "133111", 3 ),
756     "Gdim" => array( "NN2323", 1 ),
757     "Gadd9" => array( "13N213", 3 ),
758     "G(add9)" => array( "13N213", 3 ),
759     "G/A" => array( "N00003", 1 ),
760     "G/B" => array( "N20003", 1 ),
761     "G/D" => array( "N22100", 4 ),
762     "G/F#" => array( "220003", 1 ),
763     "Gm" => array( "133111", 3 ),
764     "Gm6" => array( "NN2333", 1 ),
765     "Gm7" => array( "131111", 3 ),
766     "Gm/Bb" => array( "3221NN", 4 ),
767     "G#" => array( "133211", 4 ),
768     "G#+" => array( "NN2110", 1 ),
769     "G#4" => array( "133111", 4 ),
770     "G#7" => array( "NN1112", 1 ),
771     "G#sus" => array( "NN1124", 1 ),
772     "G#sus4" => array( "NN1124", 1 ),
773     "G#maj" => array( "133211", 4 ),
774     "G#maj7" => array( "NN1113", 1 ),
775     "G#dim" => array( "NN0101", 1 ),
776     "G#min" => array( "133111", 4 ),
777     "G#m" => array( "133111", 4 ),
778     "G#m6" => array( "NN1101", 1 ),
779     "G#m7" => array( "NN1111", 4 ),
780     "G#m9maj7" => array( "NN1303", 1 ),
781     "G#m9(maj7)" => array( "NN1303", 1 )
782     );
783     }
784    

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed