1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*-
2 @c This file is part of extending.tely
4 Translation of GIT committish: e90fa9a8a1d71251a2c047e69798be05938a1241
6 When revising a translation, copy the HEAD committish of the
7 version that you are working on. See TRANSLATION for details.
12 @node Interfaces para programadores
13 @chapter Interfaces para programadores
14 @translationof Interfaces for programmers
16 Se pueden realizar trucos avanzados mediante el uso de Scheme. Si no
17 está familiarizado con Scheme, le conviene leer nuestro tutorial de
18 Scheme, @ref{Tutorial de Scheme}.
22 * Funciones musicales::
23 * Funciones de marcado::
24 * Contextos para programadores::
25 * Funciones de callback::
26 * Código de Scheme en línea::
30 @node Funciones musicales
31 @section Funciones musicales
32 @translationof Music functions
34 Las funciones musicales son funciones de Scheme que se utilizan para
35 crear automáticamente expresiones musicales. Se pueden usar para
36 simplificar enormemente el archivo de entrada.
39 * Sintaxis de las funciones musicales::
40 * Funciones de sustitución sencillas::
41 * Funciones de sustitución intermedias::
42 * Matemáticas dentro de las funciones::
44 * Funciones sin argumentos::
47 @node Sintaxis de las funciones musicales
48 @subsection Sintaxis de las funciones musicales
49 @translationof Music function syntax
51 La sintaxis general de una función musical es:
55 #(define-music-function (parser location @var{var_1} @var{var_2}...@var{var_n})
56 (@var{var_1-type?} @var{var_2-type?}...@var{var_n-type?})
57 @var{...expresión musical válida...})
63 @multitable @columnfractions .33 .66
64 @item @var{var_i} @tab @var{i}-ésima variable
65 @item @var{var_i-type?} @tab tipo de la @var{i}-ésima variable
66 @item @var{...expresión musical válida...} @tab expresión que devuelve
67 música válida, generalmente en la forma de una expresión de Scheme.
68 También hay una sintaxis especial que permite la existencia de código
69 de entrada de LilyPond dentro de esta expresión musical.
72 Los comprobadores de tipo de variable son procedimientos de Scheme que
73 devuelven @code{#t} si una variable es de un tipo dado. Se muestran
74 algunos tipos comunes en la tabla de abajo. Hay más tipos en los
75 archivos @file{lily/music-scheme.cc} y @file{scm/c++.scm}. La lista
76 completa de los comprobadores de tipo con nombre para LilyPond está en
77 la lista @var{type-p-name-alist} de @file{scm/lily.scm}.
79 @c TODO -- automatically document type-p-name-alist
81 @multitable @columnfractions .33 .66
82 @headitem Tipo de entrada @tab notación de @var{vari-type?}
83 @item Entero @tab @code{integer?}
84 @item Flotante (número decimal) @tab @code{number?}
85 @item Cadena de texto @tab @code{string?}
86 @item Marcado @tab @code{markup?}
87 @item Expresión musical @tab @code{ly:music?}
88 @item Pareja de variables @tab @code{pair?}
91 Los argumentos @code{parser} y @code{location} son obligatorios. El
92 argumento @code{parser} se usa en el cuerpo de la función para tener
93 acceso al valor de otra variable de LilyPond. El argumento
94 @code{location} se usa para establecer el @q{origen} de la expresión
95 musical que se construye por parte de la función musical, de forma que
96 en caso de un error de sintaxis LilyPond pueda comunicar al usuario el
97 lugar adecuado del archivo de entrada en que buscar.
100 @node Funciones de sustitución sencillas
101 @subsection Funciones de sustitución sencillas
102 @translationof Simple substitution functions
104 Una función de sustitución sencilla es una función musical cuya
105 expresión musical de salida está escrita en código de LilyPond, pero
106 con una variable de entrada sustituida en el código de LilyPond. La
107 forma general de estas funciones es:
111 #(define-music-function (parser location @var{var1})
114 @emph{... código de entrada de LilyPond con} @code{#$var1} @emph{para sustituir ...}
118 Observe que los caracteres especiales @code{#@{} y @code{#@}}
119 encierran la música de LilyPond.
121 @multitable @columnfractions .33 .66
122 @item @var{vari} @tab @var{i}-ésima variable
123 @item @var{vari-type?} @tab tipo de la @var{i}-ésima variable
124 @item @var{...música...} @tab código de entrada normal de LilyPond, que utiliza variables como @code{#$var1}, etc.
127 Por ejemplo, se puede definir una función que simplifique el
128 establecimiento de un relleno para un guión de texto TextScript:
130 @lilypond[quote,verbatim,ragged-right]
131 padText = #(define-music-function (parser location padding) (number?)
133 \once \override TextScript #'padding = #$padding
141 c4^"piu mosso" fis a g
145 Además de números, podemos usar expresiones musicales, como por
146 ejemplo notas, como argumentos de las funciones musicales:
148 @lilypond[quote,verbatim,ragged-right]
149 custosNote = #(define-music-function (parser location note)
152 \once \override Voice.NoteHead #'stencil =
153 #ly:text-interface::print
154 \once \override Voice.NoteHead #'text =
155 \markup \musicglyph #"custodes.mensural.u0"
156 \once \override Voice.Stem #'stencil = ##f
162 @node Funciones de sustitución intermedias
163 @subsection Funciones de sustitución intermedias
164 @translationof Intermediate substitution functions
166 Algo más complicadas que las funciones de sustitución sencillas, las
167 funciones de sustitución intermedias contienen una mezcla de código de
168 Scheme y de LilyPond dentro de la expresión musical que se devuelve.
170 Algunas instrucciones @code{\override} requieren un argumento que
171 consiste en una pareja de números (llamada una @code{célula cons} en
174 La pareja se puede pasar directamente dentro de la función musical,
175 usando una variable @code{pair?}:
180 #(define-music-function (parser location principio-final)
183 \once \override Beam #'positions = #$principio-final
187 \barraManual #'(3 . 6) c8 d e f
192 De forma alternativa, los números que componen la pareja se pueden
193 pasar como argumentos separados, y el código de Scheme que se ha usado
194 para crear la pareja se puede incluir dentro de la expresión musical:
196 @lilypond[quote,verbatim,ragged-right]
198 #(define-music-function (parser location beg end)
201 \once \override Beam #'positions = #(cons $beg $end)
205 \manualBeam #3 #6 c8 d e f
210 @node Matemáticas dentro de las funciones
211 @subsection Matemáticas dentro de las funciones
212 @translationof Mathematics in functions
214 Las funciones musicales pueden contar con programación de Scheme
215 además de la simple sustitución:
217 @lilypond[quote,verbatim,ragged-right]
218 AltOn = #(define-music-function (parser location mag) (number?)
219 #{ \override Stem #'length = #$(* 7.0 mag)
220 \override NoteHead #'font-size =
221 #$(inexact->exact (* (/ 6.0 (log 2.0)) (log mag))) #})
224 \revert Stem #'length
225 \revert NoteHead #'font-size
228 { c'2 \AltOn #0.5 c'4 c'
229 \AltOn #1.5 c' c' \AltOff c'2 }
233 Este ejemplo se puede reescribir de forma que pase expresiones
236 @lilypond[quote,verbatim,ragged-right]
237 withAlt = #(define-music-function (parser location mag music) (number? ly:music?)
238 #{ \override Stem #'length = #$(* 7.0 mag)
239 \override NoteHead #'font-size =
240 #$(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
242 \revert Stem #'length
243 \revert NoteHead #'font-size #})
245 { c'2 \withAlt #0.5 {c'4 c'}
246 \withAlt #1.5 {c' c'} c'2 }
250 @node Funciones vacías
251 @subsection Funciones vacías
252 @translationof Void functions
254 Una función musical debe devolver una expresión musical, pero a veces
255 podemos necesitar una función en la que no hay música en juego (como
256 la desactivación de la funcionalidad Apuntar y Pulsar). Para hacerlo,
257 devolvemos una expresión musical @code{void} (vacía).
259 Este es el motivo por el que la forma que se devuelve es
260 @code{(make-music ...)}. Con el valor de la propiedad @code{'void}
261 establecido a @code{#t}, le decimos al analizador que descarte la
262 expresión musical devuelta. así, la parte importante de la función
263 musical vacía es el proceso realizado por la función, no la expresión
264 musical que se devuelve.
268 #(define-music-function (parser location) ()
269 (ly:set-option 'point-and-click #f)
270 (make-music 'SequentialMusic 'void #t))
272 \noApuntarYPulsar % desactivar la funcionalidad Apuntar y Pulsar.
276 @node Funciones sin argumentos
277 @subsection Funciones sin argumentos
278 @translationof Functions without arguments
280 En casi todos los casos, una función sin argumentos se debe escribir
284 dolce = \markup@{ \italic \bold dolce @}
287 Sin embargo, en raras ocasiones puede ser de utilidad crear una
288 función musical sin argumentos:
291 mostrarNumeroDeCompas =
292 #(define-music-function (parser location) ()
293 (if (eq? #t (ly:get-option 'display-bar-numbers))
294 #@{ \once \override Score.BarNumber #'break-visibility = ##f #@}
298 Para la impresión real de los números de compás donde se llama a esta
299 función, invoque a @command{lilypond} con
302 lilypond -d display-bar-numbers ARCHIVO.ly
306 @node Funciones de marcado
307 @section Funciones de marcado
308 @translationof Markup functions
310 Los elementos de marcado están implementados como funciones de Scheme
311 especiales que producen un objeto @code{Stencil} dada una serie de
316 * Construcción de elementos de marcado en Scheme::
317 * Cómo funcionan internamente los elementos de marcado::
318 * Definición de una instrucción de marcado nueva::
319 * Definición de nuevas instrucciones de lista de marcado::
322 @node Construcción de elementos de marcado en Scheme
323 @subsection Construcción de elementos de marcado en Scheme
324 @translationof Markup construction in Scheme
326 @cindex marcado, definir instrucciones de
328 El macro @code{markup} construye expresiones de marcado en Scheme,
329 proporcionando una sintaxis similar a la de LilyPond. Por ejemplo:
332 (markup #:column (#:line (#:bold #:italic "hola" #:raise 0.4 "mundo")
333 #:larger #:line ("fulano" "fulanito" "menganito")))
339 \markup \column @{ \line @{ \bold \italic "hola" \raise #0.4 "mundo" @}
340 \larger \line @{ fulano fulanito menganito @} @}
344 Este ejemplo muestra las principales reglas de traducción entre la
345 sintaxis del marcado normal de LilyPond y la sintaxis del marcado de
349 @multitable @columnfractions .3 .3
350 @item @b{LilyPond} @tab @b{Scheme}
351 @item @code{\markup marcado1} @tab @code{(markup marcado1)}
352 @item @code{\markup @{ marcado1 marcado2 ... @}} @tab
353 @code{(markup marcado1 marcado2 ... )}
354 @item @code{\instruccion} @tab @code{#:instruccion}
355 @item @code{\variable} @tab @code{variable}
356 @item @code{\center-column @{ ... @}} @tab @code{#:center-column ( ... )}
357 @item @code{cadena} @tab @code{"cadena"}
358 @item @code{#argumento-de-scheme} @tab @code{argumento-de-scheme}
362 Todo el lenguaje Scheme está accesible dentro del macro @code{markup}.
363 Por ejemplo, podemos usar llamadas a funciones dentro de @code{markup}
364 para así manipular cadenas de caracteres. Esto es útil si se están
365 definiendo instrucciones de marcado nuevas (véase @ref{Definición de una instrucción de marcado nueva}).
370 El argumento markup-list de instrucciones como @code{#:line},
371 @code{#:center} y @code{#:column} no puede ser una variable ni el
372 resultado de la llamada a una función.
375 (markup #:line (funcion-que-devuelve-marcados))
379 no es válido. Hay que usar las funciones @code{make-line-markup},
380 @code{make-center-markup} o @code{make-column-markup} en su lugar:
383 (markup (make-line-markup (funcion-que-devuelve-marcados)))
387 @node Cómo funcionan internamente los elementos de marcado
388 @subsection Cómo funcionan internamente los elementos de marcado
389 @translationof How markups work internally
391 En un elemento de marcado como
394 \raise #0.5 "ejemplo de texto"
398 @code{\raise} se representa en realidad por medio de la función
399 @code{raise-markup}. La expresión de marcado se almacena como
402 (list raise-markup 0.5 (list simple-markup "ejemplo de texto"))
405 Cuando el marcado se convierte en objetos imprimibles (Stencils o
406 sellos), se llama la función @code{raise-markup} como
410 @var{\objeto de marcado}
411 @var{lista de listas asociativas de propiedades}
413 @var{el marcado "ejemplo de texto"})
416 Primero la función @code{raise-markup} crea el sello para la cadena
417 @code{ejemplo de texto}, y después eleva el sello Stencil en 0.5
418 espacios de pentagrama. Este es un ejemplo bastante simple; en el
419 resto de la sección podrán verse ejemplos más complejos, así como en
420 @file{scm/@/define@/-markup@/-commands@/.scm}.
423 @node Definición de una instrucción de marcado nueva
424 @subsection Definición de una instrucción de marcado nueva
425 @translationof New markup command definition
427 Esta sección trata sobre la definición de nuevas instrucciones de
432 * Sintaxis de la definición de instrucciones de marcado::
433 * Acerca de las propiedades::
434 * Un ejemplo completo::
435 * Adaptación de instrucciones incorporadas::
438 @node Sintaxis de la definición de instrucciones de marcado
439 @unnumberedsubsubsec Sintaxis de la definición de instrucciones de marcado
440 @translationof Markup command definition syntax
442 Se pueden definir instrucciones de marcado nuevas usando el macro de
443 Scheme @code{define-markup-command}, en el nivel sintáctico superior.
446 (define-markup-command (@var{nombre-de-la-instruccion} @var{layout} @var{props} @var{arg1} @var{arg2} ...)
447 (@var{tipo-de-arg1?} @var{tipo-de-arg2?} ...)
448 [ #:properties ((@var{propiedad1} @var{valor-predeterminado1})
456 @item nombre-de-la-instruccion
457 nombre de la instrucción de marcado
459 la definición de @q{layout} (disposición).
461 una lista de listas asociativas, que contienen todas las propiedades
464 argumento @var{i}-ésimo de la instrucción
466 predicado de tipo para el argumento @var{i}-ésimo
469 Si la instrucción utiliza propiedades de los argumentos @var{props},
470 se puede usar la palabra clave @code{#:properties} para especificar
471 qué propiedades se usan, y sus valores predeterminados.
474 Existen algunas restricciones sobre los argumentos posibles de una
475 instrucción de marcado.
477 Los argumentos se distinguen según su tipo:
479 @item un marcado, que corresponde al predicado de tipo @code{markup?};
480 @item una lista de marcados, que corresponde al predicado de tipo
482 @item cualquier otro objeto de Scheme, que corresponde a predicados de tipo como
483 @code{list?}, @code{number?}, @code{boolean?}, etc.
486 Actualmente las combinaciones de argumentos que hay disponibles
487 (después de los argumentos estándar @var{layout} y @var{props}) para
488 una instrucción de marcado definida con @code{define-markup-command}
489 se limitan a la siguiente lista:
492 @item (sin argumentos)
493 @itemx @var{markup-list}
495 @itemx @var{markup markup}
497 @itemx @var{scheme markup}
498 @itemx @var{scheme scheme}
499 @itemx @var{scheme scheme markup}
500 @itemx @var{scheme scheme markup markup}
501 @itemx @var{scheme markup markup}
502 @itemx @var{scheme scheme scheme}
506 Esto significa que no es posible definir con p.ej. tres argumentos de
507 Scheme y un argumento de marcado, como:
510 #(define-markup-command (fulanito layout props
511 num1 num2 lista marcado)
512 (number? number? list? markup?)
517 Si la aplicamos como, digamos,
520 \markup \fulanito #1 #2 #'(mengano zutano) Loquesea
523 @cindex firma de Scheme
524 @cindex Scheme, firma de
526 @command{lilypond} protesta diciendo que no puede analizar
527 @code{fulanito} debido a su firma de Scheme desconocida.
530 @node Acerca de las propiedades
531 @unnumberedsubsubsec Acerca de las propiedades
532 @translationof On properties
534 Los argumentos @code{layout} y @code{props} de las instrucciones de
535 marcado traen a escena un contexto para la interpretación del marcado:
536 tamaño de la tipografía, grueso de línea, etc.
538 El argumento @code{layout} permite el acceso a las propiedades
539 definidas en los bloques @code{paper}, usando la función
540 @code{ly:output-def-lookup}. Por ejemplo, el grueso de línea (el
541 mismo que el que se usa en las partituras) se lee usando:
544 (ly:output-def-lookup layout 'line-width)
547 El argumento @code{props} hace accesibles algunas propiedades a las
548 instrucciones de marcado. Por ejemplo, cuando se interpreta el
549 marcado del título de un libro, todas las variables definidas dentro
550 del bloque @code{\header} se añaden automáticamente a @code{props}, de
551 manera que el marcado del título del libro puede acceder al título del
552 libro, el autor, etc. También es una forma de configurar el
553 comportamiento de una instrucción de marcado: por ejemplo, cuando una
554 instrucción utiliza tamaños de tipografía durante el procesado, el
555 tamaño se lee de @code{props} en vez de tener un argumento
556 @code{font-size}. El que llama a una instrucción de marcado puede
557 cambiar el valor de la propiedad del tamaño de la tipografía con el
558 objeto de modificar el comportamiento. Utilice la palabra clave
559 @code{#:properties} de @code{define-markup-command} para especificar
560 qué propiedades se deben leer a partir de los argumentos de
563 El ejemplo de la sección siguiente ilustra cómo acceder y
564 sobreescribir las propiedades de una instrucción de marcado.
567 @node Un ejemplo completo
568 @unnumberedsubsubsec Un ejemplo completo
569 @translationof A complete example
571 El ejemplo siguiente define una instrucción de marcado para trazar un
572 rectángulo doble alrededor de un fragmento de texto.
574 En primer lugar, necesitamos construir un resultado aproximado
575 utilizando marcados. Una consulta a @ruser{Text markup commands} nos
576 muestra que es útil la instrucción @code{\box}:
578 @lilypond[quote,verbatim,ragged-right]
579 \markup \box \box HELLO
582 Ahora, consideramos que es preferible tener más separación entre el
583 texto y los rectángulos. Según la documentación de @code{\box}, esta
584 instrucción usa una propiedad @code{box-padding}, cuyo valor
585 predeterminado es 0.2. La documentación también menciona cómo
586 sobreescribir este valor:
588 @lilypond[quote,verbatim,ragged-right]
589 \markup \box \override #'(box-padding . 0.6) \box A
592 Después, el relleno o separación entre los dos rectángulos nos parece
593 muy pequeño, así que lo vamos a sobreescribir también:
595 @lilypond[quote,verbatim,ragged-right]
596 \markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box A
599 Repetir esta extensa instrucción de marcado una y otra vez sería un
600 quebradero de cabeza. Aquí es donde se necesita una instrucción de
601 marcado. Así pues, escribimos una instrucción de marcado
602 @code{double-box}, que toma un argumento (el texto). Dibuja los dos
603 rectángulos y añade una separación.
606 #(define-markup-command (double-box layout props text) (markup?)
607 "Trazar un rectángulo doble rodeando el texto."
608 (interpret-markup layout props
609 (markup #:override '(box-padding . 0.4) #:box
610 #:override '(box-padding . 0.6) #:box text)))
613 @code{text} es el nombre del argumento de la instrucción, y
614 @code{markup?} es el tipo: lo identifica como un elemento de marcado.
615 La función @code{interpret-markup} se usa en casi todas las
616 instrucciones de marcado: construye un sello, usando @code{layout},
617 @code{props}, y un elemento de marcado. Aquí, la marca se construye
618 usando el macro de Scheme @code{markup}, véase @ref{Construcción de
619 elementos de marcado en Scheme}. La transformación de una expresión
620 @code{\markup} en una expresión de marcado de Scheme es directa.
622 La instrucción nueva se puede usar como sigue:
625 \markup \double-box A
628 Sería buen hacer que la instrucción @code{double-box} fuera
629 personalizable: aquí, los valores de relleno @code{box-padding} son
630 fijos, y no se pueden cambiar por parte del usuario. Además, sería
631 mejor distinguir la separación entre los dos rectángulos, del relleno
632 entre el rectángulo interno y el texto. Así pues, introducimos una
633 nueva propiedad, @code{inter-box-padding}, para el relleno entre los
634 rectángulos. El @code{box-padding} se usará para el relleno interno.
635 Ahora el código nuevo es como se ve a continuación:
638 #(define-markup-command (double-box layout props text) (markup?)
639 #:properties ((inter-box-padding 0.4)
641 "Trazar un rectángulo doble rodeando el texto."
642 (interpret-markup layout props
643 (markup #:override `(box-padding . ,inter-box-padding) #:box
644 #:override `(box-padding . ,box-padding) #:box text)))
647 Aquí, la palabra clave @code{#:properties} se usa de manera que las
648 propiedades @code{inter-box-padding} y @code{box-padding} se leen a
649 partir del argumento @code{props}, y se les proporcionan unos valores
650 predeterminados si las propiedades no están definidas.
652 Después estos valores se usan para sobreescribir las propiedades
653 @code{box-padding} usadas por las dos instrucciones @code{\box}.
654 Observe el apóstrofo invertido y la coma en el argumento de
655 @code{\override}: nos permiten introducir un valor de variable dentro
656 de una expresión literal.
658 Ahora, la instrucción se puede usar dentro de un elemento de marcado,
659 y el relleno de los rectángulos se puede personalizar:
661 @lilypond[quote,verbatim,ragged-right]
662 #(define-markup-command (double-box layout props text) (markup?)
663 #:properties ((inter-box-padding 0.4)
665 "Draw a double box around text."
666 (interpret-markup layout props
667 (markup #:override `(box-padding . ,inter-box-padding) #:box
668 #:override `(box-padding . ,box-padding) #:box text)))
670 \markup \double-box A
671 \markup \override #'(inter-box-padding . 0.8) \double-box A
672 \markup \override #'(box-padding . 1.0) \double-box A
676 @node Adaptación de instrucciones incorporadas
677 @unnumberedsubsubsec Adaptación de instrucciones incorporadas
678 @translationof Adapting builtin commands
680 Una buena manera de comenzar a escribir una instrucción de marcado
681 nueva, es seguir el ejemplo de otra instrucción ya incorporada. Casi
682 todas las instrucciones de marcado que están incorporadas en LilyPond
683 se pueden encontrar en el archivo
684 @file{scm/@/define@/-markup@/-commands@/.scm}.
686 Por ejemplo, querríamos adaptar la instrucción @code{\draw-line}, para
687 que trace una línea doble. La instrucción @code{\draw-line} está
688 definida como sigue (se han suprimido los comentarios de
692 (define-markup-command (draw-line layout props dest)
695 #:properties ((thickness 1))
696 "...documentación..."
697 (let ((th (* (ly:output-def-lookup layout 'line-thickness)
701 (make-line-stencil th 0 0 x y)))
704 Para definir una instrucción nueva basada en otra existente, copie la
705 definición y cámbiele el nombre. La palabra clave @code{#:category}
706 se puede eliminar sin miedo, pues sólo se utiliza para generar
707 documentación de LilyPond, y no tiene ninguna utilidad para las
708 instrucciones de marcado definidas por el usuario.
711 (define-markup-command (draw-double-line layout props dest)
713 #:properties ((thickness 1))
714 "...documentación..."
715 (let ((th (* (ly:output-def-lookup layout 'line-thickness)
719 (make-line-stencil th 0 0 x y)))
722 A continuación se añade una propiedad para establecer la separación
723 entre las dos líneas, llamada @code{line-gap}, con un valor
724 predeterminado de p.ej. 0.6:
727 (define-markup-command (draw-double-line layout props dest)
729 #:properties ((thickness 1)
731 "...documentación..."
735 Finalmente, se añade el código para trazar las dos líneas. Se usan
736 dos llamadas a @code{make-line-stencil} para trazar las líneas, y los
737 sellos resultantes se combinan usando @code{ly:stencil-add}:
739 @lilypond[quote,verbatim,ragged-right]
740 #(define-markup-command (my-draw-line layout props dest)
742 #:properties ((thickness 1)
745 (let* ((th (* (ly:output-def-lookup layout 'line-thickness)
750 (x (cond ((= dx 0) w)
752 (else (/ w (sqrt (+ 1 (* (/ dx dy) (/ dx dy))))))))
753 (y (* (if (< (* dx dy) 0) 1 -1)
756 (else (/ w (sqrt (+ 1 (* (/ dy dx) (/ dy dx))))))))))
757 (ly:stencil-add (make-line-stencil th x y (+ dx x) (+ dy y))
758 (make-line-stencil th (- x) (- y) (- dx x) (- dy y)))))
760 \markup \my-draw-line #'(4 . 3)
761 \markup \override #'(line-gap . 1.2) \my-draw-line #'(4 . 3)
765 @node Definición de nuevas instrucciones de lista de marcado
766 @subsection Definición de nuevas instrucciones de lista de marcado
767 @translationof New markup list command definition
769 Las instrucciones de listas de marcado se definen con el macro de
770 Scheme @code{define-markup-list-command}, que es similar al macro
771 @code{define-markup-command} descrito en @ref{Definición de una
772 instrucción de marcado nueva}, excepto que donde éste devuelve un
773 sello único, aquél devuelve una lista de sellos.
775 En el siguiente ejemplo se define una instrucción de lista de marcado
776 @code{\paragraph}, que devuelve una lista de líneas justificadas,
777 estando la primera de ellas sangrada. La anchura del sangrado se toma
778 del argumento @code{props}.
781 #(define-markup-list-command (paragraph layout props args) (markup-list?)
782 #:properties ((par-indent 2))
783 (interpret-markup-list layout props
784 (make-justified-lines-markup-list (cons (make-hspace-markup par-indent)
788 Aparte de los argumentos usuales @code{layout} y @code{props}, la
789 instrucción de lista de marcados @code{paragraph} toma un argumento de
790 lista de marcados, llamado @code{args}. El predicado para listas de
791 marcados es @code{markup-list?}.
793 En primer lugar, la función toma el ancho del sangrado, una propiedad
794 llamada aquí @code{par-indent}, de la lista de propiedades
795 @code{props}. Si no se encuentra la propiedad, el valor
796 predeterminado es @code{2}. Después, se hace una lista de líneas
797 justificadas usando la función
798 @code{make-justified-lines-markup-list}, que está relacionada con la
799 instrucción incorporada de lista de marcados @code{\justified-lines}.
800 Se añade un espacio horizontal al principio usando la función
801 @code{make-hspace-markup}. Finalmente, la lista de marcados se
802 interpreta usando la función @code{interpret-markup-list}.
804 Esta nueva instrucción de lista de marcados se puede usar como sigue:
809 El arte de la tipografía musical se llama \italic @{grabado (en plancha).@}
810 El término deriva del proceso tradicional de impresión de música.
811 hace sólo algunas décadas, las partituras se hacían cortando y estampando
812 la música en una plancha de zinc o lata en una imagen invertida.
814 \override-lines #'(par-indent . 4) \paragraph @{
815 La plancha se tenía que entintar, y las depresiones causadas por los cortes
816 y estampados retienen la tinta. Se formaba una imagen presionando el papel
817 contra la plancha. El estampado y cortado se hacía completamente
824 @node Contextos para programadores
825 @section Contextos para programadores
826 @translationof Contexts for programmers
829 * Evaluación de contextos::
830 * Ejecutar una función sobre todos los objetos de la presentación::
833 @node Evaluación de contextos
834 @subsection Evaluación de contextos
835 @translationof Context evaluation
837 @cindex código, llamadas durante la interpretación
838 @funindex \applyContext
840 Se pueden modificar los contextos durante la interpretación con código
841 de Scheme. La sintaxis para esto es
844 \applyContext @var{función}
847 @var{función} debe ser una función de Scheme que toma un único
848 argumento, que es el contexto al que aplicarla. El código siguiente
849 imprime el número del compás actual sobre la salida estándar durante
855 (format #t "\nSe nos ha llamado en el compás número ~a.\n"
856 (ly:context-property x 'currentBarNumber)))
860 @node Ejecutar una función sobre todos los objetos de la presentación
861 @subsection Ejecutar una función sobre todos los objetos de la presentación
862 @translationof Running a function on all layout objects
864 @cindex código, llamar sobre objetos de presentación
865 @funindex \applyOutput
868 La manera más versátil de realizar el ajuste fino de un objeto es
869 @code{\applyOutput}. Su sintaxis es
872 \applyOutput @var{contexto} @var{proc}
876 donde @var{proc} es una función de Scheme, que toma tres argumentos.
878 Al interpretarse, la función @var{proc} se llama para cada objeto de
879 presentación que se encuentra en el contexto @var{contexto}, con los
880 siguientes argumentos:
883 @item el propio objeto de presentación,
884 @item el contexto en que se creó el objeto de presentación, y
885 @item el contexto en que se procesa @code{\applyOutput}.
889 Además, la causa del objeto de presentación, es decir el objeto o
890 expresión musical que es responsable de haberlo creado, está en la
891 propiedad @code{cause} del objeto. Por ejemplo, para la cabeza de una
892 nota, éste es un evento @rinternals{NoteHead}, y para un objeto
893 @rinternals{Stem} (plica), éste es un objeto @rinternals{Stem}.
894 @c Impossible - changed to Stem --FV
896 He aquí una función que usar para @code{\applyOutput}; borra las
897 cabezas de las notas que están sobre la línea central:
899 @lilypond[quote,verbatim,ragged-right]
900 #(define (blanker grob grob-origin context)
901 (if (and (memq 'note-head-interface (ly:grob-interfaces grob))
902 (eq? (ly:grob-property grob 'staff-position) 0))
903 (set! (ly:grob-property grob 'transparent) #t)))
906 e4 g8 \applyOutput #'Voice #blanker b d2
911 @node Funciones de callback
912 @section Funciones de callback
913 @translationof Callback functions
915 Las propiedades (como @code{thickness} (grosor), @code{direction}
916 (dirección), etc.) se pueden establecer a valores fijos con \override,
920 \override Stem #'thickness = #2.0
923 Las propiedades pueden fijarse también a un procedimiento de scheme,
925 @lilypond[fragment,verbatim,quote,relative=2]
926 \override Stem #'thickness = #(lambda (grob)
927 (if (= UP (ly:grob-property grob 'direction))
934 En este caso, el procedimiento se ejecuta tan pronto como el valor de
935 la propiedad se reclama durante el proceso de formateo.
937 Casi todo el motor de tipografiado está manejado por estos
938 @emph{callbacks}. Entre las propiedades que usan normalmente
939 @emph{callbacks} están
943 La rutina de impresión, que construye un dibujo para el símbolo
945 La rutina que establece la posición horizontal
947 La rutina que calcula la anchura de un objeto
950 El procedimiento siempre toma un argumento único, que es el grob (el
953 Si se deben llamar rutinas con varios argumentos, el grob actual se
954 puede insertar con una cerradura de grob. He aquí un ajuste
955 procedente de @code{AccidentalSuggestion},
959 ,(ly:make-simple-closure
961 ,(ly:make-simple-closure
962 (list ly:self-alignment-interface::centered-on-x-parent))
963 ,(ly:make-simple-closure
964 (list ly:self-alignment-interface::x-aligned-on-self)))))
968 En este ejemplo, tanto
969 @code{ly:self-alignment-interface::x-aligned-on-self} como
970 @code{ly:self-alignment-interface::centered-on-x-parent} se llaman con
971 el grob como argumento. El resultado se añade con la función
972 @code{+}. Para asegurar que esta adición se ejecuta adecuadamente,
973 todo ello se encierra dentro de @code{ly:make-simple-closure}.
975 De hecho, usar un solo procedimiento como valor de una propiedad
979 (ly:make-simple-closure (ly:make-simple-closure (list @var{proc})))
983 El @code{ly:make-simple-closure} interior aporta el grob como
984 argumento de @var{proc}, el exterior asegura que el resultado de la
985 función es lo que se devuelve, en lugar del objeto
986 @code{simple-closure}.
988 Desde dentro de un callback, el método más fácil para evaluar un
989 elemento de marcado es usar grob-interpret-markup. Por ejemplo:
992 mi-callback = #(lambda (grob)
993 (grob-interpret-markup grob (markup "fulanito")))
997 @node Código de Scheme en línea
998 @section Código de Scheme en línea
999 @translationof Inline Scheme code
1001 La principal desventaja de @code{\tweak} es su inflexibilidad
1002 sintáctica. Por ejemplo, lo siguiente produce un error de sintaxis.
1005 F = \tweak #'font-size #-3 -\flageolet
1013 En otras palabras, @code{\tweak} no se comporta como una articulación
1014 en cuando a la sintaxis; concretamente, no se puede adjuntar con
1015 @code{^} y @code{_}.
1017 Usando Scheme, se puede dar un rodeo a este problema. La ruta hacia
1018 el resultado se da en @ref{Añadir articulaciones a las notas
1019 (ejemplo)}, especialmente cómo usar @code{\displayMusic} como guía de
1023 F = #(let ((m (make-music 'ArticulationEvent
1024 'articulation-type "flageolet")))
1025 (set! (ly:music-property m 'tweaks)
1026 (acons 'font-size -3
1027 (ly:music-property m 'tweaks)))
1036 Aquí, las propiedades @code{tweaks} del objeto flageolet @code{m}
1037 (creado con @code{make-music}) se extraen con
1038 @code{ly:music-property}, se antepone un nuevo par clave-valor para
1039 cambiar el tamaño de la tipografía a la lista de propiedades con la
1040 función de Scheme @code{acons}, y finalmente el resultado se escribe
1041 de nuevo con @code{set!}. El último elemento del bloque @code{let} es
1042 el valor de retorno, el propio @code{m}.
1045 @node Trucos difíciles
1046 @section Trucos difíciles
1047 @translationof Difficult tweaks
1049 Hay un cierto número de tipos de ajustes difíciles.
1055 Un tipo de ajuste difícil es la apariencia de los objetos de
1056 extensión, como las ligaduras de expresión y de unión. Inicialmente,
1057 sólo se crea uno de estos objetos, y pueden ajustarse con el mecanismo
1058 normal. Sin embargo, en ciertos casos los objetos extensores cruzan
1059 los saltos de línea. Si esto ocurre, estos objetos se clonan. Se
1060 crea un objeto distinto por cada sistema en que se encuentra. Éstos
1061 son clones del objeto original y heredan todas sus propiedades,
1062 incluidos los @code{\override}s.
1064 En otras palabras, un @code{\override} siempre afecta a todas las
1065 piezas de un objeto de extensión fragmentado. Para cambiar sólo una
1066 parte de un extensor en el salto de línea, es necesario inmiscuirse en
1067 el proceso de formateado. El @emph{callback}
1068 @code{after-line-breaking} contiene el procedimiento Scheme que se
1069 llama después de que se han determinado los saltos de línea, y los
1070 objetos de presentación han sido divididos sobre los distintos
1073 En el ejemplo siguiente, definimos un procedimiento
1074 @code{my-callback}. Este procedimiento
1078 determina si hemos sido divididos por los saltos de línea
1080 en caso afirmativo, reúne todos los objetos divididos
1082 comprueba si somos el último de los objetos divididos
1084 en caso afirmativo, establece @code{extra-offset}.
1087 Este procedimiento se instala en @rinternals{Tie} (ligadura de unión),
1088 de forma que la última parte de la ligadura dividida se traslada hacia
1091 @lilypond[quote,verbatim,ragged-right]
1092 #(define (my-callback grob)
1094 ; have we been split?
1095 (orig (ly:grob-original grob))
1097 ; if yes, get the split pieces (our siblings)
1098 (siblings (if (ly:grob? orig)
1099 (ly:spanner-broken-into orig) '() )))
1101 (if (and (>= (length siblings) 2)
1102 (eq? (car (last-pair siblings)) grob))
1103 (ly:grob-set-property! grob 'extra-offset '(-2 . 5)))))
1106 \override Tie #'after-line-breaking =
1113 Al aplicar este truco, la nueva función de callback
1114 @code{after-line-breaking} también debe llamar a la antigua
1115 @code{after-line-breaking}, si existe. Por ejemplo, si se usa con
1116 @code{Hairpin}, se debe llamar también a
1117 @code{ly:hairpin::after-line-breaking}.
1120 @item Algunos objetos no se pueden cambiar con @code{\override} por
1121 razones técnicas. Son ejemplos @code{NonMusicalPaperColumn} y
1122 @code{PaperColumn}. Se pueden cambiar con la función
1123 @code{\overrideProperty} que funciona de forma similar a @code{\once
1124 \override}, pero usa una sintaxis distinta.
1128 #"Score.NonMusicalPaperColumn" % Nombre del grob
1129 #'line-break-system-details % Nombre de la propiedad
1130 #'((next-padding . 20)) % Valor
1133 Observe, sin embargo, que @code{\override}, aplicado a
1134 @code{NonMusicalPaperColumn} y a @code{PaperColumn}, aún funciona
1135 como se espera dentro de los bloques @code{\context}.
1140 @node Interfaces de Scheme de LilyPond
1141 @chapter Interfaces de Scheme de LilyPond
1142 @translationof LilyPond Scheme interfaces
1144 Este capítulo cubre las diversas herramientas proporcionadas por
1145 LilyPond como ayuda a los programadores de Scheme a extraer e
1146 introducir información de los flujos musicales.
1148 HACER @c TODO -- figure out what goes in here and how to organize it