fakultative Noten zentriert übereinander? wie geht das?

Begonnen von ch.schnegg, Montag, 20. November 2017, 21:12

« vorheriges - nächstes »

ch.schnegg

Hallo, ich habe versucht, in einem Akkord von Ganzen Noten eine kleine, nur fakultativ zu spielende ein zu fügen:

\version "2.18.2"
\new Voice {
  % first measure: small Note (the "c") well attached to the stem
  << f''2 \new Voice \with { fontSize = #-2 } { c'' } f' >>
  << f''2 \new Voice \with { fontSize = #-2 } { c'' } f' >>
  % second measure: the small note would look better if center-aligned
  << f''1 \new Voice \with { fontSize = #-2 } { c'' } f' >>
}


Resultat s. angehängtes svg. Das sieht im ersten Takt mit den halben Noten gut aus, aber die Ganzen wären hübschen, wenn nicht linksbündig, sondern zentriert übereinander stünden.
Mit \new CueVoice ergibt sich das im Prinzip gleiche Resultat, nur mit kleineren Notenköpfen.

Gibt es dazu eine Funktion/Lösung?

Danke im Voraus, Christoph

#######################

Nachtrag vom 22.11.2017:

ich habe inzwischen eine Lösung gefunden, die aber nur funktioniert, wenn eine obere Stimme vorhanden ist und sich darunter in der 2. Stimme der Akkord aufbaut (dann gibt es ohne Verschiebung die "Notenkollumnen kollidieren" Fehlermeldung) und die zudem sehr fummelig ist, da eine Änderung der Schriftgröße für die fakultative Note zu einer jeweils anderen Verschiebung führt (Fehlermeldung dann weg):

\version "2.18.2"
\language "deutsch"
\relative c {
  \clef bass
  <<
    g'1
      \\ 
    << c,1 \new Voice \with { fontSize = #-2 } { \once \override NoteColumn.force-hshift = #0.11 \shiftOnn g } c, >> \bar "|."
  >>
}


gibt es etwas eleganteres?

Danke fürs mitdenken, Christoph

Manuela

Warum nimmst du nicht den \tweak-Befehl?

\version "2.18.2"
\new Voice {
  < f'' \tweak font-size #-2 c'' f' >1
}


Wie man die Note zentriert, weiß ich auf die Schnelle allerdings auch nicht.
Danke für eure Hilfe
viele Grüße
-- Manuela

ch.schnegg

Hallo Manuela,

habe bislang kein \tweak verwendet, weil bis zu Deinem Hinweis nicht wusste, dass es den Befehl gibt. Werde ihn mir merken.

Hast Du denn noch ein Idee zum Zentrieren der Note - im Prinzip geht es ja mit der force-hshift Konstruktion, nur dass die so, wie ich sie geschrieben habe, unabhängig von der Grundgröße der Noten ist, d.h., wenn ich das Notenbild insgesamt etwas größer oder kleiner mache, dann passt der verwendete Wert nicht. Geht dort auch eine relative Angabe, z.B. irgenwas wie ".... .force-hshift "Notensystemgröße geteilt durch 12" oder so?

MfG, Christoph

Malte

\version "2.18.2"

{ <e'' \tweak extra-offset #'(0.2 . 0) \tweak font-size #-2 c'' a' >1 }
Wie wärs damit? Eventuell muß der Wert 0.2 noch angepaßt werden. Das ist eine der wenigen Situationen, in denen mir nichts besseres einfällt als extra-offset zu verwenden. Das ist in der Regel mit Vorsicht zu genießen, aber hier könnte es problemlos funktionieren, denke ich.

Manuela

Zitat von: Malte am Sonntag,  7. Januar 2018, 17:06
\version "2.18.2"

{ <e'' \tweak extra-offset #'(0.2 . 0) \tweak font-size #-2 c'' a' >1 }
Wie wärs damit? Eventuell muß der Wert 0.2 noch angepaßt werden.

Man könnte eine Funktion schreiben, die abhängig von der gewünschten Fontsize das extra-offset anhand der horizontalen Ausdehnung der Notenköpfe ausrechnet. Leider habe ich momentan keine Zeit, um daran zu tüfteln.
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

#5
extra-offset funktioniert nicht mehr adäquat sobald Hilfslinien ins Spiel kommen.

Man kann Stem.positioning-done neu kodieren. Aber Vorsicht, hier einzugreifen bedeutet LilyPond zu sagen "Kümmer Dich nicht weiter drum, die nötige Neurochirurgie mach ich."...

Ich bin mir auch nicht sicher, nicht irgendwo eine Synapse gekappt zu haben. Zusätzlich müssen "suspended note-heads" (wie nennt man das eigentlich auf deutsch?) extra markiert werden. Ansonsten hätte man die gesamte c++-Prozedure neu schreiben müssen, das war mir dann zu viel. ;)

Aber hier der code:


\version "2.19.65"

%% From
%% https://archiv.lilypondforum.de/index.php/topic,2507.msg14157.html#msg14157
%% slightly changed
#(define (get-parent-in-hierarchie grob searchword)
  ;; goes up in hierarchie until it finds
  ;; a grob named searchword     
  (define result #f)
 
  (define compare
    (lambda (x)
      (and (ly:grob? x)
           (eq? searchword (grob::name x)))))
 
  (define (get-par grob)
    (let* ((parx (ly:grob-parent grob X))
           (pary (ly:grob-parent grob Y)))
       
      (cond ((not(equal? result #f))                     
              result )
            ((compare parx)
              (set! result parx)
              result)
            ((compare pary)
              (set! result pary)
              result)
            (else
              (if (ly:grob? parx)
                  (get-par parx))
              (if(ly:grob? pary)
                  (get-par pary))))))
      ;; the inner function gets called from here
      (let* ((result (get-par grob)))
        ;; check if we found something
        (if (ly:grob? result)
            result
            #f)))

#(define (x-center-main-heads grob)
  ;; center note-heads in a column, apart from note-heads with details.suspended
  ;; set #t
  (let* ((nc (ly:grob-parent grob X))
         (sys (get-parent-in-hierarchie grob 'System))
         (line-thick (ly:staff-symbol-line-thickness grob))
         (dir (ly:grob-property grob 'direction))
         (thick (ly:grob-property grob 'thickness))
         (layout (ly:grob-layout grob))
         (blot (ly:output-def-lookup layout 'blot-diameter))
         (nhs-array (ly:grob-object grob 'note-heads))
         (grob-ext
           (ly:grob-extent grob nc X))
         (stem-ext
           (if (interval-sane? grob-ext)
               grob-ext
               '(0 . 0)))
         (stem-thick
           (if (zero? (interval-length stem-ext))
               thick
               (* dir -1 (interval-length stem-ext))))
         (raw-nhs
           (if (ly:grob-array? nhs-array)
               (ly:grob-array->list nhs-array)
               '()))
         (nhs
           (remove
             (lambda (nh)
               (let ((sus
                       (assoc-get 'suspended (ly:grob-property nh 'details))))
                 (and (boolean? sus) sus)))
             raw-nhs))
         (nhs-group-ext
           (ly:relative-group-extent nhs-array sys X))
         (nh-stil-exts
           (map
             (lambda (n-h)
               (ly:stencil-extent (ly:note-head::print n-h) X))
             nhs))
         (x-move-vals
           (map
             (lambda (nh-stil-ext)
               (-
                  (interval-center nh-stil-ext)
                  (interval-center nhs-group-ext)))
             nh-stil-exts)))

    ;; suspended note-heads
    (let* ((suspended-nhs
             (filter
               (lambda (nh)
                 (let ((sus
                         (assoc-get 'suspended (ly:grob-property nh 'details))))
                   (and (boolean? sus) sus)))
               raw-nhs))
           (suspended-nh-stil-lengths
             (map
               (lambda (n-h)
                 (interval-length
                   (ly:stencil-extent (ly:note-head::print n-h) X)))
               suspended-nhs)))
        (for-each
          (lambda (s-nh stil-length)
            (ly:grob-translate-axis! s-nh
              (+ (* dir -1 stem-thick (+ blot line-thick))
                 (if (eqv? dir UP)
                     (car stem-ext)
                     (- stil-length)))
              X))
          suspended-nhs
          suspended-nh-stil-lengths))
         
    ;; note-heads
        (for-each
          (lambda (nh z)
            (ly:grob-translate-axis! nh
              (+ (* -1 z)
                 (if (eqv? dir UP)
                     (+ (cdr stem-ext) (- (interval-length nhs-group-ext)))
                     0))
            X))
          nhs
          x-move-vals))
      #t)

chrd = {
  <
    eis'''
    \tweak details.suspended ##t
    dis'''
    \tweak font-size #-1
    cis'''
    \tweak font-size #-3
    fis''
    \tweak font-size #-5
    cis''
    \tweak font-size #-7
    fis'
    \tweak font-size #-2
    cis'
    \tweak font-size #-11
    fis
  >1
}

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

{
  \tweak self-alignment-X #LEFT \mark "default"
 
  \voiceOne \chrd
  \voiceTwo \chrd
 
  \tweak self-alignment-X #LEFT \mark "centered main-heads"
 
  \override Stem.positioning-done = #x-center-main-heads
 
  \voiceOne \chrd
  \voiceTwo \chrd
}


Ich hab natürlich einen Akkord modifizert, ob das auch bei polyphonem Geschehen noch funktioniert bleibt zu testen. Ist mir heut' zu spät. ;)


HTH,
  Harm


Be-3

Hallo zusammen,

ach, das lilypondforum.de ist mittlerweile auch umgezogen?
Nun, da bin ich wieder aus der Versenkung mit neu angelegtem User im neuen Forum...

@Harm: Die Hilfslinien-Problematik kommt doch eigentlich nicht durch den extra-offset (der verrückt ja nur völlig rücksichtslos), sondern durch die geänderte NoteHead.font-size, die auch die Breite der Hilfslinien entsprechend ändert (linkes Beispiel).


Eine einfache Lösung (ohne Programmieraufwand) in Forführung von Maunelas und Maltes Vorschlägen wäre z. B. statt extra-offset statt X-offset zu tweaken, dann verschiebt sich der Notenkopf mitsamt Hilfslinie und eventuellen Versetzungszeichen (rechtes BeispieL).


Der Vollständigkeit halber: wenn man einfach zum Ausgleich der Notenverkleinerung NoteHead.X-extent künstlich wieder hochsetzt (mittleres Beispiel), denn dann behält die Hilfslinie ihre "normale" Breite.
Sieht aber nicht schön aus, nur zur Demonstration.


\version "2.18.2"

{ <c' g' d''
  \tweak NoteHead.font-size #-4
    \tweak NoteHead.extra-offset #'(0.37 . 0) a''>1
  <c' g' d'' 
  \tweak NoteHead.font-size #-4
    \tweak NoteHead.extra-offset #'(0.37 . 0)
    [b]\tweak NoteHead.X-extent #'(0 . 1.97)[/b] a''>
  <c' g' d'' 
  \tweak NoteHead.font-size #-4
    \tweak NoteHead.X-offset #'0.37 a''>
}


Viele Grüße
Torsten

Manuela

Hallo Torsten,

danke für deinen interessanten Vorschlag.

An die Hilfslinien hatte ich ehrlich gesagt gar nicht gedacht.

Abgesehen davon muss man auch bei deiner Lösung den Versatz durch Probieren herausfinden.

Uiii, jetzt erst sehe ich Harms Programm. Ich hätte nicht gedacht, dass das so kompliziert ist, wow.
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

Hallo Torsten,

willkommen zurück!!!
Wir haben Dich schmerzlich vermißt.

Deine lilyjazz-font hat große Begeisterung ausgelöst und dann warst Du plötzlich weg...
Siehe:
http://lilypondblog.org/2014/09/lilyponds-look-and-feel/
https://github.com/OpenLilyPondFonts/lilyjazz/blob/master/FONTLOG.txt
und erst heute:
http://lists.gnu.org/archive/html/lilypond-user/2018-01/msg00132.html

Vielleicht magst Du ja Kontakt aufnehmen.

Zum Thema:
X-offset funktioniert hier nicht immer. Insoweit würde ich nicht drauf bauen.
Die Kombination von X-extent und extra-offset wird wohl klappen, ist aber ein elendiges Gefummel...

Beste Grüße,
  Harm



Be-3

Hallo Harm,

danke für das Willkommen!
Malte und Urs haben sich auch schon gemeldet und ich werde auch auf liypond-devel nochmal "offiziell" bestätigen, dass LilyJAZZ selbstverständlich ebenso frei wie LilyPond sein soll.
Wir profitieren schließlich alle von LilyPond, da darf man ruhig mal etwas beitragen.

Zum Thema:
Ja, Du hast natürlich völlig recht: manchmal muss man extra-offset verwenden, manchmal X-offset, manchmal braucht man überhaupt keine Verschiebung (bei Sekundabständen, wenn die Notenköpfe nach links oder rechts ausweichen, dann sollen sie sich schon "anschmiegen").

Auch Manuelas Einwand, der Offset-Wert müsse ja durch Probieren herausgefunden werden, stimmt schon, auch wenn man alles in eine music-function packen könnte, die selbständig anhand der Original-Notenkopf-Breite und Verkleinerungsstufe automatisch den Versatz bestimmt und gleichzeitig die Verkleinerung der Versetzungszeichen, Punkte, Akzente usw. denkt.
Das Probieren fand ich jetzt aber für eine ad-hoc-Lösung nicht kritisch, schließlich ist die Breite einer ganzen Note feststehend und bekannt und kürzere Noten sollen ja an ihrem Hals bleiben und nicht verschoben werden.

Deine Lösung ist sicher besser als manuell zu basteln (aber eben auch sehr aufwendig).
Ich wollte lediglich zeigen, wie man ohne große Scheme-Programmierung auch zum gewünschten Ergebnis kommen kann - und falls es sich um einen Ausnahmefall handelt, scheint mir die manuelle Lösung durchaus angemessen.
Falls die verschobenen Mini-Noten allerdings sehr häufig gebraucht werden, lohnt sich natürlich eine Automatisierung.

Viele Grüße
Torsten