withinStaff (gelöst)

Begonnen von rgree, Donnerstag, 23. Februar 2023, 16:46

« vorheriges - nächstes »

rgree

Hallo,

in meinem Notensatz möchte ich ab und zu mal (z.B. eine dynamische Bezeichnung) in das
Notensystem (die Linien) hineinschreiben lassen.

Inzwischen habe ich folgende Prozeduren gebastelt, die das bewerkstelligen für:

(1) dynamische Bezeichnungen:
dynamicsWithinStaffOnce = \once {
  \override Staff.DynamicLineSpanner.outside-staff-priority = #'()
  \override Staff.DynamicLineSpanner.staff-padding = #'()
}
(2) Fingersätze:
fingeringWithinStaffOnce = \once {
  \override Fingering.staff-padding = #'()
  \override StringNumber.staff-padding = #'()
}

(3) Texte:
textWithinStaffOnce = \once {
  \override TextScript.staff-padding = #'()
  \override TextScript.outside-staff-priority = #'()
}
=====================
Soweit so gut.
Wie mache ich das aber z.B. für <> (espressivo) und überhaupt andere Artikulationszeichen ?
Relativ weit komme ich mit :
withinStaff = -\tweak staff-padding #'() \etc

Ich kann dann z.B. schreiben:
c''' \withinStaff _\espressivo 

Aber, wie die Beispiele (1) und (2) zeigen, muss man zuweilen die Property
outside-staff-priority
manipulieren oder 2 Objekte manipulieren ...

Gibt es dafür eine übergreifende Lösung, oder muß ich ggf. für jede unterschiedliche Situation eine
eigene Prozedur bauen ?
Wo kann ich das nachlesen ?

Gruß,
Reinhard
 

Lazy

Hallo Reinhard,

da sich prinzipiell jedes Grob unterschiedlich verhalten kann und wird und damit unterschiedlich Gründe hat, nicht im System angezeigt zu werden, ist es schwierig, eine Lösung zu finden, die immer funktioniert.

Im vorliegenden Falle gibt es zwei Gründe, die so etwas verhindern:

  • Ein outside-staff-Objekt darf nicht mit dem Notensystem überlappen, erfordert daher, dass outside-staff-priority auf '() oder #f gesetzt wird
  • Manche Objekte haben ein padding zum System (staff-padding). Das impliziert natürlich, dass es keine Überlappung gibt.

Wenn nun aber ein Grob etwa das staff-padding nicht hat, so tut es nichts, wenn wir das "entfernen". Wir können also ganz getrost

withinStaff = \tweak staff-padding #'() \tweak outside-staff-priority #'() \etc
setzen. Manche Grobs wie etwa Dynamikbezeichnungen benötigen einen Grobpfad dazu, da für die Ausrichtung der DynamicLineSpanner zuständig ist (der dafür sorgt, dass Dynamicbezeichnungen aneinander ausgerichtet sind) und nicht das Dynamikgrob.

Das könnte man über eine music-function ganz einfach so bewerkstelligen:

withinStaff =
#(define-music-function (path mus) ((key-list-or-symbol? '()) ly:music?)
   (if (symbol? path) (set! path (list path)))
   #{
     \tweak #(append path (list 'staff-padding)) #'()
     \tweak #(append path (list 'outside-staff-priority)) #'()
     #mus
   #})

{ \stemUp c''\withinStaff DynamicLineSpanner \f c''\withinStaff-> c''\withinStaff_3 }

Herzliche Grüße,
Valentin

rgree

Hallo Valentin,

danke für die ausführliche Antwort.

Herzliche Grüße,
Reinhard