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.