6.3.4 Añadir articulación a las notas (ejemplo)

La manera fácil de añadir articulación a las notas es fundir dos expresiones musicales en un contexto único, como está explicado en Crear contextos. Sin embargo, suponga que queremos escribir una función musical que haga esto.

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

{ \musica -. -> }

no funciona en LilyPond. Podemos evitar este problema adjuntando la articulación a una nota de mentira,

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

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

%  entrada
\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))))
=====
%  salida deseada
\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 marcato, se debe añadir una expresión ArticulationEvent a la propiedad elementos de la expresión EventChord.

Para construir esta función, empezamos con

(define (add-marcato event-chord)
  "Añadir una ArticulationEvent de marcato a los elementos de `event-chord',
  que se ssupone que es una expresión EventChord."
  (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!).

"Añadir una ArticulationEvent de marcato..."

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

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

let se usa para declarar 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 el propósito es añadir un marcato a una expresión EventChord. Es mejor no modificar el EventChord que se dio 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 lista de elementos.

(set! place new-value)

Aquí, lo que queremos establecer (el ‘place’) 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 vemos en la salida de \displayMusic más arriba). El nuevo valor es la anterior 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 lsita sin modificar la lista original. Esto es lo que queremos: la misma lista que antes, más la nueva expresión ArticulationEvent. El orden dentro de la propiedad elements no es importante aquí.

Finalmente, una vez añadida la articulación marcato a su propiedad elements, podemos devolver result-event-chord, de aquí 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: English.

Manual de referencia de la notación