Autor Thema: Wie kriege ich die Fermaten übereinander?  (Gelesen 3621 mal)

juppes

  • Member
Wie kriege ich die Fermaten übereinander?
« am: Montag, 27. August 2012, 13:27 »
Ich beobachte ein seltsames Verhalten von Lilypond bei einer Kleinigkeit: schreibe gerade eine Partitur in Mensurstrichnotation, und am Ende wollen die Fermaten einfach nicht exakt übereinander stehen - siehe angehängter Screenshot. Es gibt unsichtbare Pausen, aber der Code ist in jeder Zeile der gleiche:

\time 4/4 s1 \breve ~ s1 \breve \fermata \bar "||"
Welche Automatik greift da? Immer stehen die Fermaten der beiden Mittelstimmen ein wenig weiter links - ich habe mehrere Stücke mit der gleichen Art von Ende geschrieben, und immer geschieht dasselbe.

Hat jemand einen Vorschlag, wie ich das ändern könnte?

Danke wie immer für Vorschläge

ding-dong

  • Member
Re: Wie kriege ich die Fermaten übereinander?
« Antwort #1 am: Montag, 27. August 2012, 13:51 »
schickst du bitte einen kompilierbaren code, damit das problem rekonstruiert werden kann!?

Be-3

  • Member
Re: Wie kriege ich die Fermaten übereinander?
« Antwort #2 am: Montag, 27. August 2012, 14:13 »
Welche Automatik greift da? Immer stehen die Fermaten der beiden Mittelstimmen ein wenig weiter links - ich habe mehrere Stücke mit der gleichen Art von Ende geschrieben, und immer geschieht dasselbe.

Hat jemand einen Vorschlag, wie ich das ändern könnte?

Hallo juppes,

die Fermaten hängen an den Noten bzw. (unsichtbaren) Pausen und sind über diesen zentriert. Im wesentlichen läuft es darauf hinaus, daß eine Brevis breiter ist als eine unsichtbare Pause (s) oder auch eine Viertelnote. Deshalb gibt es diese Verschiebungen. Warum die erste Zeile von der zweiten und dritten abweicht, ist mir momentan auch nicht klar.
Ein einfacher, aber effektiver Ansatz ist, mit \hideNotes eine versteckte Brevis anstelle der s-Pause zu setzen, dann stehen die Fermaten alle übereinander, weil ihre Bezugsobjekte die gleiche Breite haben.

\version "2.14.2"

\score {<<
  \relative c' { \time 4/2 s\breve \hideNotes f\fermata \bar "||" }
  \relative c' { \time 4/2 s\breve \hideNotes f\fermata \bar "||" }
  \relative c' { \time 4/2 s\breve \hideNotes f\fermata \bar "||" }
  \relative c' { \time 4/2 f\breve ~ f\fermata \bar "||" }
>>}

Viele Grüße
Torsten

PS: Bitte poste compilierbare Beispiele, möglichst mit Lilypond-Versionsangabe.
« Letzte Änderung: Montag, 27. August 2012, 14:59 von Be-3 »

juppes

  • Member
Re: Wie kriege ich die Fermaten übereinander?
« Antwort #3 am: Montag, 27. August 2012, 15:18 »
danke für die Antworten. Tut mir leid, ich wollte mit dem Code so kurz wie möglich sein, aber man kann auch alles übertreiben...  :)

hier also die kompilierbare Fassung:

\version "2.14.2"

Stimmeeins = \new Voice {\relative { \time 4/2 s \breve ~ s \breve \fermata \bar "||" }}
Stimmezwo = \new Voice {\relative { \time 4/2 s \breve ~ s \breve \fermata \bar "||" }}
Stimmedrei = \new Voice {\relative { \time 4/2 s \breve ~ s \breve \fermata \bar "||" }}
Stimmevier = \new Voice {\relative { \time 4/2 g \breve ~ g \breve \fermata \bar "||" }}

\new StaffGroup  { <<\Stimmeeins
                     \Stimmezwo
                     \Stimmedrei
                     \Stimmevier>>
                     
                    }


Be-3

  • Member
Re: Wie kriege ich die Fermaten übereinander?
« Antwort #4 am: Montag, 27. August 2012, 15:25 »
... und die entsprechenden Ersetzungen nochmal in Deinem Coding: \hideNotes f statt s - und schon stehen die Fermaten übereinander.

\version "2.14.2"

Stimmeeins = \new Voice {\relative { \time 4/2 s \breve \hideNotes f \fermata \bar "||" }}
Stimmezwo = \new Voice {\relative { \time 4/2 s \breve \hideNotes f \fermata \bar "||" }}
Stimmedrei = \new Voice {\relative { \time 4/2 s \breve \hideNotes f \fermata \bar "||" }}
Stimmevier = \new Voice {\relative { \time 4/2 g \breve ~ g \fermata \bar "||" }}

\new StaffGroup  { <<\Stimmeeins
                     \Stimmezwo
                     \Stimmedrei
                     \Stimmevier>>
                     
                    }

Viele Grüße
Torsten
« Letzte Änderung: Montag, 27. August 2012, 15:29 von Be-3 »

juppes

  • Member
Re: Wie kriege ich die Fermaten übereinander?
« Antwort #5 am: Montag, 27. August 2012, 19:32 »
vielen Dank, der Hinweis trifft ins Schwarze. Auf jeden Fall ist erreicht, was ich vorhatte. Ein wenig frustrierend ist nur, daß ich nicht verstehe, warum dieses Phänomen auftritt. Es muß irgendetwas mit der sichtbaren Brevis zu tun haben, denn wenn sie auch durch eine unsichtbare Pause ersetzt wird, stehen dir Fermaten übereinander. Seltsam ist eben auch, daß sich die Sache nur auf die Mittelstimmen und nicht auf die Oberstimme auswirkt.

Ich hake es für's erste unter "Mysterien der digitalen Welt" ab und gehe zur Tagesordnung über...

juppes

  • Member
Re: Wie kriege ich die Fermaten übereinander?
« Antwort #6 am: Montag, 27. August 2012, 20:12 »
noch ein kleiner Nachtrag, auch wenn das Phänomen dadurch nicht transparenter wird: habe gerade herausgefunden, daß ich nur in den Mittelstimmen die unsichtbaren Noten eintragen muß. Aus unerfindlichen Gründen steht ja die Fermate der Oberstimme über der der Unterstimme, und das trotz unsichtbarer Brevis-Pause:

\version "2.14.2"

Stimmeeins = \new Voice {\relative { \time 4/2 s \breve ~ s \fermata \bar "||" }}
Stimmezwo = \new Voice {\relative { \time 4/2 s \breve \hideNotes f \fermata \bar "||" }}
Stimmedrei = \new Voice {\relative { \time 4/2 s \breve \hideNotes f \fermata \bar "||" }}
Stimmevier = \new Voice {\relative { \time 4/2 g \breve ~ g \fermata \bar "||" }}

\new StaffGroup  { <<\Stimmeeins
                     \Stimmezwo
                     \Stimmedrei
                     \Stimmevier>>
                     
                    }

Be-3

  • Member
Re: Wie kriege ich die Fermaten übereinander?
« Antwort #7 am: Montag, 27. August 2012, 20:59 »
Ein wenig frustrierend ist nur, daß ich nicht verstehe, warum dieses Phänomen auftritt. Es muß irgendetwas mit der sichtbaren Brevis zu tun haben, denn wenn sie auch durch eine unsichtbare Pause ersetzt wird, stehen dir Fermaten übereinander. Seltsam ist eben auch, daß sich die Sache nur auf die Mittelstimmen und nicht auf die Oberstimme auswirkt.

Hallo juppes,

nicht ganz - es hängt wie gesagt mit der Breite der Objekte zusammen, an denen die Fermaten "hängen": wenn Du die untere Stimme auch durch eine unsichtbare Pause ersetzt, sind ja wieder alle Objekte gleich breit und es ist kein Wunder, daß die Fermaten genau übereinander stehen.
Als Extrembeispiel zur Verdeutlichung habe ich einmal drei verschiedene Notenkopfgrößen (oben winzig, in der Mitte normal und unten riesig) benutzt (siehe Anhang), um zu zeigen, daß die Notenköpfe alle einen gemeinsamen linken Rand haben (blaue Linie). Die drei roten Linien markieren jeweils die Mitten der drei Notenköpfe und man sieht gut, daß die Fermaten genau zentriert darüberstehen und deshalb nicht genau übereinander ausgerichtet sind.

noch ein kleiner Nachtrag, auch wenn das Phänomen dadurch nicht transparenter wird: habe gerade herausgefunden, daß ich nur in den Mittelstimmen die unsichtbaren Noten eintragen muß. Aus unerfindlichen Gründen steht ja die Fermate der Oberstimme über der der Unterstimme, und das trotz unsichtbarer Brevis-Pause:

Schau nochmal genau hin: die obere Fermate steht etwas weiter links als die anderen.
Ich habe Dein zweites Beispiel einmal mit "skyline" laufen lassen: daran erkennt man auch, warum sich die obere Fermate etwas anders verhält als die anderen: Alle Objekte (auch z. B. die Schlüssel), die nach oben oder unten aus dem System herausstehen, bekommen einen kleinen "Sicherheitsrand" für eventuell noch vorhandenes Markup über oder unter dem System.
Die beiden senkrechten roten Linien habe ich von Hand eingezeichnet - sie markieren die Mitten der Fermaten und man sieht dann deutlich, daß Deine obere Fermate eben doch nicht genau über den anderen ausgerichtet ist.

Ich hoffe, das bringt etwas Licht ins Mysterium ;)

Viele Grüße
Torsten
« Letzte Änderung: Montag, 27. August 2012, 21:02 von Be-3 »

harm6

  • Member
Re: Wie kriege ich die Fermaten übereinander?
« Antwort #8 am: Dienstag, 28. August 2012, 12:03 »
Hallo juppes,

noch etwas mehr Hintergrund:

Wenn Du eine Fermate auf einer Note hast, so ist die Fermate ein 'ArticulationEvent das entstehende grob ist "Script".
Die Note ist ein 'NoteEvent oder ein 'EventChord. Diese Note, genauer: das grob "NoteHead", ist das grob-parent der Fermate.
Grob-parent von "NoteHead" ist "NoteColumn".

Wenn Du die Fermate an eine spacer-rest hängst ist diese ein 'SkipEvent. Grob-parent ist dann "PaperColumn".
Grob-parent von "PaperColumn ist" "System"

Wenn Du die Fermate an eine Pause hängst ist diese ein 'RestEvent. Grob-parent ist dann "NoteColumn".
Grob-parent von "NoteColumn ist" "PaperColumn"

(Alle grob-parents natürlich in X-axis)

Man sieht, daß hier immer unterschiedliche Aspekte zum tragen kommen, sodaß große Schwierigkeiten entstehen falls man versucht eine Fermate an unterschiedliche 'Events zu hängen und diese dann vertical ausrichten möchte.

Als Test habe ich folgende Funktion geschrieben, die die grob-parents und einige andere Werte im Terminal anzeigt:

\version "2.14.2"

%#(ly:set-option 'debug-skylines #t)

#(define (x-length-of-grob grob)
  (let* ((sys (ly:grob-system grob))
         (grob-length (interval-length (ly:grob-extent grob sys X))))
  grob-length))
 
#(define (x-parent-of-grob grob)
  (ly:grob-parent grob X))

readOut = \override Score.Script #'after-line-breaking =
   #(lambda (grob)
     (let* ((par (x-parent-of-grob grob))
            (par-par (x-parent-of-grob par))
            (par-x-length (x-length-of-grob par))
            (x-off (ly:grob-property grob 'X-offset))
     )
     (newline)(display "grob-parent:          ")(display par)
     (newline)(display "parent of grob-parent:")(display par-par)
     (newline)(display "grob-parent-x-length: ")(display par-x-length)
     (newline)(display "X-offset:             ")(display x-off)
     (newline)))
 
\relative c' {
        \readOut
        %\displayMusic
        <c'>1\fermata
}
\relative c' {
        \readOut
        %\displayMusic
        c'\breve\fermata
}

\relative c' {
        \readOut
        %\displayMusic
        s1\fermata
}

\relative c' {
        \readOut
        %\displayMusic
        r1\fermata
}

Terminal-output ist dann:

grob-parent:          #<Grob NoteHead >
parent of grob-parent:#<Grob NoteColumn >
grob-parent-x-length: 1.980008
X-offset:             0.990004

grob-parent:          #<Grob NoteHead >
parent of grob-parent:#<Grob NoteColumn >
grob-parent-x-length: 1.980026
X-offset:             0.990013

grob-parent:          #<Grob PaperColumn >
parent of grob-parent:#<Grob System >
grob-parent-x-length: 2.65002
X-offset:             0.0

grob-parent:          #<Grob NoteColumn >
parent of grob-parent:#<Grob PaperColumn >
grob-parent-x-length: 1.5
X-offset:             0.75

Insoweit ist Torsten's Vorschlag der einzige Weg den ich sehe.

HTH,
  Harm

juppes

  • Member
Re: Wie kriege ich die Fermaten übereinander?
« Antwort #9 am: Dienstag, 28. August 2012, 12:09 »
das ist ja wirklich interessant! Dann ist das Mysterium auch keines mehr! Bemerkenswert ist allenfalls noch, daß das Auge (jedenfalls meins) sich von dem geringen Versatz hat täuschen lassen. (Subjektiv waren die Noten in Ober- und Unterstimme für mich tatsächlich senkrecht übereinander).

Eine andere Sache finde ich auch noch bemerkenswert: hätte ich das alles mit der Hand geschrieben, hätte nach solchen Kleinigkeiten kein Hahn gekräht. Man hätte sich sogar gewundert, wie ich das so exakt hinbekommen hätte, wären die Fermaten alle genau übereinander gewesen). Nur weil ein Computerprogramm alles so genau ausrechnen kann, wird so etwas zum Problem(chen).

Nochmals herzlichen Dank für die Nachhilfe. Ich muß doch einmal ein Sonderstudium der Layoutmöglichkeiten von Lilypond einlegen. Bisher habe ich immer von Fall zu Fall dazugelernt. Jede Notenausgabe hatte andere Anforderungen. Lösbar waren die Probleme alle, wenn auch manchmal erst nach längerem Suchen und nach Herumfragen, wenn auch das nicht half.

Es ist schon toll, wieviele Möglichkeiten die Lilypond-Entwickler alle eingebaut haben. Ich glaube, daß Otto Normalnotenschreiber die nie alle brauchen wird, weil er sich in manchen Ecken eben nie herumtreibt. Lilypond ist eben ein echtes Universalwerkzeug, und hiermit ziehe ich wieder mal den Hut vor denjenigen, die das auf die Beine gestellt haben.