lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: TAB with right hand fingering(s) IN CHORDS ?


From: Blöchl Bernhard
Subject: Re: TAB with right hand fingering(s) IN CHORDS ?
Date: Mon, 29 Jan 2018 10:13:39 +0100
User-agent: Roundcube Webmail/0.9.5

Thank you for your help!

As you supposed \new TabVoice can handle this construct. I experimented a bit and found that one can define even one finger for a chord. That is important for Banjo played clawhammer style there single strings are hit and the chords are brushed with the back of the fingernail with I or M depending on the taste of the player. The drone is plucked by P. The warning or error message is not nice, but as long as it compiles correctly ...

\version "2.19.80"
\layout {
  \context {
    \TabVoice
    \override StrokeFinger.digit-names = ##("P" "I" "M" "A" "X")
    %\consists #Test_engraver
    \consists "New_fingering_engraver"
    \consists "Fingering_engraver"
    \consists "Script_column_engraver"
    \consists "Fingering_column_engraver"
  }

}

#(define RH rightHandFinger)

mus = \relative c {
  \set strokeFingerOrientations = #'(left up )
  c-\RH #1 e-\RH #2 g-\RH #3 c-\RH #4
  %\set strokeFingerOrientations = #'(down right up )
    \set strokeFingerOrientations = #'(down )
  < c-\RH #1 e-\RH #2 g-\RH #3 > 4
  < c-\RH #2 e-\RH #2 g-\RH #2 > 4
    < c-\RH #2 e g > 4
}

<<
  \new Voice \mus
  \new TabVoice \mus

Am 29.01.2018 00:58, schrieb Thomas Morley:
Hi,

2018-01-28 19:52 GMT+01:00 Blöchl Bernhard <address@hidden>:
I experimente with this fingering notation:

\version "2.19.80"

\layout {
  \context {
    \TabStaff

This should go into TabVoice not TabStaff, imho

      \override StrokeFinger.digit-names = ##("P" "I" "M" "A" "X")
    \consists New_fingering_engraver
    strokeFingerOrientations = #'(down )
  }
  %{
The finger characters under the chord are written one above the other and therefore unredable. To change this, I think there is some change in the
source by the developers necessary.

Nope.
Some change by the user ;)
If you consist New_fingering_engraver you should also include
Script_column_engraver.
I'd go for Fingering_engraver and Fingering_column_engraver as well.

Tshe finger characters "upper case" are correct you see with this "\set
strokeFingerOrientations = #'(right)" example.
The warnings show, that this case of fingering of of chords "down" is not
considered.
  %}

Not exactly.
Including the engravers building "column" already helps a bit.
Though, you're right in so far as TabStaff is usually regarded as a
notation where already is shown what to _do_.
Thus, fingerings, stroke-finger, string-numbers are superfluous.

That said, I think printing of stroke-fingerings should work if
actually desired.
I didn't figure why lilypond complains about unset side-axis in
TabVoice, though.

But I tried a proof-of-concept-engraver.

Please note the printed message :))

\version "2.19.65"

#(define Test_engraver
  (lambda (ctx)
    (let ((stroke-fingers '())
          (str-fingr-or '()))
    (ly:message
"\n\tTHIS CODE IS A PROOF OF CONCEPT. NOT TESTED. USE AT OWN RISK.\n\n")
    (make-engraver
      ((start-translation-timestep trans)
       (set! stroke-fingers '()))
      (acknowledgers
        ((stroke-finger-interface engraver grob source-engraver)
          (set! stroke-fingers (cons grob stroke-fingers))
          ;; To prevent LilyPond complaining, side-axis is set here
          ;; It may be reset in `stop-translation-timestep'
          (ly:grob-set-property! grob 'side-axis X)))
      ((stop-translation-timestep trans)
       (let* ((str-f-or
(ly:context-property ctx 'strokeFingerOrientations '(right)))
              (cleaned-str-f-or
(if (and (member 'left str-f-or) (member 'right str-f-or))
                    (filter
                      (lambda (e)
                        (not (eq? 'left e)))
                      str-f-or)
                    str-f-or))
              (sorted-str-f-or
                (sort cleaned-str-f-or (lambda (p q) (symbol<? p q))))
              (rev-str-f (reverse stroke-fingers))
              (alist
                ;; what a clumsy coding :((
                (cond ((null? rev-str-f)
                       '())

                      ((= (length sorted-str-f-or) 1)
                       (list (cons (car sorted-str-f-or) rev-str-f)))

                      ((equal? sorted-str-f-or '(down up))
                       (list
                         (cons
                           (car sorted-str-f-or)
                           (list-head rev-str-f
(round (/ (length rev-str-f) 2))))
                         (cons
                           (cadr sorted-str-f-or)
                           (list-tail rev-str-f
(round (/ (length rev-str-f) 2))))))

                      ((or (equal? sorted-str-f-or '(down left))
                           (equal? sorted-str-f-or '(down right)))
                       (list
                         (cons
                           (car sorted-str-f-or)
                           (car rev-str-f))
                         (cons
                           (cadr sorted-str-f-or)
                           (cdr rev-str-f))))

                      ((or (equal? sorted-str-f-or '(left up))
                           (equal? sorted-str-f-or '(right up)))
                       (list
                         (cons
                           (car (last-pair sorted-str-f-or))
                           (car (last-pair rev-str-f)))
                         (cons
                           (car sorted-str-f-or)
                           (cdr (reverse rev-str-f)))))

                      ((or (equal? sorted-str-f-or '(down left up))
                           (equal? sorted-str-f-or '(down right up)))
                       (cond ((= 1 (length rev-str-f))
                              (list (cons 'up rev-str-f)))
                             ((= 2 (length rev-str-f))
                              (list
                                (cons 'down (car rev-str-f))
                                (cons 'up (cadr rev-str-f))))
                             (else '()
                              (list
                                (cons 'down (car rev-str-f))
                                (cons
                                  (cadr sorted-str-f-or)
                                  (cdr (reverse (cdr rev-str-f))))
(cons 'up (car (last-pair rev-str-f)))))))
                      (else '()))))
       (if (pair? alist)
           (for-each
             (lambda (x)
(let ((cdr-x (if (list? (cdr x)) (cdr x) (list (cdr x)))))
                 (if (member (car x) '(left right))
                     (for-each
                       (lambda (g)
                         (ly:grob-set-property! g 'side-axis X)
                         (ly:grob-set-property! g 'X-offset
                           ly:side-position-interface::x-aligned-side))
                       cdr-x)
                     (for-each
                       (lambda (g)
                         (ly:grob-set-property! g 'side-axis Y)
                         (ly:grob-set-property! g 'Y-offset
                           ly:side-position-interface::y-aligned-side))
                       cdr-x))))
             alist))))))))

%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%

\layout {
  \context {
    \TabVoice
    \override StrokeFinger.digit-names = ##("P" "I" "M" "A" "X")
    \consists #Test_engraver
    \consists "New_fingering_engraver"
    \consists "Fingering_engraver"
    \consists "Script_column_engraver"
    \consists "Fingering_column_engraver"
  }

}

#(define RH rightHandFinger)

mus = \relative c {
  \set strokeFingerOrientations = #'(left up )
  c-\RH #1 e-\RH #2 g-\RH #3 c-\RH #4
  \set strokeFingerOrientations = #'(down right up )
  < c-\RH #1 e-\RH #2 g-\RH #3 > 4
}

<<
  \new Voice \mus
  \new TabVoice \mus




Cheers,
  Harm

_______________________________________________
lilypond-user mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/lilypond-user



reply via email to

[Prev in Thread] Current Thread [Next in Thread]