Halbfette Schrift anstelle von fetter Schrift

Begonnen von PietDip4, Samstag, 13. November 2021, 23:53

« vorheriges - nächstes »

PietDip4

Hallo,

ich möchte gerne die fette Schrift durch eine halbfette Schrift ersetzen. Insbesondere geht es mir dabei um die Formatierung von \tempo. Grundsätzlich kann ich das gewünschte Ergebnis mit

\tempo \markup{
\override #'(font-name . "Piazzolla SemiBold")
"Andante."} 4 = 92

erzielen. Allerdings bedeutet diese Lösung, dass ich alle \tempo-Befehle ändern muss! Das finde ich sehr umständlich.

Außerdem ist folgendes keine Lösung:

\layout {
  \context {
    \Score
    \override MetronomeMark.font-name = "Piazzolla SemiBold"
  }
}

Damit erscheint nämlich auch die Metronomangabe in halbfetter Schrift. Für die Metronomangabe möchte ich aber weiterhin gerne "Regular" verwenden.

Hat jemand eine Idee wie sich der gewünschte Effekt mit wenig Aufwand erzielen lässt?

harm6

Für den Text einer MetronomeMark die default Schriftart zu verwenden (was auch immer der default gerade ist) und zwar in "bold" ist hardcoded in `metronome-markup' in translation-functions.scm. `metronome-markup' wird in `format-metronome-markup' aufgerufen. Dieses `format-metronome-markup' ist der default für das context-property `metronomeMarkFormatter'. Im Gegensatz zu `format-metronome-markup' ist `metronome-markup' eine interne procedure.

Das ist die Lage. Insoweit gibt es nur zwei Möglichkeiten: entweder in jeder einzelnen MetronomeMark den override für den font-name zu setzen (der allgemeine override führt ja zu weit) oder einen neuen `metronomeMarkFormatter' zu codieren.

Die erste Möglichkeit hast Du schon ausgelotet (mit ihren Nachteilen)
Für die zweite Möglichkeit wäre der der cleanste Weg `metronome-markup' und `format-metronome-markup' neu zu schreiben.

Das ist aber einiges an scheme-code, bloß um eine Zeile zu ändern.
Stattdessen habe ich mir nur `format-metronome-markup' vorgenommen und verlasse mich darauf, daß die bold-Setzung aus `metronome-markup' wegen des eingefügten font-name-override nicht zum Zuge kommt. Zudem muß ich das interne `metronome-markup' mit einem Trick zugänglich machen:
(@@ (lily) ...)
Das guile-manual sagt man solle das nur als "last ressort" verenden (oder zum debugging).

Da ich die Schriftart nicht habe, kann ich es nicht wirklich testen, aber folgendes sollte dann funktionieren:


\version "2.23.4"

#(define (my-format-metronome-markup event context)
  (let ((hide-note (ly:context-property context 'tempoHideNote #f))
        (text
          #{
          \markup
             \override #'(font-name . "Piazzolla SemiBold")
               #(ly:event-property event 'text)
          #})
        (dur (ly:event-property event 'tempo-unit))
        (count (ly:event-property event 'metronome-count)))
    ((@@ (lily) metronome-markup) text dur count hide-note)))
   
\layout {
  \context {
    \Score
    metronomeMarkFormatter = #my-format-metronome-markup
  }
}

{
  \tempo "Andante." 4 = 92
  b1
}


Gruß,
  Harm

PietDip4

Hallo Harm,

vielen Dank für die ausführliche Antwort.

Die Schrift Piazzolla ist auf https://fontlibrary.org/ zu finden.

Grundsätzlich funktioniert die angeführte Lösung. font-name direkt zu setzen, hat allerdings noch einen Nachteil: Normalerweise erzeugt \tempo \markup{\italic "tranquillo"} eine Tempoangabe in fett+kursiv. Dadurch dass nun aber font-name direkt gesetzt wird, wird der Text aber bedingungslos in aufrechter Schrift gesetzt. Lässt sich dieses Problem eventuell auch noch lösen, sodass der Text in halbfett+kursiv erscheint?

In meinem Beispiel ist es natürlich nur eine Zeile, die geändert werden muss; tatsächlich geht es aber um eine Sammlung von mehreren Werken, die in einem einheitlichen Stil gesetzt werden sollen. Falls erforderlich weitere (interne) Funktionen umzudefinieren, fände ich von daher durchaus angemessen.

harm6

Der Abschnitt:

        (text
          #{
          \markup
             \override #'(font-name . "Piazzolla SemiBold")
               #(ly:event-property event 'text)
          #})

ist eigentlich so gestaltet, daß Du innerhalb des \markup alle markup-commands schreiben könntest.
Man kann diese Funktionalität aber auch separat haben und eine Kurzform fürs definieren von custom-markup-commands verwenden. Das führt zu:


\markup format-metronome-text =
  \markup \override #'(font-name . "Piazzolla SemiBold Italic") \etc

#(define (my-format-metronome-markup event context)
  (let ((hide-note (ly:context-property context 'tempoHideNote #f))
        (text
          (make-format-metronome-text-markup (ly:event-property event 'text)))
        (dur (ly:event-property event 'tempo-unit))
        (count (ly:event-property event 'metronome-count)))
    ((@@ (lily) metronome-markup) text dur count hide-note)))
   
\layout {
  \context {
    \Score
    metronomeMarkFormatter = #my-format-metronome-markup
  }
}

{
  \tempo "Andante" 4 = 92
  b1
}


Allerdings funktioniert der \italic-Befehl nicht so wie mit der default-Schriftart, vielmehr muß das via font-name gemacht werden.

Gruß,
  Harm

P.S.
Man könnte vielleicht ein neues context-property als formatter für den Textteil einer MetronomeMark einführen.
Ich setz das mal auf meine Liste möglicher TODOs.
Diese Liste ist aber jetzt schon unüberblickbar lang...