Referencia de la notación de GNU LilyPond: 6.3.4 Adding articulation to notes (example)

### 6.3.4 Adding articulation to notes (example)

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 Creating contexts. 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

Other languages: English.

#### Manual de referencia de la notación