-%%%% predefined-fretboard-init.ly
+%%%% This file is part of LilyPond, the GNU music typesetter.
%%%%
-%%%% source file of the GNU LilyPond music typesetter
+%%%% Copyright (C) 2008--2012 Carl D. Sorensen <c_sorensen@byu.edu>
%%%%
-%%%% (c) 2008 Carl D. Sorensen <c_sorensen@byu.edu>
-
-%%%%% define storage structures
-
-% base-chord-shapes is an alist of chord shapes
-% in the form of fret-diagram-terse strings with
-% scheme symbols as keys. For convenience, the
-% symbols are LilyPond chordmode chord descriptions,
+%%%% LilyPond 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 3 of the License, or
+%%%% (at your option) any later version.
+%%%%
+%%%% LilyPond 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 LilyPond. If not, see <http://www.gnu.org/licenses/>.
+
+\version "2.16.0"
+
+% chord-shape-table is a hash-table of chord shapes
+% in the form of diagram-descriptions that can be
+% fret-diagram-verbose markup-llsts or
+% fret-diagram-terse strings.
+% The hash keys are pairs of scheme symbols and
+% string tunings. For convenience, the symbols in
+% this file are LilyPond chordmode chord descriptions,
% but that is unnecessary.
-#(define base-chord-shapes
- (list
- '(f . "1-1-(;3-3;3-4;2-2;1-1;1-1-);")
- '(f:m . "1-1-(;3-3;3-4;1-1;1-1;1-1-);")
- '(f:7 . "1-1-(;3-3;1-1;2-2;1-1;1-1-);")
- '(f:m7 . "1-1-(;3-3;1-1;1-1;1-1;1-1-);")
- '(bes . "x;1-1-(;3-2;3-3;3-4;1-1-);")
- '(bes:m . "x;1-1-(;3-3;3-4;2-2;1-1-);")
- '(bes:m7 . "x;1-1-(;3-3;1-1;2-2;1-1-);")
- '(bes:7 . "x;1-1-(;3-2;1-1;3-3;1-1-);")
- '(bes:maj7 . "x;1-1;3-3;2-2;3-4;x;")
- '(c:dim . "x;x;1-1;2-3;1-2;2-4;")
- '(c:aug . "x;x;2-2;1-1-(;1-1-);4-4;")
- '(cis . "x;x;3-3;1-1-(;2-2;1-1-);")
- '(ees:dim . "x;x;1-1;2-3;1-2;2-4;")
- '(a:dim . "x;x;1-1;2-3;1-2;2-4;")
- ))
-
-
% music function for adding a chord shape to
-% base-chord-shapes
+% chord-shape-table
addChordShape =
-#(define-music-function (parser location shape-pair)
- (pair?)
- (set! base-chord-shapes (acons
- (car shape-pair)
- (cdr shape-pair)
- base-chord-shapes))
- (make-music 'SequentialMusic 'void #t))
-
+#(define-void-function (parser location key-symbol tuning shape-definition)
+ (symbol? pair? string-or-pair?)
+ (_i "Add chord shape @var{shape-definition} to the @var{chord-shape-table}
+hash with the key @code{(cons @var{key-symbol} @var{tuning})}.")
+ (hash-set! chord-shape-table
+ (cons key-symbol tuning)
+ shape-definition))
+
+#(define (chord-shape shape-code tuning)
+ (get-chord-shape shape-code tuning chord-shape-table))
+
+% scheme function for copying/creating fretboard tables
+
+#(define (make-fretboard-table . rest)
+ "Create a new fretboard table. @code{rest} is an optional table name.
+If present, the new fretboard table starts as a copy of the fretboard
+table @code{rest}."
+ (if (null? rest)
+ (make-hash-table 101)
+ (let ((source-table (car rest)))
+ (hash-fold
+ (lambda (key value tab)
+ (hash-set! tab key value)
+ tab)
+ (make-hash-table 101)
+ source-table))))
% music function for adding a predefined diagram to
% fretboard-table
storePredefinedDiagram =
-#(define-music-function (parser location chord tuning terse-definition)
- (ly:music? list? string?)
- (let* ((pitches (event-chord-pitches
+#(define-void-function
+ (parser location fretboard-table chord tuning diagram-definition)
+ (hash-table? ly:music? pair? string-or-pair?)
+ (_i "Add predefined fret diagram defined by @var{diagram-definition}
+ for the chord pitches @var{chord} and the stringTuning @var{tuning}.")
+ (let* ((pitches (event-chord-pitches
(car (extract-named-music chord 'EventChord))))
- (hash-key (cons tuning pitches)))
- (hash-set! fretboard-table
- hash-key
- (parse-terse-string terse-definition)))
- (make-music 'SequentialMusic 'void #t))
-
-
-% for convenience, to eliminate storage list in .ly references
-
-#(define (chord-shape shape-code)
- (get-chord-shape shape-code base-chord-shapes))
-
-#(define predefined-diagram-table fretboard-table)
-
-%%%%%%%%%%%%%%%%%%%%%%%
-%%%
-
-% definitions of predefined diagrams below here
-
-%%%% c chords
-%
-\storePredefinedDiagram \chordmode {c}
- #guitar-tuning
- #"x;3-3;2-2;o;1-1;o;"
-\storePredefinedDiagram \chordmode {c:m}
- #guitar-tuning
- #(offset-fret 2 (chord-shape 'bes:m))
-\storePredefinedDiagram \chordmode {c:aug}
- #guitar-tuning
- #(chord-shape 'c:aug)
-\storePredefinedDiagram \chordmode {c:dim}
- #guitar-tuning
- #(chord-shape 'c:dim)
-\storePredefinedDiagram \chordmode {c:7}
- #guitar-tuning
- #"o;3-3;2-2;3-4;1-1;o;"
-\storePredefinedDiagram \chordmode {c:maj7}
- #guitar-tuning
- #"x;3-3;2-2;o;o;o;"
-\storePredefinedDiagram \chordmode {c:m7}
- #guitar-tuning
- #(offset-fret 2 (chord-shape 'bes:m7))
-
-%%%% cis chords
-%
-\storePredefinedDiagram \chordmode {cis}
- #guitar-tuning
- #(chord-shape 'cis)
-\storePredefinedDiagram \chordmode {cis:m}
- #guitar-tuning
- #"x;x;2-2;1-1;2-3;o;"
-\storePredefinedDiagram \chordmode {cis:aug}
- #guitar-tuning
- #"x;4-4;3-3;2-1;2-2;x;"
-\storePredefinedDiagram \chordmode {cis:dim}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'c:dim))
-\storePredefinedDiagram \chordmode {cis:7}
- #guitar-tuning
- #"x;x;3-2;4-3;2-1;4-4;"
-\storePredefinedDiagram \chordmode {cis:maj7}
- #guitar-tuning
- #"x;4-4;3-3;1-1-(;1-1;1-1-);"
-\storePredefinedDiagram \chordmode {cis:m7}
- #guitar-tuning
- #"x;4-4;2-2;1-1;o;o;"
-
-%%%% des chords
-%
-\storePredefinedDiagram \chordmode {des}
- #guitar-tuning
- #"x;x;3-3;1-1-(;2-2;1-1-);"
-\storePredefinedDiagram \chordmode {des:m}
- #guitar-tuning
- #"x;x;2-2;1-1;2-3;o;"
-\storePredefinedDiagram \chordmode {des:aug}
- #guitar-tuning
- #"x;4-4;3-3;2-1;2-2;x;"
-\storePredefinedDiagram \chordmode {des:dim}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'c:dim))
-\storePredefinedDiagram \chordmode {des:7}
- #guitar-tuning
- #"x;x;3-2;4-3;2-1;4-4;"
-\storePredefinedDiagram \chordmode {des:maj7}
- #guitar-tuning
- #"x;4-4;3-3;1-1-(;1-1;1-1-);"
-\storePredefinedDiagram \chordmode {des:m7}
- #guitar-tuning
- #"x;4-4;2-2;1-1;o;o;"
-
-%%%% d chords
-%
-\storePredefinedDiagram \chordmode {d}
- #guitar-tuning
- #"x;x;o;2-1;3-2;2-3;"
-\storePredefinedDiagram \chordmode {d:m}
- #guitar-tuning
- #"x;x;o;2-2;3-3;1-1;"
-\storePredefinedDiagram \chordmode {d:aug}
- #guitar-tuning
- #"x;x;o;3-2;3-3;2-1;"
-\storePredefinedDiagram \chordmode {d:dim}
- #guitar-tuning
- #"x;x;o;1-1;o;1-2;"
-\storePredefinedDiagram \chordmode {d:7}
- #guitar-tuning
- #"x;x;o;2-2;1-1;2-3;"
-\storePredefinedDiagram \chordmode {d:maj7}
- #guitar-tuning
- #"x;x;o;2-1;2-2;2-3;"
-\storePredefinedDiagram \chordmode {d:m7}
- #guitar-tuning
- #"x;x;o;2-2;1-1-(;1-1-);"
-
-%%%% dis chords
-%
-\storePredefinedDiagram \chordmode {dis}
- #guitar-tuning
- #(offset-fret 2 (chord-shape 'cis))
-\storePredefinedDiagram \chordmode {dis:m}
- #guitar-tuning
- #"x;x;4-3;3-2;4-4;1-1;"
-\storePredefinedDiagram \chordmode {dis:aug}
- #guitar-tuning
- #"3-3;2-2;1-1;o;o;3-4"
-\storePredefinedDiagram \chordmode {dis:dim}
- #guitar-tuning
- #(chord-shape 'ees:dim)
-\storePredefinedDiagram \chordmode {dis:7}
- #guitar-tuning
- #"x;x;1-1;3-3;2-2;3-4;"
-\storePredefinedDiagram \chordmode {dis:maj7}
- #guitar-tuning
- #"x;x;1-1;3-2;3-3;3-4;"
-\storePredefinedDiagram \chordmode {dis:m7}
- #guitar-tuning
- #"x;x;1-1;3-2;2-3;2-4;"
-
-%%%% ees chords
-%
-\storePredefinedDiagram \chordmode {ees}
- #guitar-tuning
- #(offset-fret 2 (chord-shape 'cis))
-\storePredefinedDiagram \chordmode {ees:m}
- #guitar-tuning
- #"x;x;4-3;3-2;4-4;1-1;"
-\storePredefinedDiagram \chordmode {ees:aug}
- #guitar-tuning
- #"3-3;2-2;1-1;o;o;3-4"
-\storePredefinedDiagram \chordmode {ees:dim}
- #guitar-tuning
- #(chord-shape 'ees:dim)
-\storePredefinedDiagram \chordmode {ees:7}
- #guitar-tuning
- #"x;x;1-1;3-3;2-2;3-4;"
-\storePredefinedDiagram \chordmode {ees:maj7}
- #guitar-tuning
- #"x;x;1-1;3-2;3-3;3-4;"
-\storePredefinedDiagram \chordmode {ees:m7}
- #guitar-tuning
- #"x;x;1-1;3-2;2-3;2-4;"
-
-%%%% e chords
-%
-\storePredefinedDiagram \chordmode {e}
- #guitar-tuning
- #"o;2-2;2-3;1-1;o;o;"
-\storePredefinedDiagram \chordmode {e:m}
- #guitar-tuning
- #"o;2-2;2-3;o;o;o;"
-\storePredefinedDiagram \chordmode {e:aug}
- #guitar-tuning
- #"o;3-3;2-2;1-1;x;x;"
-\storePredefinedDiagram \chordmode {e:dim}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'ees:dim))
-\storePredefinedDiagram \chordmode {e:7}
- #guitar-tuning
- #"o;2-2;o;1-1;o;o;"
-\storePredefinedDiagram \chordmode {e:maj7}
- #guitar-tuning
- #"o;2-3;1-1;1-2;o;x;"
-\storePredefinedDiagram \chordmode {e:m7}
- #guitar-tuning
- #"o;2-2;o;o;o;o;"
-
-%%%% f chords
-%
-\storePredefinedDiagram \chordmode {f}
- #guitar-tuning
- #(chord-shape 'f)
-\storePredefinedDiagram \chordmode {f:m}
- #guitar-tuning
- #(chord-shape 'f:m)
-\storePredefinedDiagram \chordmode {f:aug}
- #guitar-tuning
- #"x;x;1-1;4-3;4-4;3-2;"
-\storePredefinedDiagram \chordmode {f:dim}
- #guitar-tuning
- #"x;x;o;1-1;o;1-2;"
-\storePredefinedDiagram \chordmode {f:7}
- #guitar-tuning
- #(chord-shape 'f:7)
-\storePredefinedDiagram \chordmode {f:maj7}
- #guitar-tuning
- #"x;3-3;3-4;2-2;1-1;"
-\storePredefinedDiagram \chordmode {f:m7}
- #guitar-tuning
- #(chord-shape 'f:m7)
-
-%%%% fis chords
-%
-\storePredefinedDiagram \chordmode {fis}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'f))
-\storePredefinedDiagram \chordmode {fis:m}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'f:m))
-\storePredefinedDiagram \chordmode {fis:aug}
- #guitar-tuning
- #"2-2;1-1;o;3-4-(;3-4-);2-3;"
-\storePredefinedDiagram \chordmode {fis:dim}
- #guitar-tuning
- #"x;x;1-1;2-3;1-2;2-4;"
-\storePredefinedDiagram \chordmode {fis:7}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'f:7))
-\storePredefinedDiagram \chordmode {fis:maj7}
- #guitar-tuning
- #"x;x;4-4;3-3;2-2;1-1;"
-\storePredefinedDiagram \chordmode {fis:m7}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'f:m7))
-
-%%%% ges chords
-%
-\storePredefinedDiagram \chordmode {ges}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'f))
-\storePredefinedDiagram \chordmode {ges:m}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'f:m))
-\storePredefinedDiagram \chordmode {ges:aug}
- #guitar-tuning
- #"2-2;1-1;o;3-4-(;3-4-);2-3;"
-\storePredefinedDiagram \chordmode {ges:dim}
- #guitar-tuning
- #"x;x;1-1;2-3;1-2;2-4;"
-\storePredefinedDiagram \chordmode {ges:7}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'f:7))
-\storePredefinedDiagram \chordmode {ges:maj7}
- #guitar-tuning
- #"x;x;4-4;3-3;2-2;1-1;"
-\storePredefinedDiagram \chordmode {ges:m7}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'f:m7))
-
-%%%% g chords
-%
-\storePredefinedDiagram \chordmode {g}
- #guitar-tuning
- #"3-2;2-1;o;o;o;3-3;"
-\storePredefinedDiagram \chordmode {g:m}
- #guitar-tuning
- #(offset-fret 2 (chord-shape 'f:m))
-\storePredefinedDiagram \chordmode {g:aug}
- #guitar-tuning
- #"x;x;5-1;8-3;8-4;7-2;"
-\storePredefinedDiagram \chordmode {g:dim}
- #guitar-tuning
- #"x;x;5-2;6-4;5-3;3-1;"
-\storePredefinedDiagram \chordmode {g:7}
- #guitar-tuning
- #"3-3;2-2;o;o;o;1-1;"
-\storePredefinedDiagram \chordmode {g:maj7}
- #guitar-tuning
- #"x;x;5-4;4-3;3-2;2-1;"
-\storePredefinedDiagram \chordmode {g:m7}
- #guitar-tuning
- #(offset-fret 2 (chord-shape 'f:m7))
-
-%%%% gis chords
-%
-\storePredefinedDiagram \chordmode {gis}
- #guitar-tuning
- #(offset-fret 3 (chord-shape 'f))
-\storePredefinedDiagram \chordmode {gis:m}
- #guitar-tuning
- #(offset-fret 3 (chord-shape 'f:m))
-\storePredefinedDiagram \chordmode {gis:aug}
- #guitar-tuning
- #"o;3-4;2-3;1-1;1-2;o;"
-\storePredefinedDiagram \chordmode {gis:dim}
- #guitar-tuning
- #"x;x;o;1-1;o;1-2;"
-\storePredefinedDiagram \chordmode {gis:7}
- #guitar-tuning
- #(offset-fret 3 (chord-shape 'f:7))
-\storePredefinedDiagram \chordmode {gis:maj7}
- #guitar-tuning
- #"x;x;1-1-(;1-1;1-1-);3-3;"
-\storePredefinedDiagram \chordmode {gis:m7}
- #guitar-tuning
- #(offset-fret 3 (chord-shape 'f:m7))
-
-%%%% aes chords
-%
-\storePredefinedDiagram \chordmode {aes}
- #guitar-tuning
- #(offset-fret 3 (chord-shape 'f))
-\storePredefinedDiagram \chordmode {aes:m}
- #guitar-tuning
- #(offset-fret 3 (chord-shape 'f:m))
-\storePredefinedDiagram \chordmode {aes:aug}
- #guitar-tuning
- #"o;3-4;2-3;1-1;1-2;o;"
-\storePredefinedDiagram \chordmode {aes:dim}
- #guitar-tuning
- #"x;x;o;1-1;o;1-2;"
-\storePredefinedDiagram \chordmode {aes:7}
- #guitar-tuning
- #(offset-fret 3 (chord-shape 'f:7))
-\storePredefinedDiagram \chordmode {aes:maj7}
- #guitar-tuning
- #"x;x;1-1-(;1-1;1-1-);3-3;"
-\storePredefinedDiagram \chordmode {aes:m7}
- #guitar-tuning
- #(offset-fret 3 (chord-shape 'f:m7))
-
-%%%% a chords
-%
-\storePredefinedDiagram \chordmode {a}
- #guitar-tuning
- #"x;o;2-1;2-2;2-3;o;"
-\storePredefinedDiagram \chordmode {a:m}
- #guitar-tuning
- #"x;o;2-2;2-3;1-1;o;"
-\storePredefinedDiagram \chordmode {a:aug}
- #guitar-tuning
- #"x;o;3-4;2-2;2-3;1-1;"
-\storePredefinedDiagram \chordmode {a:dim}
- #guitar-tuning
- #(chord-shape 'a:dim)
-\storePredefinedDiagram \chordmode {a:7}
- #guitar-tuning
- #"x;o;2-1;o;2-3;o;"
-\storePredefinedDiagram \chordmode {a:maj7}
- #guitar-tuning
- #"x;o;2-2;1-1;2-3;o;"
-\storePredefinedDiagram \chordmode {a:m7}
- #guitar-tuning
- #"x;o;2-2;o;1-1;o;"
-
-%%%% ais chords
-%
-\storePredefinedDiagram \chordmode {ais}
- #guitar-tuning
- #(chord-shape 'bes)
-\storePredefinedDiagram \chordmode {ais:m}
- #guitar-tuning
- #(chord-shape 'bes:m)
-\storePredefinedDiagram \chordmode {ais:aug}
- #guitar-tuning
- #"2-2;1-1;o;3-4-(;3-4-);2-3;"
-\storePredefinedDiagram \chordmode {ais:dim}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'a:dim))
-\storePredefinedDiagram \chordmode {ais:7}
- #guitar-tuning
- #(chord-shape 'bes:7)
-\storePredefinedDiagram \chordmode {ais:maj7}
- #guitar-tuning
- #"x;1-1;3-3;2-2;3-4;x;"
-\storePredefinedDiagram \chordmode {ais:m7}
- #guitar-tuning
- #(chord-shape 'bes:m7)
-
-%%%% bes chords
-%
-\storePredefinedDiagram \chordmode {bes}
- #guitar-tuning
- #(chord-shape 'bes)
-\storePredefinedDiagram \chordmode {bes:m}
- #guitar-tuning
- #(chord-shape 'bes:m)
-\storePredefinedDiagram \chordmode {bes:aug}
- #guitar-tuning
- #"2-2;1-1;o;3-4-(;3-4-);2-3;"
-\storePredefinedDiagram \chordmode {bes:dim}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'a:dim))
-\storePredefinedDiagram \chordmode {bes:7}
- #guitar-tuning
- #(chord-shape 'bes:7)
-\storePredefinedDiagram \chordmode {bes:maj7}
- #guitar-tuning
- #"x;1-1;3-3;2-2;3-4;x;"
-\storePredefinedDiagram \chordmode {bes:m7}
- #guitar-tuning
- #(chord-shape 'bes:m7)
-
-%%%% b chords
-%
-\storePredefinedDiagram \chordmode {b}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'bes))
-\storePredefinedDiagram \chordmode {b:m}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'bes:m))
-\storePredefinedDiagram \chordmode {b:aug}
- #guitar-tuning
- #"x;3-2;2-1;o;o;x;"
-\storePredefinedDiagram \chordmode {b:dim}
- #guitar-tuning
- #"x;x;o;1-1;o;1-2;"
-\storePredefinedDiagram \chordmode {b:7}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'bes:7))
-\storePredefinedDiagram \chordmode {b:maj7}
- #guitar-tuning
- #"x;2-1;4-3;3-2;4-4;x;"
-\storePredefinedDiagram \chordmode {b:m7}
- #guitar-tuning
- #(offset-fret 1 (chord-shape 'bes:m7))
-
+ (hash-key (cons tuning pitches))
+ (verbose-definition (if (string? diagram-definition)
+ (parse-terse-string diagram-definition)
+ diagram-definition)))
+ (hash-set! fretboard-table
+ hash-key
+ verbose-definition)))