Autor Thema: Triolenklammer wie Legatobogen aussehen lassen  (Gelesen 2678 mal)

Castor

  • Member
Triolenklammer wie Legatobogen aussehen lassen
« am: Dienstag, 4. Februar 2014, 20:49 »
Hi (:

wie kann ich die TupletBracket so aussehen lassen wie einen Legatobogen, über dem die 3 (halt bei Triolen) bzw. andere Zahl (bei anderen X-tolen) steht? Ich schreibe nur ein Stück nochmal in guter Qualität auf (wozu Lily ja bestens geeignet ist ;)) und möchte das gerne aus dem Original so übernehmen, auch wenn es vllt unüblich ist.

vllt irgendwas mit

\override TupletBracket #'style = ...        oder        #'stencil = ... ?

ich kenn mich noch nicht gut genug mit Lily aus, um mir da selber was aus den gebräuchlichen Befehlen herzuleiten.

Vielen Dank schonmal an die fleißigen Helfer hier! :)

lg Castor (:
« Letzte Änderung: Donnerstag, 6. Februar 2014, 16:43 von Castor »

harm6

  • Member
Re: Triolenklammer wie Legatobogen aussehen lassen
« Antwort #1 am: Mittwoch, 5. Februar 2014, 21:29 »
Hallo,

leider gibt es keine gebräuchlichen Befehle, um das zu bewerkstelligen.
Man muß also selber ran.
Glücklicherweise gibt es schon gute Ansätze dazu, die ich aufgegriffen und verfeinert habe, Dank an Mike Solomon und David Nalesnik.
http://lilypond.1069038.n5.nabble.com/Slur-as-TupletBracket-td32906.html
Ein Blick in die Archive lohnt immer. Ich habe einfach nach
TupletBracket Slur
gesucht.
(Natürlich wußte ich das etwas zu finden war, hatte mich ja damals auch beteiligt. ;) )

Aber hier der Code, mit zahlreichen Kommentaren:

\version "2.18.0"

printTupletBow = {
  %% Use slur-stencil
  \override TupletBracket #'stencil = #ly:slur::print
 
  %% Use 'thickness from Slur
  \override TupletBracket #'thickness = #1.2
 
  %% Set 'layer to ensure without for TuoletNumber
  \override TupletBracket #'layer = #1
  \override TupletNumber #'layer = #2
 
  %% 'control-points need to be set
  \override TupletBracket #'control-points =
    #(lambda (grob)
      (let* ((x-pos (ly:grob-property grob 'X-positions))
             (pos (ly:grob-property grob 'positions))
             (x-ln (interval-length x-pos))
             (dir (ly:grob-property grob 'direction))
             ;; read out the height of the TupletBracket, maybe negativ!
             (height (- (cdr pos) (car pos)))
             ;; height-corr is introduced because sometimes the shape of the
             ;; slur needs to be adjusted.
             ;; It is used in 2nd/3rd controllpoint.
             ;; The value of 0.3 is found by try and error
             (height-corr (* 0.3 dir height))
             (edge-height (ly:grob-property grob 'edge-height '(0.7 . 0.7))))
           
        (list
          ;; first cp
          (cons
            (car x-pos)
            (+ (car pos) (* -1 dir (car edge-height))))
          ;; second cp
          (cons
            (+ (car x-pos) (* x-ln 1/4))
            (+ (car pos) (* dir (+ 0.5 height-corr))))
          ;; third cp
          (cons
            (+ (car x-pos) (* x-ln 3/4))
            (+ (cdr pos) (* dir (- 0.5 height-corr))))
          ;; fourth cp
          (cons
            (cdr x-pos)
            (+ (cdr pos) (* -1 dir (cdr edge-height)))))))
           
  %% Give TupletNumber nicer padding
  \override TupletNumber #'stencil =
    #(lambda (grob)
       (let* ((stil (ly:tuplet-number::print grob))
              (x-ext (ly:stencil-extent stil X))
              ;; little more padding at left of the number
              (new-x-ext (cons (- (car x-ext) 0.1) (cdr x-ext)))
              (y-ext (ly:stencil-extent stil Y))
              ;; give TupletNumber a little more padding around
              (new-stil (ly:make-stencil
                          (ly:stencil-expr stil)
                          (interval-widen new-x-ext 0.1)
                          (interval-widen y-ext 0.1))))
       
       (stencil-whiteout new-stil)))

    %% Adjust TupletNumber in Y-direction
    \override TupletNumber #'Y-offset =
      #(lambda (grob)
         (let* ((dir (ly:grob-property grob 'direction))
                (y-off (ly:tuplet-number::calc-y-offset grob)))
         ;; The value of 0.2 is found by try and error       
         (+ (* dir 0.2) y-off)))
}

\layout {
  \printTupletBow
}


\relative c'' {
  \voiceOne
 
  \times 2/3 { a4 b c }
  \times 2/3 { a4 b c' }
  \times 2/3 { a,4 b c, }
  \times 2/3 { a'4 b, c }
 
  \voiceTwo
 
  \times 2/3 { a'4 b c }
  \times 2/3 { a4 b c' }
  \times 2/3 { a,4 b c, }
  \times 2/3 { a'4 b, c }
}

HTH,
  Harm

P.S. Bild im Anhang

trulli

  • Member
Re: Triolenklammer wie Legatobogen aussehen lassen
« Antwort #2 am: Mittwoch, 5. Februar 2014, 23:44 »
Klasse Harm,

wo du das immer ausgräbst...  :)

In meinen Notenausgaben habe ich manchmal solche Klammern, wie auf dem Bild. Es ist bis auf einen Wert derselbe Code von Harm.
\version "2.18.0"

printTupletBow = {
  %% Use slur-stencil
  \override TupletBracket #'stencil = #ly:slur::print
 
  %% Use 'thickness from Slur
  \override TupletBracket #'thickness = #1.2
 
  %% Set 'layer to ensure without for TuoletNumber
  \override TupletBracket #'layer = #1
  \override TupletNumber #'layer = #2
 
  %% 'control-points need to be set
  \override TupletBracket #'control-points =
    #(lambda (grob)
      (let* ((x-pos (ly:grob-property grob 'X-positions))
             (pos (ly:grob-property grob 'positions))
             (x-ln (interval-length x-pos))
             (dir (ly:grob-property grob 'direction))
             ;; read out the height of the TupletBracket, maybe negativ!
             (height (- (cdr pos) (car pos)))
             ;; height-corr is introduced because sometimes the shape of the
             ;; slur needs to be adjusted.
             ;; It is used in 2nd/3rd controllpoint.
             ;; The value of 0.3 is found by try and error
             (height-corr (* 0.3 dir height))
             (edge-height (ly:grob-property grob 'edge-height '(0.7 . 0.7))))
           
        (list
          ;; first cp
          (cons
            (car x-pos)
            (+ (car pos) (* -1 dir (car edge-height))))
          ;; second cp
          (cons
            (+ (car x-pos) (* x-ln 1/4))
            (+ (car pos) (* dir (+ 0.5 height-corr))))
          ;; third cp
          (cons
            (+ (car x-pos) (* x-ln 3/4))
            (+ (cdr pos) (* dir (- 0.5 height-corr))))
          ;; fourth cp
          (cons
            (cdr x-pos)
            (+ (cdr pos) (* -1 dir (cdr edge-height)))))))
           
  %% Give TupletNumber nicer padding
  \override TupletNumber #'stencil =
    #(lambda (grob)
       (let* ((stil (ly:tuplet-number::print grob))
              (x-ext (ly:stencil-extent stil X))
              ;; little more padding at left of the number
              (new-x-ext (cons (- (car x-ext) 0.1) (cdr x-ext)))
              (y-ext (ly:stencil-extent stil Y))
              ;; give TupletNumber a little more padding around
              (new-stil (ly:make-stencil
                          (ly:stencil-expr stil)
                          (interval-widen new-x-ext 0.1)
                          (interval-widen y-ext 0.1))))
       
       (stencil-whiteout new-stil)))

    %% Adjust TupletNumber in Y-direction
    \override TupletNumber #'Y-offset =
      #(lambda (grob)
         (let* ((dir (ly:grob-property grob 'direction))
                (y-off (ly:tuplet-number::calc-y-offset grob)))
         ;; The value of 0.2 is found by try and error       
         (+ (* dir 1.2) y-off)))
}

\layout {
  \printTupletBow
}


\relative c'' {
  \voiceOne
 
  \times 2/3 { a4 b c }
 
}

Grüße von Trulli

Castor

  • Member
Re: Triolenklammer wie Legatobogen aussehen lassen
« Antwort #3 am: Donnerstag, 6. Februar 2014, 16:43 »
Oh .. das sind ja .. lange Codes :)

Vielen Dank, find ich super, ich frag mich was für ein Lily-genie man sein muss, um so was zu bauen o.O

Danke dir, trulli, dein Code bietet mir noch eine andere Variante mit der 3 außerhalb des Bogens.

Ich bin erstaunt!

lg Castor