Hello,

LSR 393 contains many methods to align a piece of custom dynamics text like 
"sub. pp" or something on the dynamics, with each methods having some 
drawbacks, like using TextScript, overriding X-offset, adding nonsensical 
horizontal space at the end, setting the dimensions of the text to (0,0),
(0,0), using translation in the markup and setting X-offset.

I’ve come up with a nice method that achieves this with much less effort and 
caveats.

The idea is to create a markup command to wrap (ly:stencil-combine-at-edge 
markup2 X LEFT markup1 nice-value-for-padding) and then define our #(make-
dynamic-script ...) with the dynamics centered and the text added to the left 
using this command.

Now we only need to prevent the self-alignment-interface to center this thing 
again, which we can do by simply tweaking self-alignment-X to #f.

We can of course also do this to add to the right, though this does not 
require such a custom function. The important thing is that the "first" (not 
counting markups added to the left) markup is centered.

So I thought I’d share this with you.

Cheers,
Valentin
#(define-markup-command (add-left layout props m1 m2) (markup? markup?)
   (let* ((stc1 (interpret-markup layout props m1))
          (stc2 (interpret-markup layout props m2)))
     (ly:stencil-combine-at-edge stc2 X LEFT stc1 0.6)))


%%% sub. pp aligned on pp
subpp =
\tweak self-alignment-X ##f
#(make-dynamic-script
  (markup
   #:add-left
   #:normal-text #:italic "sub."	; sub. added on the left
   #:center-align #:dynamic "pp"))	% core markup (pp)

%%% ff molto aligned on ff
ffmolto =
\tweak self-alignment-X ##f
#(make-dynamic-script
  (markup
   #:center-align #:dynamic "ff"	; core markup (ff)
   #:normal-text #:italic "molto"))	% molto on the right

%%% sub. f molto aligned on f
subfmolto =
\tweak self-alignment-X ##f
#(make-dynamic-script
  (markup
   #:add-left
   #:normal-text #:italic "sub."	; sub. added on the left
   #:center-align #:dynamic "f"		; core markup (f)
   #:normal-text #:italic "molto"))	% molto added on the right

%%% p.f with explaining text behind aligned on the p.f
pocofbutless =
\tweak self-alignment-X ##f
#(make-dynamic-script
  (markup
   #:center-align			; CORE MARKUP
   #:concat
   (
   #:normal-text #:italic "p."		;; p.
   #:dynamic "f"			;; f
   )					; END OF CORE MARKUP
   #:normal-text #:italic		; some text added on the right
   #:fontsize -3
   "(but less than before)"))

%%% p/f with explanation before
choice =
\tweak self-alignment-X ##f
#(make-dynamic-script
  (markup
   #:add-left
   #:normal-text #:italic		; some text added on the left
   #:fontsize -3
   #:line
   (
   "(choose different dynamics at repeats)"
   )
   #:center-align			; CORE MARKUP
   #:concat
   (
   #:dynamic "p"			;; p
   #:normal-text #:bold #:fontsize 2 #:lower 0.5 "/" ;; /
   #:hspace 0.2				;; small kern for the f
   #:dynamic "f"			;; f
   )))					% END OF CORE MARKUP

{ 
f'4\f f' f' f' f'\subpp\< f' f' f' f'\ffmolto f' f' f'
f'4\pp f' f' f' f'\subfmolto f' f' f' 
f'\pocofbutless f' f' f'

\break R1*2 f'1\choice

}

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to