Cluster Linie

Begonnen von kilgore, Mittwoch, 15. Juli 2020, 11:54

« vorheriges - nächstes »

kilgore

Liebe Lilys,

Lange nichts gepostet! Nun habe ich doch eine Notation die ich erzeugen möchte und meine Lösung ist nur doof.

Gewollt ist eine vertikale Linie rechts neben einen Akkord. Die Linie soll den Umfang des Akkordes umfassen (also, egal ob Terz, Quinte, Oktave). Dots, Slurs, Ties etc. mögen Abstand halten.

Meine Lösung bisher sieht so aus:


\version "2.20.0"

splitWhite = {
  %\once \override Dots.X-offset = #1
  \once \override NoteHead.stencil = #ly:text-interface::print
  \override NoteHead.text =
  \markup {
    \combine
    \translate #'( 1.7 . 0.5 )
    \override #'(thickness . 2 )
    \draw-line #'( 0 . -.9 )
    \musicglyph #"noteheads.s1"
  }
  \once \override Stem.extra-offset = #'( -.4 . -0.1 )

}



\relative c' {
r4 \splitWhite <ges' bes>2.~
<ges bes>1
}


Das funktioniert ganz OK, muss aber dann von fall zu Fall angepasst werden. Der obere Bindebogen macht Platz für den verschobenen Hals, obwohl ich den Hals eigentlich zurück nach links schieben müsste. Naja, meine Lösung ist halt nicht elegant.

Gibt es einen Weg diese Linie hinzubekommen ohne so viel Anpassung? Egal welche Akkord oder Notenwert? Habt ihr eine Idee?

Vielen Dank!

Herzliche Grüße,
kilgore

harm6

Hallo kilgore :)

Du könntest das Arpeggio mißbrauchen:


rightClusterIndicator = {
  %% get bracket-style Arpeggio
  \arpeggioBracket
  %% reduce bracket-angles to zero
  \once \override Arpeggio.protrusion = 0
  \once\override Arpeggio.thickness = 2
  %% move Arpeggio to the right
  \once\override Arpeggio.direction = 1
  %% shorten Arpeggio a bit
  \once\override Arpeggio.positions =
    #(lambda (grob)
      (interval-widen (ly:arpeggio::calc-positions grob) -0.25))
  %% Move DotColumn (if present) to make room for the moved Arpeggio
  %% The amount is taken from Arpegio.padding
  \once\override NoteColumn.after-line-breaking =
  #(lambda (grob)
    (let ((dc (ly:note-column-dot-column grob)))
      (if (ly:grob? dc)
          (let* ((conditional-elements
                   (ly:grob-object grob 'conditional-elements))
                 (cond-elts-list
                   (if (ly:grob-array? conditional-elements)
                       (ly:grob-array->list conditional-elements)
                       '()))
                 (arpeggio-ls
                   (filter
                     (lambda (g) (grob::has-interface g 'arpeggio-interface))
                     cond-elts-list))
                 (arpeggio-padding
                   (if (pair? arpeggio-ls)
                       (ly:grob-property (car arpeggio-ls) 'padding)
                       0)))
            (ly:grob-translate-axis! dc arpeggio-padding X)))))
  <>\arpeggio
}

                       
\relative c' {       
r4
\override Arpeggio.color = #red
\rightClusterIndicator
<ges' aes>2.~
<ges bes>1
}


Der thickness-override funktioniert allerdings erst ab 2.21, zuvor ist die thickness hard-coded.

Gruß,
  Harm

kilgore

Hey Harm!

Danke, wie immer, für deine tolle Lösung! Ich hab tatsächlich damit angefangen mit Arpeggio zu arbeiten, kam aber nicht sehr weit. So sieht es richtig klasse aus!  :D

Vielleicht probiere ich mal 2.21 aus...

Herzliche Grüße,
Nathan