Hello,
I just had this idea about a *new* method of spacing.
Maybe this is nuts, and it's almost a hack, but I'm seeing that it could work, so, please, leave me a feedback.
The idea is create an invisible "obstacle", with a length set in staff-space units, between grobs.
Then, assign a position to each grob.
The obstacle has a grey color in the following example, but you can use white color as well.
Here is the example:
%%%%%%%%%%%%%%%%%%%%%%%%
#(define (SpaceBeforePos1 length) #{ \tweak TextScript.outside-staff-priority 100 ^\markup{ \draw-line #(cons 0 length)} #})
#(define (SpaceBeforePos2 length) #{ \tweak TextScript.outside-staff-priority 200 ^\markup{ \draw-line #(cons 0 length)} #})
#(define (SpaceBeforePos3 length) #{ \tweak TextScript.outside-staff-priority 300 ^\markup{ \draw-line #(cons 0 length)} #})
#(define (SpaceBeforePos4 length) #{ \tweak TextScript.outside-staff-priority 400 ^\markup{ \draw-line #(cons 0 length)} #})
#(define DynamicTextAtPos1 #{ \once \override DynamicLineSpanner.outside-staff-priority = 110 #})
#(define DynamicTextAtPos2 #{ \once \override DynamicLineSpanner.outside-staff-priority = 210 #})
#(define DynamicTextAtPos3 #{ \once \override DynamicLineSpanner.outside-staff-priority = 310 #})
#(define DynamicTextAtPos4 #{ \once \override DynamicLineSpanner.outside-staff-priority = 410 #})
#(define ScriptAtPos1 #{ \once \override Script.outside-staff-priority = 110 #})
#(define ScriptAtPos2 #{ \once \override Script.outside-staff-priority = 210 #})
#(define ScriptAtPos3 #{ \once \override Script.outside-staff-priority = 310 #})
#(define ScriptAtPos4 #{ \once \override Script.outside-staff-priority = 410 #})
#(define TupletBracketAtPos1 #{ \once \override TupletBracket.outside-staff-priority = 110 #})
#(define TupletBracketAtPos2 #{ \once \override TupletBracket.outside-staff-priority = 210 #})
#(define TupletBracketAtPos3 #{ \once \override TupletBracket.outside-staff-priority = 310 #})
#(define TupletBracketAtPos4 #{ \once \override TupletBracket.outside-staff-priority = 410 #})
#(define OttavaBracketAtPos1 #{ \once \override Staff.OttavaBracket.outside-staff-priority = 110 #})
#(define OttavaBracketAtPos2 #{ \once \override Staff.OttavaBracket.outside-staff-priority = 210 #})
#(define OttavaBracketAtPos3 #{ \once \override Staff.OttavaBracket.outside-staff-priority = 310 #})
#(define OttavaBracketAtPos4 #{ \once \override Staff.OttavaBracket.outside-staff-priority = 410 #})
{
\time 2/4
% assign a position to each grob
$TupletBracketAtPos1
$OttavaBracketAtPos2
$DynamicTextAtPos3
$ScriptAtPos4
% We want 4 staff spaces before position 1, 2 staff spaces before position 2, 3 staff-spaces before position 3 and 4 staff-spaces before position 4
\once \override TupletBracket.direction = #UP
\once \override TextScript.color = #grey
\tuplet 3/2 { \ottava #1 c'''-#(SpaceBeforePos1 4) -#(SpaceBeforePos2 2) -#(SpaceBeforePos3 3) ^\mf -#(SpaceBeforePos4 4) ^> c''' c''' \ottava #0 }
r2
% change the position of the grobs
$OttavaBracketAtPos1
$TupletBracketAtPos2
$ScriptAtPos3
$DynamicTextAtPos4
\once \override TupletBracket.direction = #UP
\once \override TextScript.color = #grey
\tuplet 3/2 { \ottava #1 c'''-#(SpaceBeforePos1 4) -#(SpaceBeforePos2 2) -#(SpaceBeforePos3 3) ^\mf -#(SpaceBeforePos4 4) ^> c''' c''' \ottava #0 }
}