Notenhals mittig / Notenhals rechts

Begonnen von ingmar, Montag, 31. Juli 2017, 22:19

« vorheriges - nächstes »

ingmar

Hallo,


wenn ich in LilyPond Mensuralnotation setze, befinden sich die Notenhälse immer mittig unter den Notenköpfen.

Es gab eine Zeit im europäischen Frühbarock, als zwar die Notenköpfe schon rund geschrieben wurden, die Notenhälse bei Vierteln, Achteln und Sechzehnteln aber noch mittig gesetzt wurden. Bei Halben wurden sie - jedenfalls bei der Musik, die mir grade zur Verfügung steht - immer rechts angesetzt, egal, ob der Hals nach oben oder unten ging. Das gilt entsprechend bei punktierten Notenwerten.

Wenn eine Note AUF den Taktstrich gesetzt wurde (siehe entsprechendes Topic) wurde der Notenhals ebenfalls immer rechts angesetzt (sonst würde er ja mit dem Taktstrich zusammenfallen).

Frage: Kann man das in LilyPond umstellen? Also abhängig vom Notenwert den Hals immer in die Mitte des Notenkopfs oder auch immer nach rechts setzen? Und diese Regel für den Fall der Verschiebung auf den Taktstrich aussetzen? Die Doku hab ich durchsucht, finde aber leider nichts dazu.


Danke, Gruß, : - )
--ingmar

harm6

Zitat
Frage: Kann man das in LilyPond umstellen? Also abhängig vom Notenwert den Hals immer in die Mitte des Notenkopfs oder auch immer nach rechts setzen?
Ja, das property welches das regelt ist stem-attachment. Per default ist das die procedure 'ly:note-head::calc-stem-attachment'
Aber man kann das von Bedingungen abhängend anders gestalten. Ich denke für die Methode gibt es Beispiele im Extending Manual.

ZitatUnd diese Regel für den Fall der Verschiebung auf den Taktstrich aussetzen?
Das war jetzt trickreich, denn eigentlich wird stem-attachment gesetzt bevor die Verschiebung stattfindet ...

Ich hab jetzt doch einen Weg gefunden. Er ist aber abhängig vom Name der Funktion, die das Verschieben auslöst, also bitte nicht umbenennen, oder halt an allen entsprechenden stellen modifizieren ...

Hier der Code:


\version "2.19.56"

#(define move-note-head-on-bar
  (lambda (grob)
    (let* ((sys (ly:grob-system grob))
           (all-elts (ly:grob-object sys 'all-elements))
           ;; get the stem of the note-head
           (stem (ly:grob-object grob 'stem))
           ;; the parent-note-column
           (note-col (ly:grob-parent grob X))
           ;; note-column accidentals
           (acc (ly:note-column-accidentals note-col))
           ;; all bar-lines from 'all-elts' or '()
           (all-bar-lines
             (if (ly:grob-array? all-elts)
                 (filter
                   (lambda (e)
                     (grob::has-interface e 'bar-line-interface))
                   (ly:grob-array->list all-elts))
                 '()))
           ;; a list of bar-lines occurring after the note-head-grob or '()
           (bl-after-nh
             (if (pair? all-bar-lines)
                 (call-with-values
                   (lambda ()               
                    (partition
                     (lambda (x)
                       (> (car (grob::rhythmic-location x))
                          (car (grob::rhythmic-location grob))))
                      all-bar-lines))
                   (lambda (a b) a))
                 '()))
           ;; sort them after bar-number, better be paranoid
           (sorted-bl-after-nh
             (sort
               bl-after-nh
               (lambda (p q)
                 (< (car (grob::rhythmic-location p))
                    (car (grob::rhythmic-location q))))))
           ;; get the first bar-line from sorted-bl-after-nh, which is next
           ;; right to grob
           ;; it may not be the bar-line in the same context as grob, but
           ;; this does not makes a difference
           (requested-bar-line
             (if (pair? sorted-bl-after-nh)
                 (car sorted-bl-after-nh)
                 '()))
           ;; create a list of grob and related bar-line or put out '() if no
           ;; bar-line present
           (nh&bl
             (if (ly:grob? requested-bar-line)
                 (list grob requested-bar-line)
                 '()))
           ;; calculate their extents
           (exts
             (map-in-order
               (lambda (g) (ly:grob-extent g sys X))
               nh&bl)))
    ;; move note-head, stem and accidentals on the bar-line via
    ;; ly:grob-translate-axis!
    ;; the amount of the needed value is calculated as the difference between
    ;; the center of the note-head and the center of the stem in X-direction
    (if (pair? exts)
        (for-each
          (lambda (g)
            (if (ly:grob? g)
                (ly:grob-translate-axis!
                  g
                  (- (interval-center (cadr exts))
                     (interval-center (car exts)))
                  X)))
          (list grob stem acc))))))

NhOnBar =
  \once \override NoteHead.after-line-breaking = #move-note-head-on-bar
       
#(define change-stem-attachment
  (lambda (grob)
    (let* ((dur-log (ly:grob-property grob 'duration-log))
           (stem-attach (ly:note-head::calc-stem-attachment grob))
           (stem (ly:grob-object grob 'stem))
           (stem-thick (ly:grob-property stem 'thickness))
           (stem-dir (ly:grob-property stem 'direction))
           (layout (ly:grob-layout grob))
           (line-thick
             (ly:chain-assoc-get 'line-thickness layout 0.1))
           (real-thick (* stem-thick line-thick))
           (alb-proc
             (assoc-get 'after-line-breaking (ly:grob-basic-properties grob)))
           (alb-proc-name
             (if alb-proc
                 (procedure-name alb-proc)
                 #f))
           (x-attach
             (if (= 1 stem-dir)
                 (car stem-attach)
                 (- (car stem-attach) (* 1.5 real-thick)))))
                 
    (cond (alb-proc-name
           (cons
             (* x-attach stem-dir)
             (* (cdr stem-attach) stem-dir)))
          ((= 1 dur-log)
           (cons
             (* x-attach stem-dir)
             (* (cdr stem-attach) stem-dir)))
          (else '(0 . 0))))))

changeStemAttachment =
  \override NoteHead.stem-attachment = #change-stem-attachment
       
       
\layout {
  \context {
    \Voice
    \changeStemAttachment
  }
}

to = a,

\transpose c \to
<<   
  {
    \time 4/2
    \repeat unfold 8 cis''1
  }
  {
    \time 4/2
    c''1
    \NhOnBar
    dis''\breve
    e''1
    c''1
    \NhOnBar
    d''\breve
    e''1
  }   
  {
    \time 4/2
    \repeat unfold 8 c''1
  }
>>

\transpose c \to
{
    c''2
    \NhOnBar
    \once \override NoteColumn.X-offset = #-2
    d''1
    e''2
}

\transpose c \to
{
    \time 4/8
    c''4
    \NhOnBar d''2
    e''4
}

\transpose c \to
{
    \time 4/16
    c''8
    \NhOnBar d''4
    e''8
}

\transpose c \to
{
    \time 4/32
    c''16
    \NhOnBar d''8
    e''16
}


Nichtdestotrotz frage ich mich schon, ob man wirklich jeden zu Recht vergessenen Irrweg der Notationsgeschichte mit LilyPond nachbilden können muß. ;)

Gruß,
  Harm

erich

Hallo allen

Zitat

Nichtdestotrotz frage ich mich schon, ob man wirklich jeden zu Recht vergessenen Irrweg der Notationsgeschichte mit LilyPond nachbilden können muß. ;)


Man kann doch historische Beispiele scannen und als Bild wiedergeben. Wer wird denn aus in alt gesetzten Noten musizieren wollen oder sie zum Komponieren verwenden?

harm6

Zitat von: erich am Mittwoch,  2. August 2017, 07:24
Zitat von: harm
Nichtdestotrotz frage ich mich schon, ob man wirklich jeden zu Recht vergessenen Irrweg der Notationsgeschichte mit LilyPond nachbilden können muß. ;)
Man kann doch historische Beispiele scannen und als Bild wiedergeben. Wer wird denn aus in alt gesetzten Noten musizieren wollen oder sie zum Komponieren verwenden?

Ein Fall ist mir, nach dem ich das schrieb, doch eingefallen:
In kritischen Berichten wäre es doch sehr aufwendig immer kleine Scans einzufügen, besser man kann es mit lily setzen.

Gruß,
  Harm

ingmar

...ein weiteres Beispiel wären Partituren dort, wo nur Einzelstimmen überliefert sind. Und das ist fast überall in der Musik vor ca. 1650 der Fall.

Vielleicht will auch jemand Noten einer historischen Schreibweise verwenden, muss sie aber für sein Instrument transponieren. Man will hier sicher nicht eine bestimmte Handschrift nachmachen, aber man will in einem bestimmten Stil schreiben können: "Wie wäre das etwa um 1604 am Hof in London notiert worden?"

Gewisse Notationsdetails waren übrigens kein "Irrweg", sondern bei gewissen Dingen hatte sich halt noch nicht die heutige Einheitlichkeit herausgebildet. Apel schreibt sinngemäß, dass man mit Taktstrichen und Bindebögen fast alles in der europäischen Polyphonie Übliche notieren kann, dass es aber Jahrhunderte brauchte, bis sich diese - aus heutiger Sicht so einfachen und so hilfreichen - Mittel entwickelt hatten und halt auch verstanden worden waren.

Die Stelle, wo der Notenhals aus dem Kopf herauskommt, ist zugegebenermaßen ein kleines Detail. Es hilft aber, Konsistenz innerhalb des Stils zu wahren, so dass andere Abweichungen nicht so sehr als Fremdkörper, als Fehler, erscheinen. Heute erscheint uns das als pedantischer Kleinkram, aber wer weiß, vielleicht kann man in LilyPond 10.0 einfach \style = "MozartConceptManuscript" schreiben, um das Ergebnis in Mozarts Konzept-Handschrift zu lesen..?

--ingmar