Funktion mit einem Parameter mit Typenprädikat für dynamic?

Begonnen von dleber, Mittwoch, 23. November 2022, 23:45

« vorheriges - nächstes »

dleber

Um eine Dynamik-Bezeichnung (p,mf.f...) gleichzeitig nach rechts oder links zu verschieben, wollte ich mir eine Funktion bauen, die mir das ermöglicht. In der Regel kann man das ja mit einer markup-Anweisung machen:

_\markup {\halign #3.0 \dynamic ff }

Es gelingt mir allerdings nicht, für den zweiten Parameter (dynamic) ein Typenprädikat zu finden. Ich hatte einige ausprobiert - allerdings ohne Erfolg.

\version "2.22.1"

%% shift the dynamic sign
sD = #(define-music-function (shift dyn) (number? ly:music?)
#{
    \markup { \halign #shift \dynamic #dyn }
#})

\relative c {
    c'8_\sD #2.5 ff c2
}

Gibt es dafür eine Lösung?

Malte

#1
Hallo dleber,

hier sind mehrere Dinge falsch:
• Du brauchst nicht den Typ von \dynamic, sondern den von "ff" und das ist einfach ein String.
• Eine Sache, die so wie bei dir per - oder _ an eine Note angehängt wird, ist ein Event, deshalb define-event-function statt define-music-function.
• Zu guter letzt darf diese dann aber kein Markup zurückgeben, sondern eben ein Event – daher der zusätzliche - vor \markup.
Insgesamt ergibt sich:
sD = #(define-event-function (shift dyn) (number? string?)
        #{
          -\markup { \halign #shift \dynamic #dyn }
        #})

\relative c {
  c'8_\sD #2.5 ff c2
}

Aber: Im Markup selbst rumzuschieben, ist eigentlich aufwendiger als nötig, so ist das nicht gedacht. Stattdessen kann die Dynamikangabe durch Setzen von X-offset verschoben werden. Dafür gibt es je nach Anwendungsfall die Befehle \override, \once \override, \tweak, außerdem läßt sich ganz schnell eine Abkürzung mithilfe von \etc bauen:
\relative c {
  \once \override DynamicText.X-offset = -4
  c'8\ff c2
}

\relative c {
  c'8-\tweak X-offset -4 \ff c2
}

sD = -\tweak X-offset \etc
\relative c {
  c'8 \sD -4 \ff c2
}

Edit: X-offset ist eine Eigenschaft, die so gut wie alle (oder alle?) Grobs haben, nicht nur DynamicText. Der von mir definierte Kurzbefehl \sD würde also auch auf andere Dinge wie \fermata oder Text eine Auswirkung haben (allerdings immer nur auf das eine direkt folgende).

dleber


dleber

Hallo Malte. Zu /etc finde ich in der Notationsreferenz außer einem lapidaren markup-Beispiel nichts. Steht etc quasi für eine Variable? Ist der Name etc verbindlich?