Marca dinámica personalizada

Estoy en proceso de grabar una partitura de música para piano. Escribí una marca dinámica personalizada, con cuyo aspecto estoy muy contento, pero el comportamiento, no del todo. es lo siguiente:

mff = \tweak DynamicText.self-alignment-X #LEFT
    #(make-dynamic-script 
    (markup 
        #:dynamic "mf"
        #:normal-text #:italic #:teeny "2ème fois"
        #:dynamic "f"))

Cuando se usa, se ve como:

medida con dinámica "mf 2éme fois f"

Cuando no se usa, se ve así:

misma medida sin dinámica, mostrando diferente espaciamiento

Estoy contento con la marca que comienza debajo de la nota a la que está adjunta (en lugar de centrada debajo de esa nota); pero me gustaría que no posponga la próxima nota hasta que la marca esté completamente escrita. Idealmente, afectaría el ancho de la barra solo si la línea que marca el final de la barra corre el riesgo de cortar la marca.

No puedo encontrar lo que estoy buscando en la documentación.

En caso de que sea necesario, aquí está mi código para la música:

%% VERSION
\version "2.20.0"

\paper {
    #(include-special-characters)
}
    
mff = \tweak DynamicText.self-alignment-X #LEFT
    #(make-dynamic-script 
    (markup 
        #:dynamic "mf"
        #:normal-text #:italic #:teeny "2ème fois"
        #:dynamic "f"))

%% PIANO UP
pianoUpper = \relative c' {
    \override DynamicLineSpanner.staff-padding = #3
    \clef "treble"
    \key d \minor
    \time 4/4
        
    <\tweak font-size #-3 a f'>4 \f <\tweak font-size #-3 c g'> <f a> <d bes'> | 
    <f a>2 <e g> |
    f2. r4 \bar "||"
    <f a> \mf \< <f a> <f a> <f a>8 <a c> |
    <a c>4. <g bes>8 <f a>4 f \! |
        
    <f a> <f a>8 <e g> <f a>4 <f a>8 <a c> |
    <a c>4. \> <g bes>8 <f a>4 r \! |
    <f a> \p \< <f a> <f a> <f a>8 <a c> |
    <a c>4. <g bes>8 <f a>4 f \! |
    <f a> <f a>8 <e g> <f a>4 <f a>8 <a c> |
        
    <a c>4. \> <g bes>8 <f a>4 r \! |
    \repeat volta 2 {
        c'2\( d8 c bes a |
        bes2 c8 bes a g |
        a2 bes8 a g f |
        g4.\) g8 c,2 \> |
            
        <\tweak font-size #-3 a f'>4 \< <\tweak font-size #-3 c g'> <f a> <d bes'> |
    }
    \alternative { 
        {
            <f a>2 \> <e g>4 r \! | 
        }
        {
            <c a'>2\( <bes g'>\) |
            <a f'>2. r4 \bar "|."
        }
    }
}

%% PIANO LOW
pianoLower = \relative c {
    \clef "bass"
    \key d \minor
    
    f4 c f bes, |
    c2 <c, c'> |
    <f f'>4 c' f, r |
    f' <a c> f <a c> |
    c, <e bes' c> f <a c> | 

    f <a c> f <a c> |
    c, <e bes' c> <f a c> r |
    f <a c> f <a c> |
    c, <e bes' c> f <a c> | 
    f <a c> f <a c> |
        
    c, <e bes' c> <f a c> r |
    f <a c> d, <fis c'> |
    g, <g' bes d> c, <e bes' c> |
    f <a c> d, <f bes> |
    c <e bes c> c <e g> |
        
    f c f bes, |
    c2 c4 c |
    c2 <c, c'> |
    <f f'>4 c' f, r |
}

%% SCORE
\score {
    <<
        \new PianoStaff <<
            \new Staff = "upper" \pianoUpper
            \new Staff = "lower" \pianoLower
        >>
    >>
}
Creo que hay algunos comandos para anular la "autoalineación" y asignar una posición absoluta. Sé que es difícil encontrar información en la documentación de LilyPond, pero tal vez alguien la encuentre antes que yo.

Respuestas (4)

Puede establecer explícitamente la dimensión de su marcado usando \with-dimensions(o en este caso, como ya estamos dentro de la definición de una macro de Scheme, #:with-dimensions. Esta macro toma dos pares de Scheme que definen la izquierda y la derecha, así como los bordes inferior y superior de el marcado. El marcado en sí puede ser más grande que el cuadro que defina con estas medidas, y cuando escriba se usará el límite de este cuadro. (Consulte la documentación para obtener más información).

Debido a que \with-dimensionssolo acepta un argumento, debe envolver adicionalmente su marcado en otra \linemacro. Entonces, podrías, por ejemplo, escribir tu macro así:

mff = \tweak DynamicText.self-alignment-X #LEFT
    #(make-dynamic-script 
    (markup #:with-dimensions '(0 . 5) '(-3 . 3) #:line 
       (#:dynamic "mf"
        #:normal-text #:italic #:teeny "2ème fois"
        #:dynamic "f")))

Resultado:

ingrese la descripción de la imagen aquí

También hay varias otras formas de ajustar las dimensiones y la alineación de la dinámica, algunas de las cuales se explican en este fragmento .

Si usa esta definición que parece una marca dinámica,

mff= _ \markup { \dynamic mf \italic \teeny "2ème fois" \dynamic f }

entonces el resultado es este:

ingrese la descripción de la imagen aquí

"El interés de usar make-dynamic-script en lugar de un marcado ordinario es garantizar la alineación vertical de los objetos de marcado". es lo que puedo leer en la documentación: lilypond.org/doc/v2.18/Documentation/notation/… pero su solución aún parece funcionar en mi caso específico. ¿Debo esperar que a veces no lo haga? Como en otros casos, cuando quiero una marca dinámica personalizada larga y es posible que no se alinee verticalmente.
Después de las pruebas, noté que, efectivamente, hay casos en los que no se mantiene la alineación vertical. Ya voté la respuesta, porque resolvió mi problema en ese caso (aunque solo sea por suerte).

De hecho, acabo de crear una función que me permitiría especificar un texto dinámico y arbitrario:

#(define-markup-command
  (staff-expr layout props text)
  (markup?)
  #:properties ((rel-fontsize 0))
  "Creates expression text for a staff.
   
   By default, staff expression text's font is reduced by 0.5
   and is italicized."
  (interpret-markup layout props
   (markup #:line
           (#:with-dimensions '(0 . 0) '(0 . 0)
            (#:fontsize rel-fontsize (#:italic text))))))

staffExpr =
#(define-scheme-function
  (text)
  (markup?)
  #{
    \markup \staff-expr #text
  #}
)

dynExpr = 
#(define-event-function
  (dyn expr) 
  (ly:event? markup?)
  #{
    \tweak DynamicText.self-alignment-X #LEFT
    #(make-dynamic-script
      #{
        \markup \concat {
          #(ly:music-property dyn 'text)
          \pad-x #.75
          \normal-text #expr
        }
      #}
    )
  #}
)

Probablemente podría haberlo hecho de manera más simple, ya que estoy viendo lo que hizo el OP, pero yo mismo soy bastante nuevo en Lilypond.

En cualquier caso, aquí están los dos primeros compases de Una Mattina de Ludovico Einaudi, donde utilicé las funciones anteriores:

ingrese la descripción de la imagen aquí

\version "2.22.2"

#(define-markup-command
  (staff-expr layout props text)
  (markup?)
  #:properties ((rel-fontsize 0))
  "Creates expression text for a staff.
   
   By default, staff expression text's font is reduced by 0.5
   and is italicized."
  (interpret-markup layout props
   (markup #:line
           (#:with-dimensions '(0 . 0) '(0 . 0)
            (#:fontsize rel-fontsize (#:italic text))))))

staffExpr =
#(define-scheme-function
  (text)
  (markup?)
  #{
    \markup \staff-expr #text
  #}
)

dynExpr = 
#(define-event-function
  (dyn expr) 
  (ly:event? markup?)
  #{
    \tweak DynamicText.self-alignment-X #LEFT
    #(make-dynamic-script
      #{
        \markup \concat {
          #(ly:music-property dyn 'text)
          \pad-x #.75
          \normal-text #expr
        }
      #}
    )
  #}
)

beamHeight =
#(define-music-function
  (startHeight endHeight)
  (number? number?)
  #{
    \override Beam.positions = #(cons startHeight endHeight)
  #}
)

Props = {
  \numericTimeSignature
  \time 4/4
  \key c \major
  \partial 16
}

RHVoiceOne = {
  \change Staff = "LH" a16~ |
  \stemUp \once \beamHeight #6.25 #6.25 a16 \stemDown \change Staff = "RH" e' a' \stemUp \change Staff = "LH" a \beamHeight #-6.25 #-6.25 \stemDown \change Staff = "RH" e' a' \stemUp \change Staff = "LH" a \stemDown \change Staff = "RH" e' a' \stemUp \change Staff = "LH" a \stemDown \change Staff = "RH" e' a' \once \beamHeight #6.5 #7.5 \stemUp \change Staff = "LH" a \stemDown \change Staff = "RH" e' b' e' |
  \stemUp \change Staff = "LH" \once \beamHeight #6.25 #6.25 a16 \stemDown \change Staff = "RH" e' a' \stemUp \change Staff = "LH" a \beamHeight #-6.25 #-6.25 \stemDown \change Staff = "RH" e' a' \stemUp \change Staff = "LH" a \stemDown \change Staff = "RH" e' \once \beamHeight #-5.75 #-6.25 a'8. \stemUp \change Staff = "LH" b16 \once \beamHeight #7.75 #8.75 c' \stemDown \change Staff = "RH" e' g' b' |
}

Dynamics = {
  \override DynamicText.X-offset = #0.59125 \override DynamicText.Y-offset = #1.75
  % Note the use of \dynExpr that takes a dynamic marking and some text
  s16 | s16 \dynExpr \p \staffExpr legato s16 s8 s4 * 3 | s1 |
}

Sustain = {
  s16 \sustainOn |
  s1 |
  s2 s8 s8\sustainOff s4 |
}

LHVoiceOne = {
  s16 | s1 | s1 |
}

\paper {
  system-system-spacing = #'((basic-distance . 18))
  %annotate-spacing = ##t
  first-page-number = 10
  evenHeaderMarkup = \markup \null
  oddHeaderMarkup = \markup \null
  evenFooterMarkup = \markup {
    \fill-line {
      \center-column {
        \on-the-fly \first-page
        \fromproperty #'header:copyright
        \vspace #1.807
        \null
        \italic
        \on-the-fly \print-page-number-check-first
        \fromproperty #'page:page-number-string
      }
    }
  }
  oddFooterMarkup = \evenFooterMarkup
}
\score {
  \new GrandStaff \with {
  } <<
    \new PianoStaff \with {
      \override StaffGrouper.staff-staff-spacing.basic-distance = #13.65
    } <<
      \new Staff = "RH" \with {
      } <<
        \new Voice = "1" { 
          \Props
          \RHVoiceOne
        }
      >>
      \new Dynamics {
        \Dynamics
      }
      \new Staff = "LH" \with {
      } {
        \clef bass << 
          \new Voice = "1" {
            \Props
            \LHVoiceOne
          }
        >>
      }
      \new Dynamics = "Sustain" \with {
        pedalSustainStyle = #'mixed
        \override PianoPedalBracket.thickness = #1.35
        \override SustainPedalLineSpanner.staff-affinity = #UP
        \override PianoPedalBracket.Y-offset = #-1.6
        \override SustainPedal.X-offset = #-0.75
        \override SustainPedal.Y-offset = #-1.75
      } {
        \Sustain
      }
    >>
  >>
  \layout {
  }
  \midi {
  }
}
En este caso, podría considerar usar el \whiteoutcomando.
En realidad, específicamente no quería \whiteouten este caso, ya que la partitura original se veía de esta manera. Además, si no hubiera ajustado used the line (#:with-dimensions...), entonces el texto habría "empujado" la barra de compás, pero nuevamente, algo que específicamente estaba tratando de evitar. Pero sí, si no hubiera querido las barras de compás superpuestas (pero manteniendo las mismas dimensiones de medida), \whiteout¡habría funcionado!
Personalmente, yo cuando estoy regrabando una pieza me tomo muchas libertades; "arreglar", "errores", etc., probablemente movería esa marca dinámica sobre la primera nota y usaría el \whiteoutcomando para cruzar la línea de compás, porque eso tendría más sentido y sería mucho más fácil de leer (para mí). Sin embargo, definitivamente puedo entender por qué prefiere hacer una copia más fiel.

No sé nada de las complejidades de LilyPond. Pero esto normalmente se anota simple y suficientemente como mf-f. ¿Sugerir que lo anote de esa manera se consideraría una solución?

Buen punto. Me gustan las soluciones KISS.