Remove unused prototype in score.hh.
[lilypond/mpolesky.git] / Documentation / es / extending / programming-interface.itely
blob93482786058358420ae7fbdc54f61afcef69e7c2
1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*-
2 @c This file is part of extending.tely
3 @ignore
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.
8 @end ignore
10 @c \version "2.12.0"
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}.
21 @menu
22 * Funciones musicales::
23 * Funciones de marcado::
24 * Contextos para programadores::
25 * Funciones de callback::
26 * Código de Scheme en línea::
27 * Trucos difíciles::
28 @end menu
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.
38 @menu
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::
43 * Funciones vacías::
44 * Funciones sin argumentos::
45 @end menu
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:
53 @example
54 miFuncion =
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...})
58 @end example
60 @noindent
61 donde
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.
70 @end multitable
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?}
89 @end multitable
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:
109 @example
110 miFuncion =
111 #(define-music-function (parser location @var{var1})
112                         (@var{var1-type?})
113   #@{
114     @emph{... código de entrada de LilyPond con} @code{#$var1} @emph{para sustituir ...}
115   #@})
116 @end example
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.
125 @end multitable
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?)
132   #{
133     \once \override TextScript #'padding = #$padding
134   #})
136 \relative c''' {
137   c4^"piu mosso" b a b
138   \padText #1.8
139   c4^"piu mosso" d e f
140   \padText #2.6
141   c4^"piu mosso" fis a g
143 @end lilypond
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)
150                                      (ly:music?)
151   #{
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
157     $note
158   #})
159 @end lilypond
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
172 Scheme).
174 La pareja se puede pasar directamente dentro de la función musical,
175 usando una variable @code{pair?}:
177 @quotation
178 @example
179 barraManual =
180 #(define-music-function (parser location principio-final)
181                         (pair?)
183   \once \override Beam #'positions = #$principio-final
184 #@})
186 \relative @{
187   \barraManual #'(3 . 6) c8 d e f
189 @end example
190 @end quotation
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]
197 manualBeam =
198 #(define-music-function (parser location beg end)
199                         (number? number?)
201   \once \override Beam #'positions = #(cons $beg $end)
204 \relative {
205   \manualBeam #3 #6 c8 d e f
207 @end lilypond
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))) #})
223 AltOff = {
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 }
230 @end lilypond
232 @noindent
233 Este ejemplo se puede reescribir de forma que pase expresiones
234 musicales:
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)))
241      $music
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 }
247 @end lilypond
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.
266 @example
267 noApuntarYPulsar =
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.
273 @end example
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
281 con una variable:
283 @example
284 dolce = \markup@{ \italic \bold dolce @}
285 @end example
287 Sin embargo, en raras ocasiones puede ser de utilidad crear una
288 función musical sin argumentos:
290 @example
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 #@}
295        #@{#@}))
296 @end example
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
301 @example
302 lilypond -d display-bar-numbers ARCHIVO.ly
303 @end example
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
312 argumentos.
315 @menu
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::
320 @end menu
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:
331 @example
332 (markup #:column (#:line (#:bold #:italic "hola" #:raise 0.4 "mundo")
333                   #:larger #:line ("fulano" "fulanito" "menganito")))
334 @end example
336 @noindent
337 equivale a:
338 @example
339 \markup \column @{ \line @{ \bold \italic "hola" \raise #0.4 "mundo" @}
340                   \larger \line @{ fulano fulanito menganito @} @}
341 @end example
343 @noindent
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
346 Scheme.
348 @quotation
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}
359 @end multitable
360 @end quotation
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}).
368 @knownissues
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.
374 @lisp
375 (markup #:line (funcion-que-devuelve-marcados))
376 @end lisp
378 @noindent
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:
382 @lisp
383 (markup (make-line-markup (funcion-que-devuelve-marcados)))
384 @end lisp
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
393 @example
394 \raise #0.5 "ejemplo de texto"
395 @end example
397 @noindent
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
401 @example
402 (list raise-markup 0.5 (list simple-markup "ejemplo de texto"))
403 @end example
405 Cuando el marcado se convierte en objetos imprimibles (Stencils o
406 sellos), se llama la función @code{raise-markup} como
408 @example
409 (apply raise-markup
410        @var{\objeto de marcado}
411        @var{lista de listas asociativas de propiedades}
412        0.5
413        @var{el marcado "ejemplo de texto"})
414 @end example
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
428 marcado.
431 @menu
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::
436 @end menu
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.
445 @lisp
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})
449                     ...) ]
450   ..command body..)
451 @end lisp
453 Los argumentos son
455 @table @var
456 @item nombre-de-la-instruccion
457 nombre de la instrucción de marcado
458 @item layout
459 la definición de @q{layout} (disposición).
460 @item props
461 una lista de listas asociativas, que contienen todas las propiedades
462 activas.
463 @item argi
464 argumento @var{i}-ésimo de la instrucción
465 @item tipo-de-argi?
466 predicado de tipo para el argumento @var{i}-ésimo
467 @end table
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.
473 @knownissues
474 Existen algunas restricciones sobre los argumentos posibles de una
475 instrucción de marcado.
477 Los argumentos se distinguen según su tipo:
478 @itemize
479 @item un marcado, que corresponde al predicado de tipo @code{markup?};
480 @item una lista de marcados, que corresponde al predicado de tipo
481 @code{markup-list?};
482 @item cualquier otro objeto de Scheme, que corresponde a predicados de tipo como
483 @code{list?}, @code{number?}, @code{boolean?}, etc.
484 @end itemize
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:
491 @table @asis
492 @item (sin argumentos)
493 @itemx @var{markup-list}
494 @itemx @var{markup}
495 @itemx @var{markup markup}
496 @itemx @var{scheme}
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}
503 @end table
505 @noindent
506 Esto significa que no es posible definir con p.ej. tres argumentos de
507 Scheme y un argumento de marcado, como:
509 @example
510 #(define-markup-command (fulanito layout props
511                          num1    num2    lista  marcado)
512                         (number? number? list?  markup?)
513   ...)
514 @end example
516 @noindent
517 Si la aplicamos como, digamos,
519 @example
520 \markup \fulanito #1 #2 #'(mengano zutano) Loquesea
521 @end example
523 @cindex firma de Scheme
524 @cindex Scheme, firma de
525 @noindent
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:
543 @example
544 (ly:output-def-lookup layout 'line-width)
545 @end example
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
561 @code{props}.
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
580 @end lilypond
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
590 @end lilypond
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
597 @end lilypond
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.
605 @lisp
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)))
611 @end lisp
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:
624 @example
625 \markup \double-box A
626 @end example
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:
637 @lisp
638 #(define-markup-command (double-box layout props text) (markup?)
639   #:properties ((inter-box-padding 0.4)
640                 (box-padding 0.6))
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)))
645 @end lisp
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)
664                 (box-padding 0.6))
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
673 @end lilypond
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
689 documentación):
691 @lisp
692 (define-markup-command (draw-line layout props dest)
693   (number-pair?)
694   #:category graphic
695   #:properties ((thickness 1))
696   "...documentación..."
697   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
698                thickness))
699         (x (car dest))
700         (y (cdr dest)))
701     (make-line-stencil th 0 0 x y)))
702 @end lisp
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.
710 @lisp
711 (define-markup-command (draw-double-line layout props dest)
712   (number-pair?)
713   #:properties ((thickness 1))
714   "...documentación..."
715   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
716                thickness))
717         (x (car dest))
718         (y (cdr dest)))
719     (make-line-stencil th 0 0 x y)))
720 @end lisp
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:
726 @lisp
727 (define-markup-command (draw-double-line layout props dest)
728   (number-pair?)
729   #:properties ((thickness 1)
730                 (line-gap 0.6))
731   "...documentación..."
732   ...
733 @end lisp
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)
741   (number-pair?)
742   #:properties ((thickness 1)
743                 (line-gap 0.6))
744   "..documentation.."
745   (let* ((th (* (ly:output-def-lookup layout 'line-thickness)
746                 thickness))
747          (dx (car dest))
748          (dy (cdr dest))
749          (w (/ line-gap 2.0))
750          (x (cond ((= dx 0) w)
751                   ((= dy 0) 0)
752                   (else (/ w (sqrt (+ 1 (* (/ dx dy) (/ dx dy))))))))
753          (y (* (if (< (* dx dy) 0) 1 -1)
754                (cond ((= dy 0) w)
755                      ((= dx 0) 0)
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)
762 @end lilypond
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}.
780 @example
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)
785                                              args))))
786 @end example
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:
806 @example
807 \markuplines @{
808   \paragraph @{
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.
813   @}
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
818     a mano.
819   @}
821 @end example
824 @node Contextos para programadores
825 @section Contextos para programadores
826 @translationof Contexts for programmers
828 @menu
829 * Evaluación de contextos::
830 * Ejecutar una función sobre todos los objetos de la presentación::
831 @end menu
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
843 @example
844 \applyContext @var{función}
845 @end example
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
850 la compilación:
852 @example
853 \applyContext
854   #(lambda (x)
855     (format #t "\nSe nos ha llamado en el compás número ~a.\n"
856      (ly:context-property x 'currentBarNumber)))
857 @end example
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
871 @example
872 \applyOutput @var{contexto} @var{proc}
873 @end example
875 @noindent
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:
882 @itemize
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}.
886 @end itemize
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)))
905 \relative {
906   e4 g8 \applyOutput #'Voice #blanker b d2
908 @end lilypond
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,
917 p. ej.:
919 @example
920 \override Stem #'thickness = #2.0
921 @end example
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))
928         2.0
929         7.0))
930 c b a g b a g b
931 @end lilypond
933 @noindent
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
941 @table @code
942 @item stencil
943   La rutina de impresión, que construye un dibujo para el símbolo
944 @item X-offset
945   La rutina que establece la posición horizontal
946 @item X-extent
947   La rutina que calcula la anchura de un objeto
948 @end table
950 El procedimiento siempre toma un argumento único, que es el grob (el
951 objeto gráfico).
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},
957 @example
958 `(X-offset .
959   ,(ly:make-simple-closure
960     `(,+
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)))))
965 @end example
967 @noindent
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
976 equivale a
978 @example
979 (ly:make-simple-closure (ly:make-simple-closure (list @var{proc})))
980 @end example
982 @noindent
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:
991 @example
992 mi-callback = #(lambda (grob)
993                  (grob-interpret-markup grob (markup "fulanito")))
994 @end example
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.
1004 @example
1005 F = \tweak #'font-size #-3 -\flageolet
1007 \relative c'' @{
1008   c4^\F c4_\F
1010 @end example
1012 @noindent
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
1020 ayuda.
1022 @example
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)))
1028        m)
1030 \relative c'' @{
1031   c4^\F c4_\F
1033 @end example
1035 @noindent
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.
1051 @itemize
1054 @item
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
1071 sistemas.
1073 En el ejemplo siguiente, definimos un procedimiento
1074 @code{my-callback}.  Este procedimiento
1076 @itemize
1077 @item
1078 determina si hemos sido divididos por los saltos de línea
1079 @item
1080 en caso afirmativo, reúne todos los objetos divididos
1081 @item
1082 comprueba si somos el último de los objetos divididos
1083 @item
1084 en caso afirmativo, establece @code{extra-offset}.
1085 @end itemize
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
1089 arriba.
1091 @lilypond[quote,verbatim,ragged-right]
1092 #(define (my-callback grob)
1093   (let* (
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)))))
1105 \relative c'' {
1106   \override Tie #'after-line-breaking =
1107   #my-callback
1108   c1 ~ \break c2 ~ c
1110 @end lilypond
1112 @noindent
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.
1126 @example
1127 \overrideProperty
1128 #"Score.NonMusicalPaperColumn"  % Nombre del grob
1129 #'line-break-system-details     % Nombre de la propiedad
1130 #'((next-padding . 20))         % Valor
1131 @end example
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}.
1137 @end itemize
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