Thanks David & Jean, both approaches work well and look good. The original indications were left aligned to the note so the alignment adjustment isn't needed in this case. I have no idea if one of these is technically superior to the other, although I suspect the fact I need both sub.P and sub.PP means less code with David's approach.
I wonder if this could be added to the snippet examples about defining new dynamics? I don't think I would have stood any chance of finding either solution without your help, and I suspect I'm not the only one who might need this. Thanks Ben > On 17 Jul 2022, at 18:06, David Kastrup <d...@gnu.org> wrote: > > Jean Abou Samra <j...@abou-samra.fr <mailto:j...@abou-samra.fr>> writes: > >> Le 17/07/2022 à 10:11, Benjamin Tordoff a écrit : >>> Hi all, >>> >>> I'm typesetting a score that uses "subito p" and "subito pp" in a couple of >>> places. I've found snippets explaining how to get this to look right >>> (subito in normal italics, the "p" or "pp" in dynamic font), and another >>> snippet showing how to create a custom dynamic that correctly sets the midi >>> volume, but not one that does both. What is the best way to add a text >>> prefix to a dynamic whilst also retaining the dynamic's effect on MIDI >>> output? >>> >>> \version "2.23.10" >>> subPP = \markup{ \italic{sub.} \dynamic pp } >>> >>> \score { >>> { >>> c'2-\ff c'2-\subPP % Volume should be pp but is still ff >>> } >>> \layout {} >>> \midi {} >>> } >> >> >> How about something like this: >> >> \version "2.22.2" >> >> subPPMarkup = \markup { \normal-text \italic { sub. } pp } >> subPP = #(make-dynamic-script subPPMarkup) >> >> \midi { >> \context { >> \Score >> dynamicAbsoluteVolumeFunction = >> #(lambda (dyn) >> (if (equal? dyn subPPMarkup) >> 0.3 >> (default-dynamic-absolute-volume dyn))) >> } >> } > > It may be more convenient to just tamper with the visuals of a command, > like > > \version "2.22.2" > > subx = #(define-event-function (fun) (ly:event?) > #{ -\tweak stencil #(lambda (g) > (grob-interpret-markup g > #{ \markup \concat { \with-dimensions #'(0 . 0) > #'(0 . 0) > \right-align > \normal-text \italic "sub. > " > #(ly:grob-property g > 'text) } > #})) > #fun #}) > > subPP = \subx \pp > > \score { > { > c'8\pppp\< d'8 e'8 f'8 g'8 a'8 b'8 c''8 | > c''8\fffff b'8 a'8 g'8 f'8\subPP e'8 d'8 c'8 } > \layout { } > \midi { } > } > > Note that I put in some effort to stop "sub." from changing the > alignment. If that's undesired, removing > > \with-dimension #'(0 . 0) #'(0 . 0) > > should do the trick. > > -- > David Kastrup