Autor Thema: Spacing-Problem mit Custom-Notenköpfen bei Versetzungszeichen  (Gelesen 2493 mal)

Be-3

  • Member
Spacing-Problem mit Custom-Notenköpfen bei Versetzungszeichen
« am: Samstag, 29. September 2012, 19:40 »
Hallo zusammen,

im Rahmen meiner Jazz-Stil-Avancen bin ich auf ein selstames Problem gestoßen, das mir einiges Kopfzerbrechen bereitet:
Wenn man den NoteHead-Stencil durch ein Text-Markup ersetzt (und sei es auch der Original-Feta-Notenkopf), hängt unter gewissen Umständen ein Versetzungszeichen in der Note statt - wie es sich gehört - davor.
Der Fall ist auch im Standard nachzuvollziehen.

Rahmenbedingungen
  • Notendauer 1 (ganze Note)
  • Note innerhalb des Staffs
  • in ver. 2.16 tritt das Problem nicht auf, wenn die Note einen Akzent hat
  • in ver. 2.14 oder 2.17 hilft ein Akzent auch nichts

\version "2.14.2"

\relative c'' {
  \override NoteHead #'stencil =  #(lambda (grob) (grob-interpret-markup grob (markup
                                                                               #:musicglyph "noteheads.s0")))
  des,1 | bes' | bes-> | ges' |
}

Hat jemand eine Erleuchtung?

Viele Grüße
Torsten

harm6

  • Member
Re: Spacing-Problem mit Custom-Notenköpfen bei Versetzungszeichen
« Antwort #1 am: Samstag, 29. September 2012, 22:38 »
Hallo Torsten,

das Problem ist "Unpure-pure container"

Eigentlich würde ich empfehlen nachzulesen unter:
http://lilypond.org/doc/v2.17/Documentation/notation-big-page#unpure_002dpure-containers
(gibts irgendwo auch auf deutsch)
und
http://lilypond.org/doc/v2.17/Documentation/contributor-big-page#understanding-pure-properties
(gibt es allerdings nicht auf deutsch)

Aber ich muß gestehen, daß ich kein Wort davon verstehe.
Es fängt schon beim Namen an, den finde ich non-deskriptiv. Falls er das doch ist, habe ich nicht einmal eine vage Vorstellung was er wohl bedeuten könnte.
Die Erklärungen verstehe ich nicht.
Warum manches im Contributor-Guide versteckt ist, verstehe ich nicht.

Mit anderen Worten ich bin ein wenig mißmutig, wenn ich an diesen Sch... denke.
Ich sollte wahrscheinlich meinen eigenen Thread bzgl LilyPond-Syntax um diesen Punkt erweitern.


Insofern verhalte ich mich, wenn ich vor Deinem Problem stehe, wie ein dressiertes Eichhörnchen.
Ich kopiere aus der NR.
(Btw, Eichhörnchen sind echt blöde Tiere. Bei zahlreichen Gelegenheiten sah ich aus meinem Wohnzimmerfenster blickend Eichhörnchen, die längere Zeit verzweifelt nach der Nuss suchten, die direkt neben ihnen lag, ich könnte hier noch andere Beispiele aufzählen.
Aber Fakt ist, daß ich nicht davon erbaut bin, wenn man mich zwingt böde zu bleiben.)

\version "2.16.0"
\relative c'' {
       
  \override NoteHead #'stencil = 
    #(lambda (grob)
      (grob-interpret-markup grob (markup #:musicglyph "noteheads.s0")))
     
  % aus der NR reinkopiert, für 2.15.x und höher.
  \override NoteHead #'Y-extent =
   #(ly:make-unpure-pure-container
      ly:grob::stencil-height
      (lambda (grob start end) (ly:grob::stencil-height grob)))
     
  % Workaround für 2.14.2
  %\override NoteHead #'minimum-Y-extent = #'(-0.1 . 0.1)
     
  des,1 | bes' | bes-> | ges' |
}


Gruß,
  Harm

EDIT: Code-Beispiel korrigiert
« Letzte Änderung: Samstag, 29. September 2012, 22:48 von harm6 »

Be-3

  • Member
Re: Spacing-Problem mit Custom-Notenköpfen bei Versetzungszeichen
« Antwort #2 am: Sonntag, 30. September 2012, 00:04 »
Hallo harm,

vielen Dank für den Hinweis, da muß man auch mal drauf kommen!
Die pure/unpure Container sind mir auch schon über den Weg gelaufen, aber ich habe das Thema als pathologisch eingestuft und großzügig ignoriert.
Ich werde mir die von Dir genannte Dokumentation mal zu Gemüte führen...

Nochmal danke und Gruß
Torsten

Be-3

  • Member
Re: Spacing-Problem mit Custom-Notenköpfen bei Versetzungszeichen
« Antwort #3 am: Sonntag, 30. September 2012, 11:22 »
Hallo Harm,

Aber ich muß gestehen, daß ich kein Wort davon verstehe.
Es fängt schon beim Namen an, den finde ich non-deskriptiv. Falls er das doch ist, habe ich nicht einmal eine vage Vorstellung was er wohl bedeuten könnte.
Nun ja, wenn man sich beispielsweise schon mit TeX beschäftigt hat, ist einem bewußt, daß manche Eigenschaften erst relativ spät im Prozeß bekannt sind/feststehen.
Paradebeispiel: Randnotizen sollen außen stehen, aber zu dem Zeitpunkt, zu dem die Zeile gesetzt wird, steht noch nicht fest, ob sie einmal auf einer geraden oder ungeraden Seite landen wird.
Warum in drei Teufels Namen quasi die Höhe eines Notenkopfes erst nach längeren Überlegungen, Berechnungen, Betrachtungen und Einschätzungen feststehen soll, überschreitet allerdings mein Vorstellungsvermögen.

Dreh- und Angelpunkt ist also offensichtlich, daß bei unpure (sic!) Containern nicht zu jedem Zeitpunkt der engdültige Wert einer Eigenschaft bekannt ist. Oder wie der Angelsachse sagt: "specifications are subject to change without notice."  :)

BTW: Shouldn't it be impure rather than unpure, after all (@kilgore - you seem to be a person of the British/American persuasion)? Or am I just being old-fashioned?

(Btw, Eichhörnchen sind echt blöde Tiere. Bei zahlreichen Gelegenheiten sah ich aus meinem Wohnzimmerfenster blickend Eichhörnchen, die längere Zeit verzweifelt nach der Nuss suchten, die direkt neben ihnen lag, ich könnte hier noch andere Beispiele aufzählen.
... und ich Turbo-Eichhörnchen hatte völlig übersehen, daß das Beispiel in der Doku genau meinen Fall mit den Noteköpfen und Versetzungszeichen behandelt.

Erkenntnisse:
  • Bei mir waren nur die Ganzen Noten (Dauer 1) betroffen, weil die anderen durch ihrem Stem gerettet wurden. Ich bin in meinen Experimenten nur so weit gegangen, den Stem-Stencil auf ##f oder transparent zu setzten. Erst das Entfernen des kompletten Stem-Engravers (wie im Doku-Beispiel) führt dazu, daß auch die anderen Notenköpfe Schwierigkeiten bekommen.
  • Der Zusammenhang mit dem X-extent mag erklären, warum es bei akzentuierten Noten (je nach Lilypond-Version) funktioniert: ein Reihenfolgeproblem von Funktionsaufrufen...
  • Auch im Doku-Beispiel tritt das Phänomen nicht auf, (so "unpure" der Container auch sein mag), wenn die Noten außerhalb des Staffs liegen. Auch ohne Hilfslinien

Viele Grüße
Torsten

harm6

  • Member
Re: Spacing-Problem mit Custom-Notenköpfen bei Versetzungszeichen
« Antwort #4 am: Sonntag, 30. September 2012, 13:29 »
Hallo Torsten,

Du scheinst die Geschichte mit ly:make-unpure-pure-container besser zu verstehen als ich.

Es wäre sehr nett, wenn Du versuchen könntest es mir zu erklären.

Der Befehl lautet ja:

  \override NoteHead #'Y-extent =
   #(ly:make-unpure-pure-container
      ly:grob::stencil-height
      (lambda (grob start end) (ly:grob::stencil-height grob)))

Was macht hier die erste procedure: ly:grob::stencil-height
oder vielleicht sollte ich auch fragen warum steht sie hier an dieser Stelle?
Was macht hier die zweite: (lambda ...
Warum hat lambda drei Argumente, was passiert mit "start" und "end"?


Hier schreibt Mike Solomon, der ly:make-unpure-pure-container aus der Taufe hob, folgenden Code:

#(define (kludge grob)
 (ly:grob-set-property! grob 'text "foo")
 (ly:text-interface::print grob))

\new ChordNames \chordmode {
 a b c:7
 \once \override ChordNames . ChordName #'stencil =
#(ly:make-unpure-pure-container kludge (lambda (grob b e) (kludge grob)))
 d
}

Und er schreibt:

Zitat von: Mike Solomon
Anytime you override a stencil, try to use an
unpure-pure-container.
(Die weiteren posts in diesem thread sind auch sehr interessant.)

Ein Y-extent-override ist hier nicht explizit zu erkennen. Ich nehme mal an, daß ly:make-unpure-pure-container es impliziert.


Dein Tex-Beispiel ist ja durchaus einleuchtend. In LilyPond gibt es an anderen Stellen ähnliches (delay-stencil-evaluation).

Mein Problem ist, daß ich ly:make-unpure-pure-container gerne vollständig begreifen würde. Ich schreibe/benutze sehr häufig stencil-overrides, da wäre das durchaus hilfreich.


Gruß,
  Harm