From: Francisco Vila Date: Wed, 24 Feb 2010 15:50:48 +0000 (+0100) Subject: Doc-es: Extending -- delete moved block. X-Git-Tag: release/2.13.14-1~8^2~2^2~1 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=db4d6b7808b24f441e8689d2a9a459651623cb7e;p=lilypond.git Doc-es: Extending -- delete moved block. --- diff --git a/Documentation/es/extending/programming-interface.itely b/Documentation/es/extending/programming-interface.itely index ad66d172cf..d175bda285 100644 --- a/Documentation/es/extending/programming-interface.itely +++ b/Documentation/es/extending/programming-interface.itely @@ -21,7 +21,6 @@ Scheme, @rlearning{Tutorial de Scheme}. @menu * Funciones musicales:: * Interfaces para el programador:: -* Construcción de funciones complejas:: * Interfaz de marcado para el programador:: * Contextos para programadores:: * Procedimientos de Scheme como propiedades:: @@ -462,411 +461,6 @@ propiedad @code{element} de @rinternals{RepeatedMusic}, y las alternativas en @code{elements}. -@node Construcción de funciones complejas -@section Construcción de funciones complejas -@translationof Building complicated functions - -Esta sección explica cómo reunir la información necesaria para crear -funciones musicales complejas. - - -@menu -* Presentación de expresiones musicales:: -* Propiedades de la música:: -* Doblar una nota con ligaduras (ejemplo):: -* Añadir articulación a las notas (ejemplo):: -@end menu - -@node Presentación de expresiones musicales -@subsection Presentación de expresiones musicales -@translationof Displaying music expressions - -@cindex interno, almacenamiento -@cindex mostrar expresiones musicales -@cindex interna, representación, mostrar - -@funindex \displayMusic - -Si se está escribiendo una función musical puede ser muy instructivo -examinar cómo se almacena internamente una expresión musical. Esto se -puede hacer con la función musical @code{\displayMusic}: - -@example -@{ - \displayMusic @{ c'4\f @} -@} -@end example - -@noindent -imprime lo siguiente: - -@example -(make-music - 'SequentialMusic - 'elements - (list (make-music - 'EventChord - 'elements - (list (make-music - 'NoteEvent - 'duration - (ly:make-duration 2 0 1 1) - 'pitch - (ly:make-pitch 0 0 0)) - (make-music - 'AbsoluteDynamicEvent - 'text - "f"))))) -@end example - -De forma predeterminada, LilyPond imprime estos mensajes en la consola -junto al resto de los mensajes. Para discernir entre estos mensajes y -guardar el resultado de @code{\display@{MATERIAL@}}, redirija la -salida hacia un archivo. - -@example -lilypond archivo.ly >resultado.txt -@end example - -Con la aplicación de un poco de formato, la información anterior es -fácil de leer: - -@example -(make-music 'SequentialMusic - 'elements (list (make-music 'EventChord - 'elements (list (make-music 'NoteEvent - 'duration (ly:make-duration 2 0 1 1) - 'pitch (ly:make-pitch 0 0 0)) - (make-music 'AbsoluteDynamicEvent - 'text "f"))))) -@end example - -Una secuencia musical @code{@{ ... @}} tiene el nombre -@code{SequentialMusic}, y sus expresiones internas se almacenan como -una lista en su propiedad @code{'elements}. Una nota se representa -como una expresión @code{EventChord} que contiene un objeto -@code{NoteEvent} (que almacena las propiedades de duración y altura) y -cualquier otra información adicional (en este caso, un evento -@code{AbsoluteDynamicEvent} con una propiedad de texto @code{"f"}. - - -@node Propiedades de la música -@subsection Propiedades de la música -@translationof Music properties - -El objeto @code{NoteEvent} es el primer objeto de la propiedad -@code{'elements} de @code{someNote}. - -@example -unaNota = c' -\displayMusic \unaNota -===> -(make-music - 'EventChord - 'elements - (list (make-music - 'NoteEvent - 'duration - (ly:make-duration 2 0 1 1) - 'pitch - (ly:make-pitch 0 0 0)))) -@end example - -La función @code{display-scheme-music} es la función utilizada por -@code{\displayMusic} para imprimir la representación de Scheme de una -expresión musical. - -@example -#(display-scheme-music (first (ly:music-property unaNota 'elements))) -===> -(make-music - 'NoteEvent - 'duration - (ly:make-duration 2 0 1 1) - 'pitch - (ly:make-pitch 0 0 0)) -@end example - -Después se accede a la altura de la nota a través de la propiedad -@code{'pitch} del objeto @code{NoteEvent}: - -@example -#(display-scheme-music - (ly:music-property (first (ly:music-property unaNota 'elements)) - 'pitch)) -===> -(ly:make-pitch 0 0 0) -@end example - -La altura de la nota se puede cambiar estableciendo el valor de esta -propiedad 'pitch: - -@funindex \displayLilyMusic - -@example -#(set! (ly:music-property (first (ly:music-property unaNota 'elements)) - 'pitch) - (ly:make-pitch 0 1 0)) ;; fijar la altura a d'. -\displayLilyMusic \unaNota -===> -d' -@end example - - -@node Doblar una nota con ligaduras (ejemplo) -@subsection Doblar una nota con ligaduras (ejemplo) -@translationof Doubling a note with slurs (example) - -Supongamos que queremos crear una función que traduce una entrada como -@code{a} a algo como @code{a( a)}. Empezamos examinando la -representación interna de la música con la que queremos terminar. - -@example -\displayMusic@{ a'( a') @} -===> -(make-music - 'SequentialMusic - 'elements - (list (make-music - 'EventChord - 'elements - (list (make-music - 'NoteEvent - 'duration - (ly:make-duration 2 0 1 1) - 'pitch - (ly:make-pitch 0 5 0)) - (make-music - 'SlurEvent - 'span-direction - -1))) - (make-music - 'EventChord - 'elements - (list (make-music - 'NoteEvent - 'duration - (ly:make-duration 2 0 1 1) - 'pitch - (ly:make-pitch 0 5 0)) - (make-music - 'SlurEvent - 'span-direction - 1))))) -@end example - -Las malas noticias son que las expresiones @code{SlurEvent} se deben -añadir @q{dentro} de la nota (o más concretamente, dentro de la -expresión @code{EventChord}). - -Ahora observamos la entrada: - -@example -(make-music - 'SequentialMusic - 'elements - (list (make-music - 'EventChord - 'elements - (list (make-music - 'NoteEvent - 'duration - (ly:make-duration 2 0 1 1) - 'pitch - (ly:make-pitch 0 5 0)))))) -@end example - -Así pues, en nuestra función, tenemos que clonar esta expresión (de -forma que tengamos dos notas para construir la secuencia), añadir -@code{SlurEvents} a la propiedad @code{'elements} de cada una de -ellas, y por último hacer una secuencia @code{SequentialMusic} con los -dos @code{EventChords}. - -@example -doubleSlur = #(define-music-function (parser location note) (ly:music?) - "Return: @{ note ( note ) @}. - `note' is supposed to be an EventChord." - (let ((note2 (ly:music-deep-copy note))) - (set! (ly:music-property note 'elements) - (cons (make-music 'SlurEvent 'span-direction -1) - (ly:music-property note 'elements))) - (set! (ly:music-property note2 'elements) - (cons (make-music 'SlurEvent 'span-direction 1) - (ly:music-property note2 'elements))) - (make-music 'SequentialMusic 'elements (list note note2)))) -@end example - - -@node Añadir articulación a las notas (ejemplo) -@subsection Añadir articulación a las notas (ejemplo) -@translationof 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 -@ref{Crear contextos}. Sin embargo, suponga que queremos escribir -una función musical que haga esto. - -Una @code{$variable} dentro de la notación @code{#@{...#@}} es como -usar una @code{\variable} normal en la notación clásica de LilyPond. -Sabemos que - -@example -@{ \musica -. -> @} -@end example - -@noindent -no funciona en LilyPond. Podemos evitar este problema adjuntando la -articulación a una nota de mentira, - -@example -@{ << \musica s1*0-.-> @} -@end example - -@noindent -pero a los efectos de este ejemplo, aprenderemos ahora cómo hacerlo en -Scheme. Comenzamos examinando nuestra entrada y la salida deseada: - -@example -% 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"))) -@end example - -Vemos que una nota (@code{c4}) se representa como una expresión -@code{EventChord}, con una expresión @code{NoteEvent} en su lista de -elementos. Para añadir una articulación marcato, se debe añadir una -expresión @code{ArticulationEvent} a la propiedad elementos de la -expresión @code{EventChord}. - -Para construir esta función, empezamos con - -@example -(define (add-marcato event-chord) - "Añadir una ArticulationEvent de marcato a los elementos de `event-chord', - que se supone 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)) -@end example - -La primera línea es la forma de definir una función en Scheme: el -nombre de la función es @code{add-marcato}, y tiene una variable -llamada @code{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!). - -@example -"Añadir una ArticulationEvent de marcato..." -@end example - -@noindent -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. - -@example -(let ((result-event-chord (ly:music-deep-copy event-chord))) -@end example - -@code{let} se usa para declarar variables locales. Aquí usamos una -variable local, llamada @code{result-event-chord}, a la que le damos -el valor @code{(ly:music-deep-copy event-chord)}. -@code{ly:music-deep-copy} es una función específica de LilyPond, como -todas las funciones que comienzan por @code{ly:}. Se usa para hacer -una copia de una expresión musical. Aquí, copiamos @code{event-chord} -(el parámetro de la función). Recuerde que el propósito es añadir un -marcato a una expresión @code{EventChord}. Es mejor no modificar el -@code{EventChord} que se dio como argumento, porque podría utilizarse -en algún otro lugar. - -Ahora tenemos un @code{result-event-chord}, que es una expresión -@code{NoteEventChord} y es una copia de @code{event-chord}. Añadimos -el marcato a su propiedad lista de elementos. - -@example -(set! lugar valor-nuevo) -@end example - -Aquí, lo que queremos establecer (el @q{lugar}) es la propiedad -@q{elements} de la expresión @code{result-event-chord}. - -@example -(ly:music-property result-event-chord 'elements) -@end example - -@code{ly:music-property} es la función que se usa para acceder a las -propiedades musicales (los @code{'elements}, @code{'duration}, -@code{'pitch}, etc., que vemos en la salida de @code{\displayMusic} -más arriba). El nuevo valor es la anterior propiedad elements, con un -elemento adicional: la expresión @code{ArticulationEvent}, que -copiamos a partir de la salida de @code{\displayMusic}, - -@example -(cons (make-music 'ArticulationEvent - 'articulation-type "marcato") - (ly:music-property result-event-chord 'elements)) -@end example - -@code{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 nueva expresión @code{ArticulationEvent}. El orden dentro de -la propiedad elements no es importante aquí. - -Finalmente, una vez añadida la articulación marcato a su propiedad -@code{elements}, podemos devolver @code{result-event-chord}, de aquí -la última línea de la función. - -Ahora transformamos la función @code{add-marcato} en una función -musical, - -@example -addMarcato = #(define-music-function (parser location event-chord) - (ly:music?) - "Añadir un ArticulationEvent de marcato a los elementos de `event-chord', - que se supone 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)) -@end example - -Podemos verificar que esta función musical funciona correctamente, - -@example -\displayMusic \addMarcato c4 -@end example - @node Interfaz de marcado para el programador @section Interfaz de marcado para el programador