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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show 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 <?
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