On Wed, Jun 26, 2013 at 6:41 PM, Thomas Morley <[email protected]>wrote:

> 2013/6/27 Rachael Thomas Carlson <[email protected]>:
> > On 06/26/2013 05:08 PM, Thomas Morley wrote:
> >>
> >> \version "2.16.2"
> >>
> >> \new TabStaff {
> >>         \tabFullNotation
> >>         \set doubleSlurs = ##t
> >>         <c' e>8\2\4( <b d>\2\4)
> >> }
> >
> > Hello Harm:
> >
> > Thank you for the quick reply.
> >
> > I think that I could possibly make this work.  Would I manipulate the
> > padding of the slur to get them closer to the notes?  Also, how would you
> > flip the bottom one 180 degrees?
> >
> > This example shoes a little bit more of what I am doing:
> >
> >
> > \version "2.16.2"
> >
> > \new TabStaff {
> >     \tabFullNotation
> >     \stemDown
> >     \set doubleSlurs = ##t
> >     \set Staff.stringTunings = \stringTuning <c, g, d g b c'>
> >     \override LaissezVibrerTie #'extra-offset = #'(-2.0 . 0.0)
> >     <c'^\laissezVibrer e^\laissezVibrer c^\laissezVibrer
> > f,^\laissezVibrer>8\2\4\5\6( <b d>\2\4)
> > }
> >
> > The LaissezVibrer on the left of the notes indicate "hammer on from
> nowhere"
> > otherwise known as tapping.  The <c' e> are with the left hand and the <c
> > f,> are with the right hand.  In the last couple weeks I have figured out
> > quite a bit of hacks to get the tabulature output to be adequate for
> > fingerstyle guitar needs.  But this slur issue is giving me some issues.
> >
> > In the above example the slur that is appearing on the stems of the each
> > eighth notes should be appearing on the fourth string, optimally in the
> 'e'
> > and the 'd' in the space above.
> >
> > Thank you,
> > Rachael
>
> Hi Rachael,
>
> per default, LilyPond prints _one_slur between legato-chords. This is
> common praxis in nearly all printed editions.
> LilyPond provides the possibility to tweak the slurs via their
> 'control-points. Best use \shape for that purpose.
>
> Sometimes double slurs are wished (mostly between thirds), possible
> via \set doubleSlurs = ##t
> Though, you can't affect a single slur of this pair with any
> implemented method, afaik.
> (\shape will affect both with the same values)
>
> Below you'll find my (very hackish) workaround to do so. ;)
>
> Additionally, I changed your code to use repeatTie (and not
> extra-offsetting LaissezVibrerTie). There's no need to write it at
> every note of the chord, if _all_ note should have it. After the chord
> is enough. Perhaps you'll find it sufficient, too.
>
>
> \version "2.16.2"
>
> shapeDoubleSlur =
> #(define-music-function (parser location offsets)(list?)
>   (_i "Offset control-points of @code{Slur} by @var{offsets}.
>   @code{Slur} is supposed to be invoked by @samp{\\once\\set doubleSlurs =
> ##t}
>   The argument is a list of number pairs or list of such lists.  Each
> element
>   of a pair represents an offset to one of the coordinates of a
> control-point.")
>
>    (define (read-out l1 l2)
>      (define (helper ls1 ls2 ls3)
>      "Filters all elements of ls1 from ls2 by their grob-name
>       and appends it to ls3"
>       (let ((grob-name-proc
>               (lambda (x) (assq-ref (ly:grob-property x 'meta) 'name))))
>        (if (null? ls1)
>            ls3
>            (helper
>              (cdr ls1)
>              ls2
>              (append ls3
>                      (filter (lambda (x) (eq? (car ls1) (grob-name-proc
> x)))
>                              ls2))))))
>     (helper l1 l2 '()))
>
>    ;; Thanks to David Nalesnik for his great shape-functions!!
>    (define ((shape-curve offsets) grob)
>      (let* ((orig (ly:grob-original grob))
>             (siblings (if (ly:spanner? grob)
>                           (ly:spanner-broken-into orig) '()))
>             (total-found (length siblings))
>             (function (assoc-get 'control-points
>                                  (reverse (ly:grob-basic-properties
> grob))))
>             (coords (function grob)))
>
>        (define (offset-control-points offsets)
>          (if (null? offsets)
>              coords
>              (map
>                (lambda (x y) (coord-translate x y))
>                coords offsets)))
>
>        (define (helper sibs offs)
>          (if (pair? offs)
>              (if (eq? (car sibs) grob)
>                  (offset-control-points (car offs))
>                  (helper (cdr sibs) (cdr offs)))
>              coords))
>
>        ;; we work with lists of lists
>        (if (or (null? offsets)
>                (not (list? (car offsets))))
>            (set! offsets (list offsets)))
>
>        (if (>= total-found 2)
>            (helper siblings offsets)
>            (offset-control-points (car offsets)))))
>
> #{
>   \once\override Slur #'after-line-breaking =
>     #(lambda (grob)
>       (let* ((sys (ly:grob-system grob))
>              (elements-lst
>                (ly:grob-array->list (ly:grob-object sys 'all-elements)))
>              (grob-name
>                (lambda (x) (assq-ref (ly:grob-property x 'meta) 'name)))
>              (X-coord (lambda (x) (ly:grob-relative-coordinate x sys X)))
>              (Y-coord (lambda (x) (ly:grob-relative-coordinate x sys Y)))
>              (grob-y-extent (lambda (x) (ly:grob-extent x sys Y)))
>              (slurs (read-out (list 'Slur) elements-lst))
>              (slur-X-coord (X-coord grob))
>              (relevant-slurs
>                  (remove
>                    (lambda (slur) (not (= slur-X-coord (X-coord slur))))
>                    slurs)))
>       (for-each
>         (lambda (x y)
>           (ly:grob-set-property!
>             x
>             'control-points
>             (shape-curve y)))
>         relevant-slurs offsets)
>         ))
> #})
>
> \version "2.16.2"
>
> \new TabStaff {
>     \tabFullNotation
>     \stemDown
>     \set Staff.stringTunings = \stringTuning <c, g, d g b c'>
>     \once \set doubleSlurs = ##t
>     \shapeDoubleSlur
>     #'(
>        ((0 . 7) (0 . 8.0) (0 . 7.7) (0 . 6.4)) ;;bottom
>        () ;;top
>       )
>     <c' e c f,>8\2\4\5\6^\repeatTie ( <b d>\2\4)
> }
>
>
> HTH,
>   Harm
>

Hello Harm:

This is wonderful work.  Thank you so much.  One thing, and this certainly
shows my newbiness here, how to I manipulate where the bottom slur is
placed?  I see that we have, within the code, the ability to change the
shape of the slur, but where do I manipulate the y-axis of the bottom slur?
 And for that matter how I manipulate the y-axis of the top slur?  Sorry to
be such a pest.  You are really being helpful.

For instance if I include the code that you have written above, and add
another beat of music, I need to manipulate the y-axis of the bottom slur.

\version "2.16.2"

\new TabStaff {
    \tabFullNotation
    \stemDown
    \set Staff.stringTunings = \stringTuning <c, g, d g b c'>
    \once \set doubleSlurs = ##t
    \shapeDoubleSlur
    #'(
       ((0 . 7) (0 . 8.0) (0 . 7.7) (0 . 6.4)) ;;bottom
       () ;;top
      )
    <c' e c f,>8\2\4\5\6^\repeatTie ( <b d>\2\4)
    \once \set doubleSlurs = ##t
    \shapeDoubleSlur
     #'(
       ((0 . 7) (0 . 8.0) (0 . 7.7) (0 . 6.4)) ;;bottom
       () ;;top
      )
    <d' a>\1\3^\repeatTie ( <c' g>\1\3)
}

Thank you,
Rachael

<<attachment: test.png>>

_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to