]> git.donarmstrong.com Git - lilypond.git/commitdiff
Color and/or parenthesize single dots in fret-diagrams
authorThomas Morley <thomasmorley65@gmail.com>
Mon, 26 May 2014 21:44:30 +0000 (23:44 +0200)
committerThomas Morley <thomasmorley65@gmail.com>
Fri, 20 Jun 2014 18:25:17 +0000 (20:25 +0200)
Issue 2752

Makes it possible to color and/or parenthesize single dots in
fret-diagram-verbose

Introducing two properties for use in fret-diagram-details
 - fret-label-horizontal-offset
    affecting the fret-label-indication, like the existing
    `fret-label-vertical-offset'
 - paren-padding
    affecting the padding of the parenthesis

Extending relevant reg-tests.

Documenting it in NR, fretted-strings.itely

Documentation/notation/fretted-strings.itely
input/regression/fret-diagrams-dots.ly
input/regression/fret-diagrams-fingering.ly
input/regression/fret-diagrams-fret-label.ly
scm/define-grob-properties.scm
scm/fret-diagrams.scm

index f8461b4ada4139feb0bf57c228d123e9571e00a1..76d8f5d37578943e75901c57308a992d709d0a8e 100644 (file)
@@ -998,12 +998,15 @@ can be placed on the fret diagram.  The capo indication is
 a thick bar that covers all strings.  The fret with the
 capo will be the lowest fret in the fret diagram.
 
+Fingering indication dots can be colored as well as parenthesized;
+the parenthesis's color can also be altered independently.
+
 @c \override is necessary to make fingering visible
 @lilypond[quote, verbatim]
 <<
     \new ChordNames {
       \chordmode {
-        f1 g c
+        f1 g c c
       }
     }
   \new Staff {
@@ -1039,6 +1042,17 @@ capo will be the lowest fret in the fret diagram.
         (place-fret 2 5 3)
       )
     }
+    \override Voice.TextScript.size = 1.5
+    <c g c' e' g'>1^\markup {
+      \fret-diagram-verbose #'(
+        (place-fret 6 3 1 red parenthesized default-paren-color)
+        (place-fret 5 3 1 inverted)
+        (place-fret 4 5 2 blue parenthesized)
+        (place-fret 3 5 3 blue)
+        (place-fret 2 5 4 blue)
+        (place-fret 1 3 1 inverted)
+      )
+    }
   }
 >>
 @end lilypond
index 1189c0b82c982f5c3f8fde771ccc106d5668e0b2..e765d8e5ce5447bd2cb5bc7a1538cbf8b2bdc981 100644 (file)
@@ -1,9 +1,14 @@
-\version "2.17.6"
+\version "2.19.8"
 
 \header {
   texidoc="
 Dots indicating fingerings can be changed in location,
 size, and coloring.
+It is possible to parenthesize a single dot.  The color
+of the paranthesis may be taken from dot or default.
+A possible collision between parathesis and fret-label-
+indication can be resolved by an override for
+@code{fret-label-horizontal-offset} in @code{fret-diagram-details}.
 
 "
 }
@@ -12,6 +17,8 @@ size, and coloring.
 
 <<
   \chords {
+    c1 |
+    c1 |
     c1 |
     c1 |
     c1 |
@@ -65,7 +72,34 @@ size, and coloring.
                                      (place-fret 1 3 1)
                                      (barre 5 1 3))}
 
- }
->>
+     %% C major for guitar,  verbose style
+    \once \override TextScript.size = #1.4
+    c'1 ^\markup {
+            \fret-diagram-verbose #'((mute 6)
+                                     (place-fret 5 3 1 blue)
+                                     (place-fret 4 5 2 red parenthesized)
+                                     (place-fret 3 5 3)
+                                     (place-fret 2 5 4 red)
+                                     (place-fret 1 3 1 blue parenthesized)
+                                     (barre 5 1 3))}
 
+     %% C major for guitar,  verbose style
+     %% larger size and dot-radius
+     %% different dot-colors
+     %% parenthesizing single dots, with different paren-color
+     %% horizontal moving fret-label-indication
+    \once \override TextScript.size = #1.5
+    \once \override TextScript.fret-diagram-details.dot-radius = #0.4
+    \once \override TextScript.fret-diagram-details.fret-label-horizontal-offset = #0.2
+    c'1 ^\markup {
+            \fret-diagram-verbose
+              #'((mute 6)
+                 (place-fret 5 3 1 blue)
+                 (place-fret 4 5 2 red parenthesized default-paren-color)
+                 (place-fret 3 5 3)
+                 (place-fret 2 5 4 red)
+                 (place-fret 1 3 1 blue parenthesized)
+                 (barre 5 1 3))}
 
+ }
+>>
index 786d34110c6aa999ccffc21fd5b1fbe52ff3a24b..81575a50c800989dddb5cfd0899854c5f7423a39 100644 (file)
@@ -1,4 +1,4 @@
-\version "2.17.6"
+\version "2.19.8"
 
 \header {
   texidoc="
@@ -19,6 +19,7 @@ and fingering label font size can be adjusted.
     c1 |
     c1 |
     c1 |
+    c1 |
     c1
   }
 
@@ -78,7 +79,8 @@ and fingering label font size can be adjusted.
                                      (place-fret 2 5 4)
                                      (place-fret 1 3 1)
                                      (barre 5 1 3))}
-    %% dot color inversion, white on black
+     %% C major for guitar, verbose style
+     %% dot color inversion, white on black
     \once \override TextScript.fret-diagram-details.dot-color = #'black
     c' ^\markup {
             \fret-diagram-verbose #'((mute 6)
@@ -88,7 +90,8 @@ and fingering label font size can be adjusted.
                                      (place-fret 2 5 4)
                                      (place-fret 1 3 1)
                                      (barre 5 1 3))}
-    %% dot color inversion, black on white
+     %% C major for guitar, verbose style
+     %% dot color inversion, black on white
     \once \override TextScript.fret-diagram-details.dot-color = #'white
     c' ^\markup {
             \fret-diagram-verbose #'((mute 6)
@@ -98,7 +101,17 @@ and fingering label font size can be adjusted.
                                      (place-fret 2 5 4)
                                      (place-fret 1 3 1)
                                      (barre 5 1 3))}
+     %% C major for guitar, verbose style
+     %% dot color inversion, global setting and per-dot
+    \once \override TextScript.fret-diagram-details.dot-color = #'grey
+    \once \override TextScript.size = #1.4
+    c' ^\markup {
+            \fret-diagram-verbose #'((mute 6)
+                                     (place-fret 5 3 1 inverted)
+                                     (place-fret 4 5 2 red)
+                                     (place-fret 3 5 3 inverted)
+                                     (place-fret 2 5 4 red inverted)
+                                     (place-fret 1 3 1)
+                                     (barre 5 1 3))}
  }
 >>
-
-
index 6ae0e392b15353af9a9aa235502bd8430d11e33c..495562dc281ab9b19779ed50c9fd05d60cd22c75 100644 (file)
@@ -1,4 +1,4 @@
-\version "2.17.6"
+\version "2.19.8"
 
 \header {
   texidoc="
@@ -32,8 +32,8 @@ size, and number type.
                                      (barre 5 1 3))}
 
      %% C major for guitar, verbose style
-    \override TextScript.fret-diagram-details.label-dir = #LEFT 
-    \override TextScript.fret-diagram-details.number-type = #'roman-upper 
+    \override TextScript.fret-diagram-details.label-dir = #LEFT
+    \override TextScript.fret-diagram-details.number-type = #'roman-upper
     c' ^\markup {
             \fret-diagram-verbose #'((mute 6)
                                      (place-fret 5 3 1)
@@ -45,8 +45,8 @@ size, and number type.
 
      %% C major for guitar, verbose style
     \revert TextScript.fret-diagram-details.label-dir
-    \override TextScript.fret-diagram-details.fret-label-font-mag = #0.4 
-    \override TextScript.fret-diagram-details.number-type = #'arabic 
+    \override TextScript.fret-diagram-details.fret-label-font-mag = #0.4
+    \override TextScript.fret-diagram-details.number-type = #'arabic
     \once \override TextScript.fret-diagram-details.fret-label-vertical-offset = #0.25
     c' ^\markup {
             \fret-diagram-verbose #'((mute 6)
@@ -60,6 +60,7 @@ size, and number type.
      %% C major for guitar, verbose style
     \revert TextScript.fret-diagram-details.label-dir
     \once \override TextScript.fret-diagram-details.number-type = #'custom
+    \once \override TextScript.fret-diagram-details.fret-label-horizontal-offset = #0.5
     \once \override TextScript.fret-diagram-details.fret-label-custom-format = #"~d°"
     c' ^\markup {
             \fret-diagram-verbose #'((mute 6)
@@ -72,5 +73,3 @@ size, and number type.
 
  }
 >>
-
-
index 6f080aeb2d5626c7fc3058a8463831055e728ff1..24e8e3298abeb0d93607832d0d1422b757e83c8d 100644 (file)
@@ -371,6 +371,13 @@ label the lowest fret number.  Default@tie{}0.5.
 the center of the fret in direction parallel to strings.
 Default@tie{}0.
 @item
+@code{fret-label-horizontal-offset} -- The offset of the fret label from
+the center of the fret in direction orthogonal to strings.
+Default@tie{}0.
+@item
+@code{paren-padding} -- The padding for the parenthesis.
+Default@tie{}0.05.
+@item
 @code{label-dir} -- Side to which the fret label is attached.
 @w{@code{-1}}, @code{LEFT}, or @code{DOWN} for left or down; @code{1},
 @code{RIGHT}, or @code{UP} for right or up.  Default @code{RIGHT}.
index 69a8ba7821be29483093e9bec85edb8d2ef95fab..e60c0dca359cf782697afa6ca5ffc1524a255e4e 100644 (file)
@@ -64,6 +64,41 @@ to end-point."
   "Calculate the fret count for the diagram given the range of frets in the diagram."
   (1+ (- (cdr fret-range) (car fret-range))))
 
+(define (dot-has-color dot-settings)
+  "Return a color-name as symbol, if found in @var{dot-settings} otherwise @code{#f}"
+  (cond ((null? dot-settings)
+         #f)
+        ;; Don't bother the user with quote/unquote.
+        ;; We use the name-symbol for the color, looking up in 'x11-color-list'
+        ((member (car dot-settings) (map car x11-color-list))
+         (car dot-settings))
+        (else (dot-has-color (cdr dot-settings)))))
+
+(define (dot-is-inverted dot-settings)
+  "Return @code{'inverted}, if found in @var{dot-settings} otherwise @code{'()}"
+  (let ((inverted (member 'inverted dot-settings)))
+    (if inverted
+        (car inverted)
+        '())))
+
+(define (dot-is-parenthesized dot-settings)
+  "Return @code{'parenthesized}, if found in @var{dot-settings} otherwise @code{'()}"
+  (let ((parenthesized (member 'parenthesized dot-settings)))
+    (if parenthesized
+        (car parenthesized)
+        '())))
+
+;; If @code{'default-paren-color} is not set, the parenthesis will take their
+;; color from the dot.
+;; Setting @code{'default-paren-color} will result in taking the color from
+;; `what-color', see below.
+(define (default-paren-color dot-settings)
+  "Return @code{'default-paren-color}, if found in @var{dot-settings} otherwise @code{'()}"
+  (let ((default-color (member 'default-paren-color dot-settings)))
+    (if default-color
+        (car default-color)
+        '())))
+
 (define (subtract-base-fret base-fret dot-list)
   "Subtract @var{base-fret} from every fret in @var{dot-list}"
   (if (null? dot-list)
@@ -71,18 +106,26 @@ to end-point."
       (let ((this-list (car dot-list)))
         (cons* (list
                 ;; string
-                (car this-list)
+                  (car this-list)
                 ;; fret
-                (- (second this-list) base-fret)
+                  (- (second this-list) base-fret)
                 ;; finger
-                (if (null? (cddr this-list))
-                    '()
-                    (third this-list))
-                ;; color modifier
-                (if (or (null? (cddr this-list))
-                        (null? (cdddr this-list)))
-                    '()
-                    (fourth this-list)))
+                  (if (or (null? (cddr this-list))
+                        (not (number? (caddr this-list))))
+                      '()
+                      (third this-list))
+                ;; inverted
+                  (dot-is-inverted this-list)
+                ;; parenthesis
+                  (dot-is-parenthesized this-list)
+                ;; color modifiers
+                  ;; parenthesis
+                  (default-paren-color this-list)
+                  ;; dots
+                  (let ((colored (dot-has-color this-list)))
+                    (if colored
+                        colored
+                        '())))
                (subtract-base-fret base-fret (cdr dot-list))))))
 
 (define (drop-paren item-list)
@@ -271,6 +314,7 @@ with magnification @var{mag} of the string @var{text}."
          ;; needed for draw-frets and draw-strings
          (sth (* size th))
          (thickness-factor (assoc-get 'string-thickness-factor details 0))
+         (paren-padding (assoc-get 'paren-padding details 0.05))
          (alignment
           (chain-assoc-get 'align-dir props -0.4)) ;; needed only here
          (xo-padding (assoc-get 'xo-padding details 0.2)) ;; needed only here
@@ -370,7 +414,7 @@ Line thickness is given by @var{th}, fret & string spacing by
              (string-stencil (car x))
              (helper (cdr x)))))
 
-      (let* ( (string-list (map 1+ (iota string-count))))
+      (let* ((string-list (map 1+ (iota string-count))))
         (helper string-list)))
 
     (define (string-stencil string)
@@ -528,7 +572,7 @@ fret-diagram overall parameters."
 
       (let* ( (scale-dot-radius (* size dot-radius))
               (scale-dot-thick (* size th))
-              (default-dot-color (assoc-get 'dot-color details 'black))
+              (default-dot-color (assoc-get 'dot-color details))
               (finger-label-padding 0.3)
               (dot-label-font-mag
                (* scale-dot-radius
@@ -552,24 +596,73 @@ fret-diagram overall parameters."
               (extent (cons (- scale-dot-radius) scale-dot-radius))
               (finger (caddr mypair))
               (finger (if (number? finger) (number->string finger) finger))
-              (inverted-color (eq? 'inverted (cadddr mypair)))
-              (dot-color (if (or (and (eq? default-dot-color 'black) inverted-color)
-                                 (and (eq? default-dot-color 'white) (not inverted-color)))
-                             'white
-                             'black))
-              (dot-stencil (if (eq? dot-color 'white)
-                               (ly:stencil-add
-                                (make-circle-stencil
-                                 scale-dot-radius scale-dot-thick #t)
-                                (ly:stencil-in-color
-                                 (make-circle-stencil
-                                  (- scale-dot-radius (* 0.5 scale-dot-thick))
-                                  0  #t)
-                                 1 1 1))
-                               (make-circle-stencil
-                                scale-dot-radius scale-dot-thick #t)))
+              (parenthesized
+                (if (not (null? (dot-is-parenthesized mypair)))
+                    (dot-is-parenthesized mypair)
+                    #f))
+              (parenthesis-color
+                (if (not (null? (default-paren-color mypair)))
+                    (default-paren-color mypair)
+                    #f))
+              (inverted
+                (if (not (null? (dot-is-inverted mypair)))
+                    (dot-is-inverted mypair)
+                    #f))
+              (dot-color-is-white?
+                (or inverted
+                    (and (eq? default-dot-color 'white) (not inverted))))
+              (what-color
+                (x11-color
+                  (cond ((and inverted
+                              (not (dot-has-color mypair))
+                              (not (eq? default-dot-color 'white)))
+                          (or default-dot-color 'black))
+                        (dot-color-is-white?
+                          (or (dot-has-color mypair) 'black))
+                        (else
+                          (or (dot-has-color mypair)
+                              default-dot-color
+                              'black)))))
+              (inverted-stil
+                (lambda (color)
+                  (ly:stencil-add
+                    (stencil-with-color
+                      (make-circle-stencil
+                        scale-dot-radius scale-dot-thick #t)
+                      color)
+                    (stencil-with-color
+                      (make-circle-stencil
+                        (- scale-dot-radius (* 0.5 scale-dot-thick))
+                        0  #t)
+                      (x11-color 'white)))))
+              (dot-stencil
+                (if dot-color-is-white?
+                    (inverted-stil what-color)
+                    (stencil-with-color
+                      (make-circle-stencil
+                         scale-dot-radius scale-dot-thick #t)
+                      what-color)))
+              (par-dot-stencil
+                (let ((paren-color
+                        (if (and parenthesis-color
+                                 (not (eq? default-dot-color 'white)))
+                            (x11-color (or default-dot-color 'black))
+                            what-color)))
+                 (stencil-with-color
+                   (parenthesize-stencil
+                     dot-stencil      ;; stencil
+                     (* size th 0.75) ;; half-thickness
+                     (* 0.15 size)    ;;width
+                     0                ;; angularity
+                     paren-padding    ;; padding
+                     )
+                   paren-color)))
+              (final-dot-stencil
+                  (if parenthesized
+                      par-dot-stencil
+                      dot-stencil))
               (positioned-dot
-               (ly:stencil-translate dot-stencil dot-coordinates))
+               (ly:stencil-translate final-dot-stencil dot-coordinates))
               (labeled-dot-stencil
                (cond
                 ((or (eq? finger '())(eq? finger-code 'none))
@@ -581,10 +674,12 @@ fret-diagram overall parameters."
                           layout props dot-label-font-mag finger))))
                    (ly:stencil-translate
                     (ly:stencil-add
-                     dot-stencil
-                     (if (eq? dot-color 'white)
-                         finger-label
-                         (ly:stencil-in-color finger-label 1 1 1)))
+                     final-dot-stencil
+                     (if dot-color-is-white?
+                         (stencil-with-color
+                            finger-label
+                            what-color)
+                         (stencil-with-color finger-label white)))
                     dot-coordinates)))
                 ((eq? finger-code 'below-string)
                  (let* ((label-stencil
@@ -701,6 +796,8 @@ at @var{fret}."
              (label-dir (assoc-get 'label-dir details RIGHT))
              (label-vertical-offset
               (assoc-get 'fret-label-vertical-offset details 0))
+             (label-horizontal-offset
+              (assoc-get 'fret-label-horizontal-offset details 0))
              (number-type
               (assoc-get 'number-type details 'roman-lower))
              (label-text
@@ -726,7 +823,10 @@ at @var{fret}."
                label-stencil
                'string
                orientation))
-             (label-outside-diagram (+ label-space label-half-width)))
+             (label-outside-diagram
+               (+ label-space
+                  (* size label-horizontal-offset)
+                  label-half-width)))
         (ly:stencil-translate
          label-stencil
          (stencil-coordinates
@@ -972,15 +1072,30 @@ to string @var{end-string} at fret @var{fret-number}.
 Place a capo indicator (a large solid bar) across the entire fretboard
 at fret location @var{fret-number}.  Also, set fret @var{fret-number}
 to be the lowest fret on the fret diagram.
-
-@item (place-fret @var{string-number} @var{fret-number} [@var{finger-value} [@var{color-modifier}]])
+@item
+(place-fret @var{string-number}
+            @var{fret-number}
+            [@var{finger-value}]
+            [@var{color-modifier}]
+            [@var{color}]
+            [@code{'parenthesized} [@code{'default-paren-color}]])
 Place a fret playing indication on string @var{string-number} at fret
 @var{fret-number} with an optional fingering label @var{finger-value},
-and an optional color modifier @var{color-modifier}.
+an optional color modifier @var{color-modifier}, an optional color
+@var{color}, an optional parenthesis @code{'parenthesized} and an
+optional paranthesis color @code{'default-paren-color}.
 By default, the fret playing indicator is a solid dot.  This can be
-globally changed by setting the value of the variable @var{dot-color}.
+globally changed by setting the value of the variable @var{dot-color}
+or for a single dot by setting the value of @var{color}.  The dot can
+be parenthesized by adding @code{'parenthesized}.  By default the
+color for the parenthesis is taken from the dot.  Adding
+@code{'default-paren-color} will take the parenthesis-color from the
+global @var{dot-color}, as a fall-back black will be used.
 Setting @var{color-modifier} to @code{inverted} inverts the dot color
 for a specific fingering.
+The values for @var{string-number}, @var{fret-number}, and the optional
+@var{finger} should be entered first in that order.
+The order of the other optional arguments does not matter.
 If the @var{finger} part of the @code{place-fret} element is present,
 @var{finger-value} will be displayed according to the setting of the
 variable @var{finger-code}.  There is no limit to the number of fret