Tirando Apoyando

Begonnen von Hilflos-im-Code, Mittwoch, 20. Oktober 2021, 16:13

« vorheriges - nächstes »

Hilflos-im-Code

In pädagogisch wertvollen Gitarrennoten wird hieundda kenntlich gemacht, ob man mit Tirando oder Apoyando spielt.

Ich habe ein wenig gegoogelt und ein Skript mit kombinierenden diakritische Zeichen modifiziert.
  \version "2.23.0"
 
 
  tir = #(define-event-function (fingnum)
                  (number?)
                  #{
                     \tweak digit-names ##("p̅" "i̅" "m̅" "a̅" "x̅")
                    \rightHandFinger $fingnum
                  #})
 
  apo = #(define-event-function (fingnum)
                  (number?)
                  #{
                    \tweak digit-names ##("p̂" "î" "m̂" "â" "x̂")
                    \rightHandFinger $fingnum
                  #})
 
 
  { c'\tir 1 \tir 2 \tir 3 \tir 4  c'\apo 1 \apo 2 \apo 3 \apo 4 }


Das wäre auch ganz schön, wenn diese Zeichen nicht nur teilweise richtig über den Buchstaben sitzen würden.



Der Browser stellt im Code die Dinge so dar, wie ich sie gerne hätte. Gibt es einen Trick, dass es bei Lilypond genauso aussieht.

harm6

Das ist ein Problem der Schriftarten. Im default für StrokeFinger sind nicht alle der eingegebenen Zeichen enthalten, LilyPond sucht sich dann teils andere Schriftarten. Gedruckt wird dann ein stencil mit verschiedenen Schriftarten.

Bei einem ähnlichen Problem hatte ich mal einen Testcode geschrieben:


#(define (lists-map function ls)
  "Apply @var{function} to @var{ls} and all of it sublists.
First it recurses over the children, then the function is applied to
@var{ls}."
    (if (list? ls)
        (set! ls (map (lambda (y) (lists-map function y)) ls))
        ls)
    (function ls))

printStencilExpressionFonts = 
#(lambda (grob)
  (let* ((stil (ly:grob-property grob 'stencil))
         (stil-expr (ly:stencil-expr stil))
         (output '())
         ;; Finde font-names und speichere sie in "output"
         ;; Die Methode muß zwischen "named-glyph" und "glyph-string"
         ;; differenzieren, da LilyPond das intern anders umsetzt.
         (store-font-names
           (lambda (entry)
             (cond
                   ;; Wenn die stencil-expression irgendwo "named-glyph"
                   ;; beinhaltet, dann extrahiere die Schriftart via
                   ;; ly:font-name aus dem zweiten Eintrag der mit "named-glyph"
                   ;; anfangenden Liste.
                   ;; Erweitere output mit dem Ergebnis.
                   ((and (list? entry)
                         (eq? 'named-glyph (car entry))
                         (ly:font-metric? (cadr entry)))
                     (set! output
                           (cons (ly:font-name (cadr entry)) output)))
                   ((and (list? entry)
                   ;; Wenn die stencil-expression irgendwo "glyph-string"
                   ;; beinhaltet, dann extrahiere die Schriftart indem das
                   ;; dritte Element, der mit "glyph-string" anfangenden Liste
                   ;; ausgewählt wird, ly:font-name würde hier #f zurückgeben.
                   ;; Erweitere output mit dem Ergebnis.
                         (eq? 'glyph-string (car entry))
                         (ly:font-metric? (cadr entry)))
                     (set! output
                           (cons (caddr entry) output)))
                   ;; Ansonsten mache nichts weiter.
                   (else entry)))))
        (lists-map store-font-names stil-expr)

    (pretty-print (cons (grob::name grob) (reverse output)))))
   
printStrokeFingerFonts =
\override StrokeFinger.after-line-breaking = \printStencilExpressionFonts

\version "2.23.0"


tir = #(define-event-function (fingnum)
                (number?)
                #{
                   \tweak digit-names ##("p̅" "i̅" "m̅" "a̅" "x̅")
                  \rightHandFinger $fingnum
                #})

apo = #(define-event-function (fingnum)
                (number?)
                #{
                  \tweak digit-names ##("p̂" "î" "m̂" "â" "x̂")
                  \rightHandFinger $fingnum
                #})

{
  \printStrokeFingerFonts
  c' \tir 1 \tir 2 \tir 3 \tir 4 
  c'\apo 1 \apo 2 \apo 3 \apo 4
}


->
Zitat von: terminal
(StrokeFinger "DejaVuSerif-Italic" "C059-Italic")
(StrokeFinger "DejaVuSerif-Italic" "C059-Italic")
(StrokeFinger "DejaVuSerif-Italic" "C059-Italic")
(StrokeFinger "DejaVuSerif-Italic" "C059-Italic")
(StrokeFinger
  "TeXGyreSchola-Italic"
  "C059-Italic")
(StrokeFinger
  "TeXGyreSchola-Italic"
  "C059-Italic")
(StrokeFinger
  "TeXGyreSchola-Italic"
  "C059-Italic")
(StrokeFinger
  "TeXGyreSchola-Italic"
  "C059-Italic")

Um zu einem besseren Ergebnis zu kommen mußt Du eine Schriftart auswählen, die alle Zeichen enthält.

Bei mir funktioniert "DejaVuSans" ganz gut, bzw "DejaVuSans Italic" um kursiv zu bleiben.

{
  \override StrokeFinger.font-name = "DejaVuSans"
  \override StrokeFinger.font-name = "DejaVuSans Italic"
  \printStrokeFingerFonts
  c' \tir 1 \tir 2 \tir 3 \tir 4 
  c'\apo 1 \apo 2 \apo 3 \apo 4
}


Aber es mag andere Schriftarten geben.

Du könntest auch alle benötigten Zeichen via markup selbst herstellen. Z.B.:


\version "2.23.0"

p-apo = \markup \combine \halign #0 "p" \raise #0.3 \halign #0 "^"
i-apo = \markup \combine \halign #0 "ı" \raise #0.3 \halign #0 "^"
m-apo = \markup \combine \halign #0 "m" \raise #0.3 \halign #0 "^"
a-apo = \markup \combine \halign #0 "a" \raise #0.3 \halign #0 "^"
x-apo = \markup \combine \halign #0 "x" \raise #0.3 \halign #0 "^"

p-tir = \markup \combine \halign #0 "p" \raise #1.1 \halign #0 "_"
i-tir = \markup \combine \halign #0 "ı" \raise #1.1 \halign #0 "_"
m-tir = \markup \combine \halign #0 "m" \raise #1.1 \halign #0 "_"
a-tir = \markup \combine \halign #0 "a" \raise #1.1 \halign #0 "_"
x-tir = \markup \combine \halign #0 "x" \raise #1.1 \halign #0 "_"

tir = #(define-event-function (fingnum)
                (number?)
                #{
                  \tweak digit-names #(vector p-tir i-tir m-tir a-tir x-tir)
                  \rightHandFinger $fingnum
                #})

apo = #(define-event-function (fingnum)
                (number?)
                #{
                  \tweak digit-names #(vector p-apo i-apo m-apo a-apo x-apo)
                  \rightHandFinger $fingnum
                #})
               

{
  c' \tir 1 \tir 2 \tir 3 \tir 4 
  c'\apo 1 \apo 2 \apo 3 \apo 4
}


Textverarbeitungsprogramme verwenden ausgefeiltere Fallbacks, wenn Zeichen in einer Schriftart fehlen.
Bei Browsern weiß ich das nicht, aber ich vermute dort ein ähnliches Verhalten wie bei Textverarbeitungsprogrammen.


HTH,
  Harm

Hilflos-im-Code

Auch vielen Dank. So was wie die zweite Lösung habe ich nach dem Posten auch versucht. Aber ich wusste nicht wie ich ein Markup in \tweak digit-names schreibe.

trulli

Kleiner Hinweis:
Du meinst wahrscheinlich Literatur, wie die von Navascuez. Der hat in seinen Notenausgaben an jede Note den vollständigen Fingersatz mit Apoyando und Tirando geschrieben.
Das führt aber nach meiner Meinung zu einem sehr überladenem Notenbild. ???