Text zwischen zwei Noten zentrieren

Begonnen von konenur, Montag, 1. März 2021, 07:48

« vorheriges - nächstes »

konenur

Hallo,
ich suche eine Möglichkeit, für eine Geigenübung an einigen Stellen zwischen zwei Noten oberhalb der Partitur ein zentriertes Zeichen zu setzen. Es soll Anfängern helfen, rasch zwischen Halb- und Ganztonintervallen zu unterscheiden.

Für Halbtonintervalle würde ich das Zeichen zwischen h und c in beispiel_halbton.jpg (s. Anhang) nehmen.



Das lässt sich im Prinzip leicht einrichten, z.B. mit:

\score {
  \relative c' {
    \key g \major
    \time 2/4
    g4_0 \downbow a_1 b_2^\markup{ \hspace #3.6 \char ##x1B74 } c_3
}


Der Nachteil hier ist aber, dass ich den horiztontalen Abstand (\hspace #3.6) für jede Situation manuell anpassen muss.
Ich wünsche mir, dass das Zeichen automatisch zwischen beiden Noten zentriert wird.

In meinen Recherchen bin ich auf http://lsr.di.unimi.it/LSR/Item?id=954 gestoßen - hier wird mithilfe von Textspannern ein Text zwischen zwei Taktstrichen zentriert. Etwas ähnliches würde helfen - der Spanner müsste von der ersten bis zur zweiten Note (etwa mit \endSpanners) verlaufen und keine Linie haben. Leider ist der Code des genannten Beispiels (noch) zu kompliziert für mich und damit nicht hilfreich.

Hat jemand eine Idee?

Danke!

rgree

#1
Hallo,

vielleicht nicht elegant, aber effektiv :


\version "2.20.0"
\score {
  \relative c' {
    \key g \major
    \time 2/4
    g4 _0 \downbow a _1 b4 ^"   ^" c_3
    \set fontSize = #1
    g4 _0 \downbow a _1 b4 ^"   ^" c_3
    \set fontSize = #2
    g4 _0 \downbow a _1 b4 ^"   ^" c_3
    \set fontSize = #3
    g4 _0 \downbow a _1 b4 ^"   ^" c_3
}
}


Gut, ist nicht die automatische Lösung, klappt aber auch bei Größenänderungen des Fonts.

Viele Grüße,
Reinhard

Rudi Guggt

Hallo,

an deiner Stelle würde ich kein kryptisches Zeichen verwenden, sondern "½". Dieses Dach "^" erinnert zu sehr an etablierte Zeichen wie Aufstrich oder händisch eingezeichnete Zäsur.

lg
Rudi

konenur

Hallo rgree,

vielen Dank für Deine Antwort!
Ich hätte mein Problem etwas präziser formulieren sollen. Die automatische Zentrierung brauche ich nicht nur wegen der Abhängigkeit von der Fontgröße, sondern insbesondere weil der Abstand zwischen den Noten sehr unterschiedlich sein kann - z.B. werden Sechzehntel in der Regel enger gesetzt als Viertelnoten - siehe beispiel_halbton_verrutscht.jpg im Anhang.

Somit klappt es mit einer festen Anzahl an Leerzeichen leider nicht.

@Rudi Guggt: danke für den Tipp. Das Zeichen kann ich ja noch ändern, wenn ich die Lösung habe. Der Konsistenz halber lasse ich es in dem Forum vorerst stehen.

harm6

Hallo,

versuch mal den Code unten.
Aber was heißt zentrieren? Zwischen dem rechten Rand der linken Note und dem linken Rand der rechten Note?
Das sieht nicht immer gut aus
Er ist deshalb etwas ausführlicher geworden, da ich die konkrete Darstellung abhängig von der Ausrichtung der Notenhälse gemacht habe.


\version "2.22.0"

#(define (text-stencil txt)
  (lambda (grob)
    (let* ((bound-left
             (ly:spanner-bound grob LEFT))
           (bound-left-elts
             (ly:grob-object bound-left 'elements))
           (stem-left-list
             (filter
               (lambda (elt)
                 (grob::has-interface elt 'stem-interface))
               (ly:grob-array->list bound-left-elts)))
           (stem-left-dir
             (if (pair? stem-left-list)
                 (ly:grob-property (car stem-left-list) 'direction)
                 #f))
           (bound-right
             (ly:spanner-bound grob RIGHT))
           (bound-right-elts
             (ly:grob-object bound-right 'elements))
           (stem-right-list
             (filter
               (lambda (elt)
                 (grob::has-interface elt 'stem-interface))
               (ly:grob-array->list bound-right-elts)))
           (stem-right-dir
             (if (pair? stem-right-list)
                 (ly:grob-property (car stem-right-list) 'direction)
                 #f)))
   
      (ly:grob-set-nested-property! grob '(bound-details right padding) 0.15)
      (ly:grob-set-nested-property! grob '(bound-details left padding) 0)
             
      (cond ((and (positive? stem-left-dir) (positive? stem-right-dir))
              (ly:grob-set-nested-property! grob
                '(bound-details right attach-dir) 1)
              (ly:grob-set-nested-property! grob
                '(bound-details left attach-dir) 1))
            ((and (negative? stem-left-dir) (negative? stem-right-dir))
              (ly:grob-set-nested-property! grob
                '(bound-details right attach-dir) -1)
              (ly:grob-set-nested-property! grob
                '(bound-details left attach-dir) 1))
            ((and (negative? stem-left-dir) (positive? stem-right-dir))
              (ly:grob-set-nested-property! grob
                '(bound-details right attach-dir) -1)
              (ly:grob-set-nested-property! grob
                '(bound-details left attach-dir) 1))
            ((and (positive? stem-left-dir) (negative? stem-right-dir))
              (ly:grob-set-nested-property! grob
                '(bound-details right attach-dir) 0)
              (ly:grob-set-nested-property! grob
                '(bound-details left attach-dir) 1)))
         
      (let* ((stil (ly:line-spanner::print grob))
             (stil-center (interval-center (ly:stencil-extent stil X)))
             (text-stil
               (grob-interpret-markup grob txt))
             (text-center (interval-center (ly:stencil-extent text-stil X))))
             

        (ly:stencil-translate-axis
          text-stil
          (- stil-center text-center)
          X)))))
         
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLEs
%%%%%%%%%%%%%%%%%%%%%%%%%%%

\layout {
  \override TextSpanner.font-shape = #'upright
}

mus = {
  g'-\tweak stencil #(text-stencil "1") \startTextSpan
  a'\stopTextSpan
  c''-\tweak stencil #(text-stencil "½") \startTextSpan
  b'\stopTextSpan
  b'-\tweak stencil #(text-stencil "1") \startTextSpan
  a'\stopTextSpan
  a'-\tweak stencil #(text-stencil "full") \startTextSpan
  b'\stopTextSpan
}

\score {
  \mus
}

\score {
  \mus
  \layout {
  line-width = 120
  ragged-right = ##f
  }
}

\score {
  \mus
  \layout {
  ragged-right = ##f
  }
}


Gruß,
  Harm

konenur

Hallo Harm,

das ist ja noch besser als bestellt!  :)
Vielen Dank für den tollen Beitrag, genau was ich gebraucht habe!

Viele Grüße
Konenur