A.3.4 Añadir articulaciones a las notas (ejemplo)

La manera fácil de añadir articulación a las notas es mezclar dos expresiones musicales en un solo contexto, como se explica en Crear contextos. Sin embargo, supongamos que queremos escribir una función musical que lo haga.

Una $variable dentro de la notación #{...#} es como una \variable normal en la notación clásica de LilyPond. Sabemos que

{ \music -. -> }

no funciona en LilyPond. Podríamos evitar este problema adjuntando la articulación a una nota falsa,

{ << \music s1*0-.-> }

pero a los efectos de este ejemplo, aprenderemos ahora cómo hacerlo en Scheme. Empezamos examinando nuestra entrada y la salida deseada,

%  input
\displayMusic c4
===>
(make-music
  'EventChord
  'elements
  (list (make-music
          'NoteEvent
          'duration
          (ly:make-duration 2 0 1 1)
          'pitch
          (ly:make-pitch -1 0 0))))
=====
%  desired output
\displayMusic c4->
===>
(make-music
  'EventChord
  'elements
  (list (make-music
          'NoteEvent
          'duration
          (ly:make-duration 2 0 1 1)
          'pitch
          (ly:make-pitch -1 0 0))
        (make-music
          'ArticulationEvent
          'articulation-type
          "marcato")))

Vemos que una nota (c4) se representa como una expresión EventChord, con una expresión NoteEvent en su lista de elementos. Para añadir una articulación de marcato, se debe añadir una expresión ArticulationEvent a la propiedad elements de la expresión EventChord.

Para construir esta función, empezamos con

(define (add-marcato event-chord)
  "Add a marcato ArticulationEvent to the elements of `event-chord',
  which is supposed to be an EventChord expression."
  (let ((result-event-chord (ly:music-deep-copy event-chord)))
    (set! (ly:music-property result-event-chord 'elements)
          (cons (make-music 'ArticulationEvent
                  'articulation-type "marcato")
                (ly:music-property result-event-chord 'elements)))
    result-event-chord))

La primera línea es la forma de definir una función en Scheme: el nombre de la función es add-marcato, y tiene una variable llamada event-chord. En Scheme, el tipo de variable suele quedar claro a partir de su nombre (¡esto también es una buena práctica en otros lenguajes de programación!)

"Add a marcato..."

es una descripción de lo que hace la función. No es estrictamente necesaria, pero de igual forma que los nombres claros de variable, es una buena práctica.

(let ((result-event-chord (ly:music-deep-copy event-chord)))

Se usa let para declarar las variables locales. Aquí usamos una variable local, llamada result-event-chord, a la que le damos el valor (ly:music-deep-copy event-chord). ly:music-deep-copy es una función específica de LilyPond, como todas las funciones que comienzan por ly:. Se usa para hacer una copia de una expresión musical. Aquí, copiamos event-chord (el parámetro de la función). Recuerde que nuestro propósito es añadir un marcato a una expresión EventChord. Es mejor no modificar el EventChord que se ha dado como argumento, porque podría utilizarse en algún otro lugar.

Ahora tenemos un result-event-chord, que es una expresión NoteEventChord y es una copia de event-chord. Añadimos el marcato a su propiedad de la lista de 'elements.

(set! lugar valor-nuevo)

Aquí, lo que queremos establecer (el ‘lugar’) es la propiedad 'elements de la expresión result-event-chord.

(ly:music-property result-event-chord 'elements)

ly:music-property es la función que se usa para acceder a las propiedades musicales (los 'elements, 'duration, 'pitch, etc, que vimos en la salida de \displayMusic anterior). El nuevo valor es la antigua propiedad 'elements, con un elemento adicional: la expresión ArticulationEvent, que copiamos a partir de la salida de \displayMusic,

(cons (make-music 'ArticulationEvent
        'articulation-type "marcato")
      (ly:music-property result-event-chord 'elements))

cons se usa para añadir un elemento a una lista sin modificar la lista original. Esto es lo que queremos: la misma lista que antes, más la expresión ArticulationEvent nueva. El orden dentro de la propiedad 'elements no es importante aquí.

Finalmente, una vez hemos añadido la articulación marcato a su propiedad elements, podemos devolver result-event-chord, de ahí la última línea de la función.

Ahora transformamos la función add-marcato en una función musical:

addMarcato = #(define-music-function (parser location event-chord)
                                     (ly:music?)
    "Add a marcato ArticulationEvent to the elements of `event-chord',
    which is supposed to be an EventChord expression."
    (let ((result-event-chord (ly:music-deep-copy event-chord)))
      (set! (ly:music-property result-event-chord 'elements)
            (cons (make-music 'ArticulationEvent
                    'articulation-type "marcato")
                  (ly:music-property result-event-chord 'elements)))
      result-event-chord))

Podemos verificar que esta función musical funciona correctamente:

\displayMusic \addMarcato c4

Otros idiomas: deutsch.

LilyPond — Extending