Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: dleber am Mittwoch, 23. November 2022, 23:45

Titel: Funktion mit einem Parameter mit Typenprädikat für dynamic?
Beitrag von: dleber am Mittwoch, 23. November 2022, 23:45
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?
Titel: Antw:Funktion mit einem Parameter mit Typenprädikat für dynamic?
Beitrag von: Malte am Donnerstag, 24. November 2022, 07:42
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).
Titel: Antw:Funktion mit einem Parameter mit Typenprädikat für dynamic?
Beitrag von: dleber am Donnerstag, 24. November 2022, 10:41
Lieber Malte, das ist umfangreich erklärt. Danke. Super.
Titel: Antw:Funktion mit einem Parameter mit Typenprädikat für dynamic?
Beitrag von: dleber am Donnerstag, 24. November 2022, 10:52
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?
Titel: Antw:Funktion mit einem Parameter mit Typenprädikat für dynamic?
Beitrag von: Malte am Donnerstag, 24. November 2022, 19:04
Hier wird es etwas klarer beschrieben: https://lilypond.org/doc/v2.20/Documentation/changes-big-page.html
Titel: Antw:Funktion mit einem Parameter mit Typenprädikat für dynamic?
Beitrag von: dleber am Freitag, 25. November 2022, 00:26
Danke.