X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Documentation%2Fes%2Fuser%2Ftweaks.itely;h=e63aa37eafa4789b54f414aeea643931738d7dd9;hb=edf17353d89f4f6bd831466262402bb9151a26ca;hp=609dbf8a41ab7083248f819515cbaf8bbc75f360;hpb=ceec27ef6c843705a76ac7b66cb20b7ad096cf29;p=lilypond.git diff --git a/Documentation/es/user/tweaks.itely b/Documentation/es/user/tweaks.itely index 609dbf8a41..e63aa37eaf 100644 --- a/Documentation/es/user/tweaks.itely +++ b/Documentation/es/user/tweaks.itely @@ -1,12 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; -*- @c This file is part of lilypond.tely @ignore - Translation of GIT committish: a78148743803f342e4701dc09608962ccfcb759e + Translation of GIT committish: 23542761090f167ad42dbff7ef11d44a9c1374ac When revising a translation, copy the HEAD committish of the version that you are working on. See TRANSLATION for details. @end ignore +@c \version "2.11.51" + @node Tweaking output @chapter Tweaking output @@ -14,217 +16,2294 @@ Este capítulo trata de cómo modificar la salida. LilyPond es extremadamente configurable; prácticamente todos los fragmentos de la salida se pueden cambiar. -@menu -* Moving objects:: -* Fixing overlapping notation:: -* Common tweaks:: -* Default files:: -* Fitting music onto fewer pages:: -* Advanced tweaks with Scheme:: -* Avoiding tweaks with slower processing:: -@end menu +@menu +* Tweaking basics:: +* The Internals Reference manual:: +* Appearance of objects:: +* Placement of objects:: +* Collisions of objects:: +* Further tweaking:: +@end menu + +@node Tweaking basics +@section Tweaking basics + +@menu +* Introduction to tweaks:: +* Objects and interfaces:: +* Naming conventions of objects and properties:: +* Tweaking methods:: +@end menu + +@node Introduction to tweaks +@subsection Introduction to tweaks + +El @q{Trucaje} es un término de LilyPond que denota los diversos +métodos que el usuario tiene a su disposición para modificar el +proceso de interpretación del archivo de entrada y cambiar la +apariencia de la salida impresa. Algunos trucos son muy fáciles de +usar; otros son más complejos. Pero en su conjunto, los métodos de +trucaje disponibles posibilitan conseguir casi cualquier apariencia +que deseemos en la música impresa. + +En esta sección vamos a estudiar los conceptos básicos que se +necesitan para comprender el trucaje. Más tarde daremos un amplio +abanico de instrucciones listas para usar, que podrá simplemente +copiar para obtener el mismo efecto en sus partituras, y al mismo +tiempo mostraremos la forma de construir dichas instrucciones para que +pueda aprender cómo desarrollar sus propios trucos. + +Antes de comenzar con este capítulo, quizá quiera echar un vistazo a +la sección @ref{Contexts and engravers}, pues los Contextos, los +Grabadores y las Propiedades que se contienen en ellos son +fundamentales para comprender y construir los trucos. + +@node Objects and interfaces +@subsection Objects and interfaces + +@cindex objetos +@cindex grobs +@cindex selectores +@cindex interfaces + +El trucaje consiste en modificar el funcionamiento y estructura +interna del programa LilyPond, por lo que en primer lugar +introduciremos algunos términos que se usan para describir dichas +operaciones y estructuras internas. + +El término @q{Objeto} es un término genérico que se usa para referirse +a la multitud de estructuras internas que LilyPond construye durante +el procesado de un archivo de entrada. Así, cuando se encuentra una +instrucción como @code{\new Staff}, se construye un objeto nuevo del +tipo @code{Staff}. Entonces, este objeto @code{Staff} contiene todas +las propiedades asociadas con ese pentagrama en particular, por +ejemplo, su nombre y su armadura, además de otros detalles de los +grabadores que se han asignado para que operen dentro del contexto del +pentagrama. De forma similar, hay objetos que guardan las propiedades +de todos los demás contextos, como objetos de @code{Voice}, objetos de +@code{Score}, objetos de @code{Lyrics}, así como objetos que +representan todos los elementos notacionales como líneas divisorias, +cabezas de las notas, ligaduras, indicaciones dinámicas, etc. Cada +objeto tiene su propio conjunto de valores de propiedad. + +Ciertos tipos de objetos reciben nombres especiales. Los objetos que +representan elementos de notación sobre la salida impresa como cabezas +de notas, plicas, ligaduras de expresión y de unión, digitaciones, +claves, etc. reciben el nombre de @q{Objetos de presentación}, a +menudo conocidos como @q{Objetos gráficos}, o abreviadamente +@q{Grobs}. Aún son objetos en el sentido genérico que hemos +mencionado, y también todos ellos tienen propiedades asociadas, como +su posición, tamaño, color,etc. + +Ciertos objetos de presentación son aún más especializados. Las +ligaduras de fraseo, los reguladores, las indicaciones de octava alta +y baja, y muchos otros objetos gráficos no están situados en un solo +lugar: tienen un punto de inicio, un punto de final, y quizá otras +propiedades relacionadas con su forma. Los objetos con una forma +extendida como estos, reciben el nombre de «Objetos de extensión» o +@q{Spanners}. + +Aún falta por explicar qué son los @q{Interfaces}. Muchos objetos, +incluso aunque son bastante diferentes, comparten funcionalidades que +se deben procesar de la misma manera. Por ejemplo, todos los objetos +gráficos tienen un color, un tamaño, una posición, etc., y todas estas +propiedades se procesan de la misma forma durante la interpretación +del archivo de entrada por parte de LilyPond. Para simplificar estas +operaciones internas, estas acciones y propiedades comunes se agrupan +en un objeto llamado @code{grob-interface}, interface de grob. Hay +muchas otras agrupaciones de propiedades comunes como ésta, y cada +una recibe un nombre que acaba en @code{interface}. En total hay más +de 100 interfaces de éstos. Veremos más adelante porqué esto es del +interés y de utilidad para el usuario. + +Estos son, en fin, los términos principales relativos a los objetos +que vamos a utilizar en este capítulo. + +@node Naming conventions of objects and properties +@subsection Naming conventions of objects and properties + +Ya hemos visto ciertas convenciones de nomenclatura de objetos, en la +sección @ref{Contexts and engravers}. En este lugar, para más fácil +referencia, presentamos una lista de los tipos de objetos y +propiedades más comunes, junto con las convenciones según las cuales +reciben su nombre, y un par de ejemplos de nombres reales. Hemos +utilizado una «A» mayúscula para denotar cualquier carácter alfabético +en mayúsculas, y «aaa» para cualquier número de caracteres alfabéticos +en minúscula. Otros caracteres se utilizan literalmente como están. + +@multitable @columnfractions .33 .33 .33 +@headitem Objeto o tipo de propiedad + @tab Convención de nomenclatura + @tab Ejemplo +@item Contextos + @tab Aaaa o AaaaAaaaAaaa + @tab Staff, GrandStaff +@item Objetos de presentación + @tab Aaaa o AaaaAaaaAaaa + @tab Slur, NoteHead +@item Grabadores + @tab Aaaa_aaa_engraver + @tab Clef_engraver, Note_heads_engraver +@item Interfaces + @tab aaa-aaa-interface + @tab grob-interface, break-aligned-interface +@item Propiedades de contextos + @tab aaa o aaaAaaaAaaa + @tab alignAboveContext, skipBars +@item Propiedades de objetos de presentación + @tab aaa o aaa-aaa-aaa + @tab direction, beam-thickness +@end multitable + +Como podremos ver en breve, las propiedades de distintos tipos de +objeto se modifican por parte de diferentes instrucciones; así pues, +es útil poder reconocer el tipo de objeto a partir de sus nombres de +propiedad. + +@node Tweaking methods +@subsection Tweaking methods + +@strong{La instrucción \override} + +@cindex override, instrucción +@funindex \override + +Ya hemos visto las instrucciones @code{\set} y @code{\with}, que se +usan para cambiar las propiedades de los @strong{contextos} y para +quitar y poner @strong{grabadores}, en @ref{Modifying context +properties} y @ref{Adding and removing engravers}. Ahora debemos +examinar algunas instrucciones importantes más. + +La instrucción que cambia las propiedades de los @strong{objetos de +presentación} es @code{\override}. Puesto que esta instrucción debe +modificar propiedades internas que se encuentran en un lugar profundo +dentro de LilyPond, su sintaxis no es tan simple como la del resto de +las instrucciones que hemos visto hasta ahora. Tiene que saber +exactamente qué propiedad de qué objeto y en qué contexto se debe +modificar, y cuál debe ser su nuevo valor. Veamos cómo se hace. + +La sintaxis genérica de esta instrucción es: + +@example +\override @emph{contexto}.@emph{objeto_de_presentación} + #'@emph{propiedad_de_presentación} = #@emph{valor} +@end example + +@noindent +Esto establecerá la propiedad de nombre +@emph{propiedad_de_presentación} del objeto de presentación con el +nombre @emph{objeto_de_presentación}, que es miembro del contexto +@emph{contexto}, al valor @emph{valor}. + +El @emph{contexto} se puede omitir (y normalmente así es) cuando el +contexto requerido se encuentra implicado sin ambigüedad y es uno de +los contextos del nivel más bajo, es decir: @code{Voice}, +@code{ChordNames} o @code{Lyrics}, y lo omitiremos en muchos de los +ejemplos siguientes. Veremos más tarde cuándo se debe especificar. + +Las últimas secciones tratan de forma exhaustiva las propiedades y sus +valores, pero para ilustrar el formato y utilización de estas +instrucciones usaremos sólo unas cuantas propiedades y valores +sencillos que sean fáciles de entender. + +Por ahora no se preocupe por el @code{#'}, que debe anteponerse a la +propiedad de presentación, y el @code{#}, que debe preceder al valor. +Deben estar presentes siempre y de esa forma exacta. Es la +instrucción de uso más común dentro del trucaje, y durante la mayor +parte del resto de este capítulo presentaremos ejemplos de cómo se +usa. A continuación hay un ejemplo sencillo para cambiar el color de +una cabeza: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +c d +\override NoteHead #'color = #red +e f g +\override NoteHead #'color = #green +a b c +@end lilypond + +@strong{La instrucción \revert} + +@cindex revert, instrucción +@funindex \revert + +Una vez sobreescrita, la propiedad retiene su nuevo valor hasta que +se sobreescribe de nuevo o se encuentra una instrucción +@code{\revert}. La instrucción @code{\revert} tiene la siguiente +sintaxis y ocasiona que el valor de la propiedad se devuelva a su +valor predeterminado original; observe que no es a su valor previo si +se han utilizado varias instrucciones @code{\override}. + +@example +\revert @emph{contexto}.@emph{objeto_de_presentación} #'@emph{propiedad_de_presentación} +@end example + +Una vez más, igual que @emph{contexto} dentro de la instrucción +@code{\override}, con frecuencia no es necesario especificar el +@emph{contexto}. Se omitirá en muchos de los ejemplos siguientes. +Aquí devolvemos el color de la cabeza al valor predeterminado para las +dos últimas notas: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +c d +\override NoteHead #'color = #red +e f g +\override NoteHead #'color = #green +a +\revert NoteHead #'color +b c +@end lilypond + +@strong{El prefijo \once} + +Tanto la instrucción @code{\override} como @code{\set} se pueden +preceder por @code{\once}. Esto ocasiona que la siguiente instrucción +@code{\override} o @code{\set} sea efectiva solamente durante el +tiempo musical en curso y antes de que la propiedad vuelva a tener +otra vez su valor predeterminado. Utilizando el mismo ejemplo, +podemos cambiar el color de una sola nota de la siguiente manera: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +c d +\once \override NoteHead #'color = #red +e f g +\once \override NoteHead #'color = #green +a b c +@end lilypond + +@strong{La instrucción \overrideProperty} + +@cindex overrideProperty, instrucción +@funindex \overrideProperty + +Hay otra forma para la instrucción de sobreescritura, +@code{\overrideProperty}, que ocasionalmente es necesaria. La +mencionamos aquí con un propósito de exhaustividad, pero para ver más +detalles consulte @ruser{Difficult tweaks}. +@c Maybe explain in a later iteration -td + +@strong{La instrucción \tweak} + +@cindex tweak, instrucción +@funindex \tweak + +La última instrucción de trucaje que está disponible es @code{\tweak}. +Se debe utilizar para cambiar las propiedades de objetos que suceden +en el mismo momento musical, como las notas de un acorde. El uso de +@code{\override} para la sobreescritura afectaría a todas las notas +del acorde, mientras que @code{\tweak} afecta solamente al siguiente +elemento del flujo de entrada. + +He aquí un ejemplo. Suponga que queremos cambiar el tamaño de la nota +intermedia (el Mi) en un acorde de Do mayor. En primer lugar, veamos +lo que haría @code{\once \override}: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] + 4 + \once \override NoteHead #'font-size = #-3 + + +@end lilypond + +Vemos que la sobreescritura con override afecta a @emph{todas} las +notas del acorde. Esto es así porque todas las notas de un acorde +ocurren en el mismo @emph{momento musical}, y la acción de +@code{\once} es aplicar la sobreescritura a todos los objetos de +presentación del tipo especificado que ocurren en el mismo momento +musical que la propia instrucción de sobreescritura @code{\override}. + +LA instrucción @code{\tweak} opera de una forma distinta. Actúa sobre +el elemento inmediatamente siguiente dentro del flujo de entrada. +Sin embargo, es efectivo solamente sobre objetos que se crean +directamente a partir del flujo de entrada, en esencia las cabezas y +las articulaciones (los objetos como las plicas y las alteraciones se +crean con posterioridad y no se pueden trucar de esta forma). Es más, +cuando se aplica a las cabezas de las notas, éstas @emph{deben} estar +dentro de un acorde, es decir, dentro de ángulos simples, así que para +trucar una sola nota la instrucción @code{\tweak} se debe colocar +dentro de ángulos simples junto con la nota. + +Así pues, volviendo a nuestro ejemplo, el tamaño de la nota intermedia +se cambiaría de la siguiente forma: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] + 4 + 4 +@end lilypond + +Observe que la sintaxis de @code{\tweak} no es igual que la de +@code{\override}. Ni el contexto ni el objeto de +presentación se deben especificar; de hecho, generaría un error +hacerlo. Los dos están implícitos por el siguiente elemento del flujo +de entrada. Así que la sintaxis genérica de la instrucción +@code{\tweak} es, simplemente: + +@example +\tweak #'@emph{propiedad_de_presentación} = #@emph{valor} +@end example + +Una instrucción @code{\tweak} también se puede usar para modificar +sólo una de una serie de articulaciones, como se muestra aquí: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +a ^Black + -\tweak #'color #red ^Red + -\tweak #'color #green _Green +@end lilypond + +Observe que la instrucción @code{\tweak} debe venir precedida de una +marca de articulación como si ella misma fuera una articulación. + +@cindex grupos especiales anidados +@cindex tresillos anidados +@cindex corchete del grupo especial +@cindex grupo especial, corchete de +@cindex tresillo, corchete de +@funindex TupletBracket + +La instrucción @code{\tweak} también se debe usar para cambiar la +apariencia de uno solo de un conjunto de grupos especiales anidados +que comiencen en el mismo instante musical. En el siguiente ejemplo, +el corchete del tresillo largo y el primero de los tres corchetes +cortos empiezan en el mismo momento musical, y por ello cualquier +instrucción @code{\override} se aplicaría a los dos. En el ejemplo se +usa @code{\tweak} para distinguir entre ellos. La primera instrucción +@code{\tweak} especifica que el corchete del tresillo largo se debe +colocar por encima de las notas y el segundo especifica que el número +del tresillo se debe imprimir en rojo sobre el corchete del primer +tresillo corto. + +@lilypond[quote,ragged-right,verbatim,fragment,relative=2] +\tweak #'direction #up +\times 4/3 { + \tweak #'color #red + \times 2/3 { c8[ c8 c8] } + \times 2/3 { c8[ c8 c8] } + \times 2/3 { c8[ c8 c8] } +} +@end lilypond + +Encontrará más detalles de la instrucción @code{\tweak} en +@ruser{Objects connected to the input}. + +Si los grupos anidados no comienzan en el mismo momento, su apariencia +se puede modificar de la forma usual mediante instrucciones +@code{\override}: + +@c NOTE Tuplet brackets collide if notes are high on staff +@c See issue 509 +@lilypond[quote,ragged-right,verbatim,fragment,relative=1] +\times 2/3 { c8[ c c]} +\once \override TupletNumber + #'text = #tuplet-number::calc-fraction-text +\times 2/3 { + c[ c] + c[ c] + \once \override TupletNumber #'transparent = ##t + \times 2/3 { c8[ c c] } +\times 2/3 { c8[ c c]} +} +@end lilypond + +@node The Internals Reference manual +@section The Internals Reference manual + +@cindex Internals Reference + +@menu +* Properties of layout objects:: +* Properties found in interfaces:: +* Types of properties:: +@end menu + +@node Properties of layout objects +@subsection Properties of layout objects + +@cindex propiedades de los objetos de presentación +@cindex propiedades de los grobs +@cindex grobs, propiedades de +@cindex presentación, propiedades de los objetos de + +Suponga que tiene una partitura con una ligadura de expresión que para +su gusto es demasiado fina y quiere trazarla un poco más gruesa. ¿Cómo +debe proceder? Ya sabe, por las afirmaciones anteriores acerca de la +flexibilidad de LilyPond, que tal posibilidad existe, y seguramente +piensa que una cierta instrucción de sobreescritura @code{\override} +será necesaria. Pero ¿existe una propiedad de grosor para las +ligaduras? y, si la hay, ¿cómo se puede modificar? Aquí es donde +interviene el Manual de Funcionamiento Interno. Contiene toda la +información que puede necesitar para construir ésta y todas las demás +instrucciones @code{\override}, de sobreescritura. + +Una advertencia antes de dirigir nuestra mirada a la referencia de +funcionamiento interno. Éste es un documento de @strong{referencia}, +lo que significa que hay pocas o ninguna explicación en él: su +propósito es presentar la información de forma precisa y concisa. Por +tanto, podrá parecerle desalentador a primera vista. ¡No se preocupe! +La guía y las explicaciones que presentamos aquí le permitirán extraer +la información de la referencia de funcionamiento interno por sí mismo +con tan sólo algo de práctica. + +@cindex sobreescritura, ejemplo de +@cindex Referencia de Funcionamiento Interno, ejemplo de utilización + +Utilicemos un ejemplo concreto con un sencillo fragmento de música +real: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 b[( g]) g | + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} +@end lilypond + +Suponga ahora que decidimos que nos gustan las ligaduras algo más +gruesas. ¿Es posible? La ligadura es, ciertamente, un objeto de +presentación, así que la cuestión es @q{¿Hay una propiedad +perteneciente a las ligaduras de expresión que controle su grosor?} +Para responder a esta pregunta debemos mirar el manual de Referencia +de Funcionamiento Interno, abreviadamente RFI@footnote{@strong{IR} +(Internals Reference) en inglés}. + +El RFI de la versión de LilyPond que está usando se puede encontrar en +la página web de LilyPond en @uref{http://lilypond.org}. Vaya a la +página de la documentación y siga el enlace Manual de Referencia de +Funcionamiento Interno (RFI). Para nuestros propósitos pedagógicos +sería mejor que utilizase la versión html, no la @q{en una sola +página} ni el PDF. Para que los siguientes párrafos tengan algún +sentido deberá consultarlo realmente al tiempo que lee. + +@c Link names in English as those pages are not yet translated. FV +Bajo el encabezamiento @strong{Top} podrá ver cinco enlaces. +Seleccione el enlace @emph{Backend}, que es donde se encuentra la +información sobre los objetos de presentación. Una vez allí, bajo el +encabezamiento @strong{Backend}, siga el enlace @emph{All layout +objects}. La página que aparece relaciona todos los objetos de +presentación que se usan en su versión de LilyPond, en orden +alfabético. Siga el enlace Slur (ligadura de expresión), y aparecerán +relacionadas las propiedades de las ligaduras de expresión o Slurs. + +(Una forma alternativa de encontrar esta página es a partir de la +Referencia de la Notación. En una de las páginas que tratan de las +ligaduras de expresión podrá encontrar un enlace al manual de +referencia del funcionamiento interno. Este enlace le llevará +directamente a esta página, aunque con frecuencia es más fácil ir +directamente al RFI y buscar allí.) + +Esta página sobre las ligaduras de expresión dentro del manual RFI nos +dice en primer lugar que los objetos Slur se crean por el grabador +Slur_engraver. A continuación relaciona los ajustes estándar. +Observe que @strong{no} están en orden alfabético. Navegue hacia +abajo buscando una propiedad que pudiera controlar el grosor de las +ligaduras, y encontrará + +@example +@code{thickness} (number) + @code{1.2} + Line thickness, generally measured in @code{line-thickness} +@end example + +Esto promete ser una buena opción para cambiar el grosor. Nos dice +que el valor de @code{thickness} es un simple @emph{número}, que el +valor predeterminado es 1.2, y que las unidades están dentro de otra +propiedad llamada @code{line-thickness}. + +Como dijimos con anterioridad, existen entre pocas y ninguna +explicación en el RFI, pero ya tenemos información suficiente para +probar a cambiar el grosor de la ligadura. Vemos que el nombre del +objeto de presentación es @code{Slur}, que el nombre de la propiedad +que debemos cambiar es @code{thickness} y que el nuevo valor debe ser +un número algo más grande que 1.2 si queremos hacer las ligaduras más +gruesas. + +Ahora podemos construir la instrucción de sobreescritura +@code{\override} simplemente mediante la sustitución de los valores +que hemos encontrado para los nombres, omitiendo el contexto. +Usaremos un valor muy grande para el grosor al principio, para estar +seguros de que la instrucción está funcionando. Obtenemos lo +siguiente: + +@example +\override Slur #'thickness = #5.0 +@end example + +¡No olvide el @code{#'} antes del nombre de la propiedad y @code{#} +antes del valor nuevo! + +La pregunta final es @q{¿Dónde se debe colocar esta instrucción?} +Aunque nos falta seguridad y estamos todavía aprendiendo, la mejor +respuesta es: @q{Dentro de la música, antes de la primera ligadura y +cerca de ella.} Hagámoslo así: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 6/8 + { + % Increase thickness of all following slurs from 1.2 to 5.0 + \override Slur #'thickness = #5.0 + r4 b8 b[( g]) g | + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} +@end lilypond + +@noindent +y podemos ver que la ligadura, es sin duda, más pesada. + +Así pues, ésta es la forma básica de construir instrucciones +@code{\override} o de sobreescritura. Existen unas cuantas +complicaciones más con las que nos encontraremos en secciones +posteriores, pero ahora conoce todos los principios esenciales que +necesita para hacerlo por sí mismo (aunque aún necesita algo de +práctica). La cual vendrá proporcionada por los ejemplos que vienen a +continuación. + +@subheading Finding the context +@cindex contexto, encontrar + +Pero en primer lugar ¿qué habría pasado si hubiésemos tenido que +especificar el contexto? ¿Cuál sería? Podemos suponer que las +ligaduras están en el contexto de Voz, por estar claramente asociados +de manera estrecha con las líneas individuales de música, pero +¿podemos estar seguros? Para averiguarlo, vayamos de nuevo al inicio +de la página del RFI que describe las ligaduras (Slur), donde dice +@q{Slur objects are created by: Slur engraver} («Los objetos de +ligadura de expresión se crean por: el grabador Slur»). Así pues, las +ligaduras de expresión se crean en cualquier contexto en el que se +encuentre el grabador @code{Slur_engraver}. Siga el enlace a la +página del grabador @code{Slur_engraver}. Al final del todo, dice que +el grabador @code{Slur_engraver} es parte de cinco contextos de voz, +incluido el contexto de voz estándar, @code{Voice}, por lo que nuestra +suposición era acertada. Y a causa de que @code{Voice} es uno de los +contextos de más bajo nivel que se encuentra implícito sin ambigüedad +por el hecho de que estamos escribiendo notas, podemos omitirlo en +este lugar concreto. + +@subheading Overriding once only + +@cindex sobreescritura por una sola vez +@cindex once override +@funindex \once + +Como puede ver, @emph{todas} las ligaduras son más gruesas en el +último ejemplo. Pero ¿y si quisiéramos que solamente la primera +ligadura fuese más gruesa? Esto se consigue con la instrucción o +prefijo @code{\once}. Colocado inmediatamente antes de la instrucción +@code{\override} ocasiona que solamente cambie la ligadura que +comienza en la nota @strong{inmediata siguiente}. Si la nota +inmediata siguiente no da inicio a una ligadura, la instrucción no +tiene ningún efecto en absoluto: no se recuerda hasta que se +encuentre alguna ligadura, sino que simplemente se ignora. Así pues, +la instrucción que lleva @code{\once} se debe reposicionar de la forma +siguiente: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 + % Increase thickness of immediately following slur only + \once \override Slur #'thickness = #5.0 + b[( g]) g | + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} +@end lilypond + +@noindent +Hemos hecho que ahora solamente la primera ligadura sea más gruesa. + +La instrucción o prefijo @code{\once} también se puede usar antes de +la instrucción @code{\set}. + +@subheading Reverting + +@cindex revert +@cindex predeterminadas, devolver a las propiedades +@funindex \revert + +Finalmente ¿y si quisiéramos que solamente las dos primeras ligaduras +fuesen más gruesas? En fin; podríamos usar dos instrucciones, cada +una de ellas precedida por el prefijo @code{\once}, situadas +inmediatamente antes de cada una de las notas en que comienzan las +ligaduras: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 + % Increase thickness of immediately following slur only + \once \override Slur #'thickness = #5.0 + b[( g]) g | + % Increase thickness of immediately following slur only + \once \override Slur #'thickness = #5.0 + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} +@end lilypond + +@noindent +o podríamos omitir la instrucción prefija @code{\once} y utilizar la +instrucción @code{\revert} (restablecer) para devolver la propiedad +del grosor, @code{thickness}, a su valor predeterminado después de la +segunda ligadura: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 + % Increase thickness of all following slurs from 1.2 to 5.0 + \override Slur #'thickness = #5.0 + b[( g]) g | + g[( e]) + % Revert thickness of all following slurs to default of 1.2 + \revert Slur #'thickness + e d[( f]) a | + a g + } + \addlyrics { + The man who feels love's sweet e -- mo -- tion + } +} +@end lilypond + +@noindent +la instrucción @code{\revert} se puede utilizar para devolver +cualquier propiedad que se haya cambiado con @code{\override} a su +valor predeterminado. Puede utilizar el método que mejor se adapte a +aquello que quiere hacer. + +Así finaliza nuestra introducción al manual de RFI, y el método básico +de trucaje. A continuación, en las últimas secciones de este capítulo +encontrará varios ejemplos, en parte para introducirle en algunas de +las posibilidades adicionales del manual RFI, y en parte para +proporcionarle más práctica en cómo extraer información de él. Estos +ejemplos irán conteniendo cada vez menos palabras de guía y +explicación. + +@node Properties found in interfaces +@subsection Properties found in interfaces + +@cindex propiedades de los interfaces +@cindex interfaces, propiedades + +Suponga ahora que queremos imprimir la letra de la canción en cursiva. +¿Qué forma de instrucción @code{\override} necesitamos para hacerlo? +En primer lugar miramos en la página del RFI que relaciona todos los +objetos, @q{All layout objects}, como antes, y buscamos un objeto que +pueda controlar la letra de la canción. Encontramos @code{LyricText}, +que parece adecuado. Al seguir este enlace se presentan las +propiedades ajustables para el texto de la letra. Estos incluyen +@code{font-series} y @code{font-size}, pero nada que pudiera aplicar +una forma cursiva. Esto es porque la propiedad de la forma es común a +todos los objetos de fuente tipográfica, y por tanto, en vez de +incluirlo en cada uno de los objetos de presentación, se agrupa junto +con otras propiedades comunes similares y se deposita en un +@strong{Interface}, el interface de las fuentes tipográficas +@code{font-interface}. + +Por tanto, ahora necesitamos aprender cómo encontrar las propiedades +de los interfaces, y descubrir qué objetos usan estas propiedades de +interface. + +Mire de nuevo la página del RFI que describe a LyricText. Al final de +la página hay una lista de enlaces (en las versiones de html del RFI) +a los interfaces que LyricText contempla. La lista tiene siete +elementos, entre ellos @code{font-interface}. Al seguir este enlace +llegamos a las propiedades asociadas con este interface, que también +son propiedades de todos los objetos que lo llevan, entre ellos +LyricText. + +Ahora vemos todas las propiedades ajustables por el usuario que +controlan las tipografías, entre ellas @code{font-shape(symbol)}, +donde @code{symbol} se puede establecer a @code{upright} (recta), +@code{italics} (cursiva)o @code{caps} (mayúsculas pequeñas). + +Observará que @code{font-series} y @code{font-size} también se +encuentran aquí relacionadas. Esto inmediatamente hace que surja la +pregunta: ¿Por qué están las propiedades comunes de tipografía +@code{font-series} y @code{font-size} relacionadas bajo +@code{LyricText} así como bajo el interface @code{font-interface} pero +@code{font-shape} no lo está? La respuesta es que @code{font-series} +y @code{font-size} se cambian a partir de sus valores predeterminados +globales cuando se crea un objeto @code{LyricText}, pero +@code{font-shape} no lo hace. Entonces los elementos de la lista +@code{LyricText} le dicen los valores para esas dos propiedades que +son de aplicación para @code{LyricText}. Otros objetos que contemplan +@code{font-interface} establecerán dichas propiedades de forma +diferente cuando se crean. + +Veamos si ahora podemos construir la instrucción @code{\override} para +cambiar la letra a cursiva. El objeto es @code{LyricText}, la +propiedad es @code{font-shape} y el valor es @code{italic}. Igual que +antes, omitiremos el contexto. + +Como nota aparte, aunque una nota importante, observe que a causa de +que los valores de @code{font-shape} son símbolos, deben ir precedidos +de un apóstrofe, @code{'}. Esa es la razón por la que se necesitan +apóstrofes antes de @code{thickness} en el ejemplo anterior y en +@code{font-shape}. Los dos son también símbolos. Los símbolos son +nombres especiales que son conocidos por LilyPond internamente. +Algunos de ellos son nombres de propiedades, como @code{thickness} o +@code{font-shape}, otros son en efecto valores especiales que se les +puede dar a las propiedades, como @code{italic}. Observe la +distinción entre esto y las cadenas de texto arbitrarias, que +aparecerían entrecomilladas como @code{"a text string"}. + +De acuerdo, entonces la instrucción @code{\override} que necesitamos +para imprimir la letra en cursiva sería + +@example +\override LyricText #'font-shape = #'italic +@end example + +@noindent +y debe colocarse justo delante de, y cerca de, la letra a la que debe +afectar, como esto: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 6/8 + { + r4 b8 b[( g]) g | + g[( e]) e d[( f]) a | + a g + } + \addlyrics { + \override LyricText #'font-shape = #'italic + The man who feels love's sweet e -- mo -- tion + } +} +@end lilypond + +@noindent +y toda la letra se imprime en cursiva. + +@subheading Specifying the context in lyric mode +@cindex contexto, especificación en modo letra + +En el caso de la letra, si intenta especificar el contexto en el +formato que acabamos de dar, la instrucción no funcionará. Una +sílaba escrita en el modo letra, «lyricmode» termina en un espacio, un +salto de línea o un dígito. Cualquier otro carácter se incluye como +parte de la sílaba. Por esta razón, un espacio o salto de línea debe +aparecer antes del último símbolo @code{@}} para evitar que se incluya +como parte de la sílaba final. De forma similar, se deben insertar +espacios antes y después del punto, @q{.}, separando el nombre del +contexto del nombre del objeto, pues en caso contrario los dos nombres +se juntarán y el intérprete no podrá reconocerlos. Así pues, la +instrucción será: + +@example +\override Lyrics . LyricText #'font-shape = #'italic +@end example + +@warning{Dentro de la letra, deje siempre espacios entre la sílaba +final y la llave de cierre.} + +@warning{En las sobreescrituras con override dentro de la letra, +escriba siempre espacios antes y después del punto que separa el +nombre del contexto y el nombre del objeto.} + +@node Types of properties +@subsection Types of properties + +@cindex propiedades, tipos de + +Hasta ahora hemos visto dos tipos de propiedad:: @code{número} y +@code{símbolo}. Para que sea válido, el valor que se da a una +propiedad debe ser del tipo correcto y obedecer las reglas de dicho +tipo. El tipo de la propiedad se muestra siempre entre paréntesis +después del nombre de la propiedad en el RFI. He aquí una lista de +los tipos que podrá necesitar, junto con las reglas de dicho tipo, y +algunos ejemplos. Debe escribir siempre un símbolo de almohadilla, +@code{#}, por supuesto, delante de estos valores cuando se introducen +en la instrucción @code{\override}. + +@multitable @columnfractions .2 .45 .35 +@headitem Tipo de propiedad + @tab Reglas + @tab Ejemplos +@item Booleano + @tab Verdadero o Falso, representado por #t o #f + @tab @code{#t}, @code{#f} +@item Dimensión (en espacios de pentagrama) + @tab Un número decimal positivo (en unidades de espacios de pentagrama) + @tab @code{2.5}, @code{0.34} +@item Dirección + @tab Una constante válida de dirección o su equivalente numérico + @tab @code{#LEFT}, @code{#CENTER}, @code{#UP}, + @code{1}, @code{-1} +@item Entero + @tab Un número entero positivo + @tab @code{3}, @code{1} +@item Lista + @tab Un conjunto de elementos entre paréntesis separados por espacios y precedido de un apóstrofe + @tab @code{'(left-edge staff-bar)}, @code{'(1)}, + @code{'(1.0 0.25 0.5)} +@item Marcado + @tab Cualquier elemento válido de marcado de texto + @tab @code{\markup @{ \italic "cresc." @}} +@item Momento + @tab Una fracción de redonda construida con la función make-moment + @tab @code{(ly:make-moment 1 4)}, + @code{(ly:make-moment 3 8)} +@item Número + @tab Cualquier valor decimal positivo o negativo + @tab @code{3.5}, @code{-2.45} +@item Pareja (de números) + @tab Dos números separados por un @q{espacio . espacio}, encerrado entre paréntesis y precedido de un apóstrofe + @tab @code{'(2 . 3.5)}, @code{'(0.1 . -3.2)} +@item Símbolo + @tab Cualquiera del conjunto de símbolos permitidos para esa propiedad, precedido de un apóstrofe + @tab @code{'italic}, @code{'inside} +@item Desconocido + @tab Un procedimiento o @code{#f} (para no producir ninguna acción) + @tab @code{bend::print}, @code{ly:text-interface::print}, + @code{#f} +@item Vector + @tab Una lista de tres elementos encerrados entre paréntesis y precedida de una almohadilla, @code{#}. + @tab @code{#(#t #t #f)} +@end multitable + +@node Appearance of objects +@section Appearance of objects + +Ahora vamos a poner en práctica lo que hemos aprendido con unos +cuantos ejemplos que muestran cómo se pueden usar los trucos para +cambiar el aspecto de la música impresa. + +@menu +* Visibility and color of objects:: +* Size of objects:: +* Length and thickness of objects:: +@end menu + +@node Visibility and color of objects +@subsection Visibility and color of objects + +Dentro de un uso educativo de la música, podríamos desear imprimir una +partitura con ciertos elementos omitidos como ejercicio para el +alumno, a quien se le pide que los complete. A la manera de ejemplo +sencillo, supongamos que el ejercicio es escribir las líneas +divisorias que faltan en un fragmento musical. Pero las líneas +divisorias normalmente se insertan automáticamente. ¿Cómo hacemos para +que no se impriman? + +Antes de enredarnos con esto, recordemos que las propiedades de los +objetos se agrupan en lo que hemos llamado @emph{interfaces} (véase +@ref{Properties found in interfaces}). Esto es simplemente agrupar +las propiedades que normalmente se necesitan juntas: si una de ellas +se necesita para un objeto, también las otras. Así, ciertos objetos +necesitan las propiedades de algunos interfaces, otros necesitan las +de otros interfaces. Los interfaces que contienen las propiedades que +un determinado grob necesita se encuentran relacionadas en el manual +RFI al final de la página que describe dicho grob, y esas propiedades +se pueden ver mirando dichos interfaces. + +Hemos explicado cómo encontrar información sobre los grobs en +@ref{Properties of layout objects}. Usando el mismo enfoque, vamos al +RFI para buscar el objeto de presentación que imprime las líneas +divisorias. A través del enlace @emph{Backend} y @emph{All layout +objects} encontramos que hay un objeto de presentación llamado +@code{BarLine}. Entre sus propiedades se encuentran dos que controlan +la visibilidad: @code{break-visibility} y @code{stencil}. Las líneas +divisorias también contemplan un número de interfaces, entre ellos el +@code{grob-interface}, donde podemos encontrar las propiedades +@code{transparent} y @code{color}. Todas ellas pueden afectar la +visibilidad de las barras de compás (y, por supuesto, por extensión, +también la de muchos otros objetos de presentación). Vamos a +considerar cada uno de ellos por orden. + +@subheading stencil +@cindex stencil (sello), propiedad + +Esta propiedad controla la apariencia de las barras de compás mediante +la especificación del símbolo (o «glifo») que se debe imprimir. Igual +que como otras muchas propiedades, se puede establecer de forma que no +imprima nada ajustando su valor a @code{#f}. Vamos a probarlo, como +antes, omitiendo el Contexto implícito, @code{Voice}: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override BarLine #'stencil = ##f + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond + +Las barras de compás todavía se imprimen. ¿Qué es lo que está mal? +Vuelva al RFI y mire de nuevo la página que ofrece las propiedades del +objeto BarLine. Al principio de la página dice @qq{Barline objects +are created by: Bar_engraver} (los objetos Barline se crean por el +grabador Bar_engraver). Vaya a la página del grabador +@code{Bar_engraver} siguiendo el enlace. Al final da una lista de +contextos en los que el grabador de líneas divisorias opera. Todos +ellos son del tipo @code{Staff}, y así la razón de que la instrucción +@code{\override} no funcionara como esperábamos, es porque +@code{Barline} no se encuentra en el contexto predeterminado +@code{Voice}. Si el contexto se especifica mal, la instrucción +simplemente no funciona. No se produce ningún mensaje de error, y no +se registra nada en el archivo log de registro. Vamos a intentar +corregirlo escribiendo el contexto correcto: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'stencil = ##f + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond + +Ahora las barras de compás han desaparecido. + +@subheading break-visibility + +@cindex break-visibility property + +Vemos en las propiedades de @code{BarLine} que aparecen en el RFI que +la propiedad @code{break-visibility} requiere un vector de tres +valores booleanos. Controlan respectivamente si las barras de compás +se imprimen al final de una línea, en mitad de una línea, y al +principio de las líneas. Para nuestro ejemplo, queremos que todas las +barras de compás se supriman, por lo que el valor que necesitamos es +@code{#(#f #f #f)}. Vamos a probarlo, recordando incluir el contexto +de @code{Staff}. Observa también que al escribir este valor tenemos +dos símbolos de almohadilla antes del paréntesis de apertura. Se +necesita uno como parte del valor para introducir un vector, y se +necesita otro más, como siempre, para preceder el propio valor dentro +de la instrucción @code{\override}. + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'break-visibility = ##(#f #f #f) + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond + +Y podemos ver que esto también quita todas las líneas divisorias. + +@subheading transparent +@cindex transparente, propiedad + +En la relación de propiedades que se especifican en la página del +@code{grob-interface} del RFI podemos ver que la propiedad +@code{transparent} es un valor booleano. Esto se debe establecer a +@code{#t} para hacer que el grob sea transparente. En el ejemplo +siguiente vamos a hacer que la indicación de compás, y no las líneas +divisorias, sea transparente. Para hacerlo tenemos que buscar el +nombre del grob de la indicación de compás. Volviendo a la página +@q{All layout objects} del RFI, buscamos las propiedades del objeto de +presentación @code{TimeSignature}. Se produce por parte del grabador +@code{Time_signature_engraver} que como puede comprobar vive dentro +del contexto de @code{Staff} y también contempla el interface +@code{grob-interface}. Así pues, la instrucción que hace transparente +a la indicación de compás es: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.TimeSignature #'transparent = ##t + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +El compás ya no está, pero esta instrucción deja una separación en el +lugar donde antes estaba la indicación de compás. Quizá esto es lo +que queremos para un ejercicio en que el alumno deba escribirlo, pero +en otras circunstancias esta separación podría no ser deseable. En +vez de eso, para quitarla, el stencil o «sello» de la indicación de +compás se debe establecer al valor @code{#f}: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.TimeSignature #'stencil = ##f + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +y la diferencia es obvia: al establecer el sello al valor @code{#f} +quitamos el objeto por completo; al hacer el objeto @code{transparent} +lo dejamos donde está, pero lo hacemos invisible. + +@subheading color +@cindex color, propiedad + +Para finalizar, podríamos hacer invisibles las barras de compás +pintándolas de color blanco. El interface @code{grob-interface} +especifica que la propiedad del color es una lista, pero no hay +ninguna explicación sobre lo que debe ir en esa lista. La lista que +requiere es realmente una lista de valores en unidades internas, pero +para evitar tener que saber cuáles son, se ofrecen varias vías para la +especificación de los colores. La primera forma es utilizar uno de +los colores @q{normales} que están relacionados en la primera tabla de +la @ruser{List of colors}. Para poner las líneas divisorias de color +blanco, escribimos: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'color = #white + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +y de nuevo podemos comprobar que las barras de compás no son visibles. +Observe que @emph{white} no viene precedido de un apóstrofe: no es un +símbolo, sino una @emph{función}. Cuando se invoca, proporciona la +lista de valores internos que se requieren para establecer el color a +blanco. Los otros colores de la lista normal también son funciones. +Para convencerse de que esto funciona, quizá quiera cambiar el color a +una de las otras funciones de la lista. + +@cindex colores de X11 +@cindex X11, colores de + +La segunda forma de cambiar el color es utilizar la lista de nombres +de colores de X11 que aparecen en la segunda lista de @ruser{List of +colors}. Sin embargo, éstos deben ir precedidos de otra función, que +convierte los nombres de colores de X11 en la lista de valores +internos, @code{x11-color}, de la siguiente manera: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'color = #(x11-color 'white) + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +Observe que en este caso la función @code{x11-color} toma un símbolo +como argumento, así que el símbolo debe ir precedido de un apóstrofe y +los dos deben ir entre paréntesis. + +@cindex rgb, colores +@cindex color, rgb + +Aún hay una tercera función, que convierte valores RGB en colores +internos: la función @code{rgb-color}. Toma tres argumentos que dan +las intensidades de rojo, verde y azul. Cada uno de ellos puede tomar +valores entre 0 y 1. Por lo tanto, para establecer el color a rojo el +valor debe ser @code{(rgb-color 1 0 0)} y para blanco debe ser +@code{(rgb-color 1 1 1)}: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.BarLine #'color = #(rgb-color 1 1 1) + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond + +Finalmente, existe también una escala de grises como parte del +conjunto de colores de X11. Varían desde el negro, @code{'grey0'}, +hasta el blanco, @code{'grey100}, en pasos de 1. Vamos a ilustrar esto +estableciendo todos los objetos de presentación de nuestro ejemplo a +varias gradaciones de gris: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +{ + \time 12/16 + \override Staff.StaffSymbol #'color = #(x11-color 'grey30) + \override Staff.TimeSignature #'color = #(x11-color 'grey60) + \override Staff.Clef #'color = #(x11-color 'grey60) + \override Voice.NoteHead #'color = #(x11-color 'grey85) + \override Voice.Stem #'color = #(x11-color 'grey85) + \override Staff.BarLine #'color = #(x11-color 'grey10) + c4 b8 c d16 c d8 | + g, a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +Observe los contextos asociados con cada uno de los objetos de +presentación. Es importante que estén correctamente escritos, o las +instrucciones ¡no funcionarán! Recuerde que el contexto es aquel en +que se encuentra el grabador correspondiente. El contesto +predeterminado para los grabadores puede encontrarse empezando por el +objeto de presentación, de ahí al grabador que lo produce, y en la +página del grabador del RFI aparece en qué contexto se puede encontrar +normalmente el grabador. + + +@node Size of objects +@subsection Size of objects + +Empezaremos examinando de nuevo un ejemplo anterior (véase +@ref{Nesting music expressions}) que nos mostraba cómo introducir un +pentagrama temporal, como en un @rglos{ossia}. + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = "main" } + { f8 f c } + >> + r4 | + } + } +@end lilypond + +Los fragmentos de Ossia se escriben normalmente sin clave ni compás, y +por lo normal se imprimen más pequeños que el pentagrama principal. +Ya sabemos cómo quitar la clave y el compás: simplemente establecemos +el sello de cada uno de ellos a @code{#f}, como sigue: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = "main" + } + { + \override Staff.Clef #'stencil = ##f + \override Staff.TimeSignature #'stencil = ##f + { f8 f c } + } + >> + r4 | + } +} +@end lilypond + +@noindent +donde el par de llaves adicional después de la cláusula @code{\with} +es necesario para asegurar que la sobreescritura encerrada y la música +se aplican al pentagrama de ossia. + +Pero ¿cuál es la diferencia entre modificar el contexto de pentagrama +usando @code{\with} y modificar los sellos de clave y de compás con +\override? La diferencia principal es que los cambios que se realizan +en una cláusula @code{\with} se hacen en el momento en que se crea el +contexto, y permanecen activos como valores @strong{predeterminados} +durante toda la duración de dicho contexto, mientras que las +instrucciones @code{\set} o @code{\override} incluidas dentro de la +música son dinámicas: hacen cambios sincronizados con un punto +concreto de la música. Si los cambios se deshacen o se devuelven +mediante @code{\unset} o @code{\revert} volverán a su valor +predeterminado que será el establecido en la cláusula @code{\with}, o +si no se ha establecido ninguno en este lugar, los valores +predeterminados normales. + +Ciertas propiedades de contexto se pueden modificar solamente dentro +de cláusulas @code{\with}. Son aquellas propiedades que no se pueden +cambiar después de que el contexto se ha creado. +@code{alignAboveContext} y su compañero, @code{alignBelowContext}, son +dos de tales propiedades: una vez que el pentagrama se ha creado, su +alineación está decidida y no tendría sentido intentar cambiarla más +tarde. + +Los valores predeterminados de las propiedades de los objetos de +presentación también se pueden establecer dentro de cláusulas +@code{\with}. Simplemente utilice la instrucción @code{\override} +normal dejando aparte el nombre del contexto, ya que está definido sin +ambigüedad como el contexto que la cláusula @code{\with} está +modificando. De hecho, se producirá un error si se especifica un +contexto en este lugar. + +Así pues, podemos reemplazar el ejemplo anterior con + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = "main" + % Don't print clefs in this staff + \override Clef #'stencil = ##f + % Don't print time signatures in this staff + \override TimeSignature #'stencil = ##f + } + { f8 f c } + >> + r4 | + } +} +@end lilypond + +Finalmente llegamos a la forma de cambiar el tamaño de los objetos de +presentación. + +Ciertos objetos de presentación se crean como glifos sacados de una +fuente tipográfica. Entre ellos se encuentran las cabezas, +alteraciones, elementos de marcado, claves, indicaciones de compás, +indicaciones dinámicas y la letra de las canciones. Su tamaño se +cambia mediante la modificación de la propiedad @code{font-size}, como +veremos en breve. Otros objetos de presentación como ligaduras de +unión y de expresión (en general, objetos de extensión) se trazan +individualmente, por lo que no hay un tamaño de tipografía +@code{font-size} asociado a ellos. Estos objetos generalmente derivan +su tamaño de los objetos a los que están adosados, y por ello +normalmente no hay necesidad de cambiarles el tamaño manualmente. Aún +otras propiedades como la longitud de las plicas y las barras de +compás, el grosor de las barras de corchea y otras líneas, y la +separación de las líneas del pentagrama se deben modificar de otras +formas especiales. + +Volviendo al ejemplo del ossia, vamos a cambiar en primer lugar el +tamaño de la tipografía. Podemos hacerlo de dos formas. Podemos +cambiar el tamaño de las tipografías de cada uno de los tipos de +objeto como las cabezas (@code{NoteHead}s) con instrucciones como + +@example +\override NoteHead #'font-size = #-2 +@end example + +o podemos cambiar el tamaño de todas las tipografías estableciendo una +propiedad especial, @code{fontSize}, utilizando @code{\set}, o +mediante su inclusión dentro de una cláusula @code{\with} (pero sin el +@code{\set}). + +@example +\set fontSize = #-2 +@end example + +Los dos enunciados producirían una reducción del tamaño de la +tipografía en dos pasos a partir de su valor previo, donde cada paso +reduce o aumenta el tamaño aproximadamente en un 12%. + +Vamos a probarlo en nuestro ejemplo del ossia: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = "main" + \override Clef #'stencil = ##f + \override TimeSignature #'stencil = ##f + % Reduce all font sizes by ~24% + fontSize = #-2 + } + { f8 f c } + >> + r4 | + } +} +@end lilypond + +Aún no está demasiado bien. Las cabezas y los corchetes de las notas +son más pequeños, pero las plicas son demasiado largas en proporción, +y las líneas del pentagrama están demasiado separadas entre sí. Se +debe reducir su escala en proporción a la reducción de la tipografía. +El siguiente apartado trata sobre cómo se hace esto. + +@node Length and thickness of objects +@subsection Length and thickness of objects + +@cindex distancias +@cindex grosor +@cindex longitud +@cindex magstep +@cindex tamaño, cambiar +@cindex plica, cambiar la longitud +@cindex pentagrama, cambiar la separación de las líneas + +Las distancias y longitudes en LilyPond se miden generalmente en +espacios de pentagrama, la distancia entre líneas adyacentes de la +pauta (o de manera ocasional medios espacios), mientras que la mayoría +de las propiedades de @code{thickness} (grosor) se miden en unidades +de una propiedad interna llamada @code{line-thickness.} Por ejemplo, +de forma predeterminada, a las líneas de los reguladores se les da un +grosor de 1 unidad de @code{line-thickness}, mientras que el +@code{thickness} de una plica es 1.3. Observe sin embargo que ciertas +propiedades de grosor son diferentes; por ejemplo, el grosor de las +barras de corchea se mide en espacios de pentagrama. + +Entonces ¿cómo se tienen que escalar las longitudes en proporción al +tamaño de la tipografía? Se puede hacer con la ayuda de una función +especial que se llama @code{magstep}, pensada especialmente para este +propósito. Toma un argumento, el cambio de tamaño de la tipografía +(#-2 en nuestro ejemplo) y devuelve un factor de escalado adecuado +para reducir otros objetos en la misma proporción. Se usa de la +siguiente forma: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\new Staff ="main" { + \relative g' { + r4 g8 g c4 c8 d | + e4 r8 + << + { f c c } + \new Staff \with { + alignAboveContext = "main" + \override Clef #'stencil = ##f + \override TimeSignature #'stencil = ##f + fontSize = #-2 + % Reduce stem length and line spacing to match + \override StaffSymbol #'staff-space = #(magstep -2) + } + { f8 f c } + >> + r4 | + } +} +@end lilypond + +@noindent +Puesto que la longitud de las plicas y muchas otras propiedades +relacionadas con la longitudes calculan siempre con relación al valor +de la propiedad @code{staff-space}, su longitud también ve reducida su +escala automáticamente. Observe que esto afecta solamente a la escala +vertical del ossia: la escala horizontal se determina por medio de la +disposición de la música principal con el objeto de mantenerse en +sincronía con ella, de forma que no resulte afectada por ninguno de +estos cambios de tamaño. Por supuesto, si la escala de toda la música +principal se cambiase de esta forma, entonces el espaciado horizontal +se vería afectado. Trataremos de esto más tarde en la sección sobre +la disposición. + +Esto, en fin, completa la creación de un ossia. Los tamaños y +longitudes del resto de los objetos se pueden modificar de manera +análoga. + +Para cambios de escala pequeños, como en el ejemplo de arriba, el +grosor de las diversas líneas dibujadas como divisorias, barras de +corchea, reguladores, ligaduras, etc, no requieren normalmente ningún +ajuste global. Si el grosor de cualquier objeto de presentación en +particular necesita ajustarse, se puede hacer mejor mediante la +sobreescritura de su propiedad @code{thickness}. Anteriormente +mostramos un ejemplo de cambio de grosor en las ligaduras, en +@ref{Properties of layout objects}. El grosor de todos los objetos +trazados (es decir, aquellos que no se producen a partir de una +tipografía) se pueden cambiar de la misma forma. + + +@node Placement of objects +@section Placement of objects + +@menu +* Automatic behaviour:: +* Within-staff objects:: +* Outside staff objects:: +@end menu + + +@node Automatic behaviour +@subsection Automatic behaviour + +Hay ciertos objetos en notación musical que pertenecen al pentagrama y +otros cuyo lugar se sitúa fuera del pentagrama. Reciben el nombre de +objetos dentro-del-pentagrama y objetos fuera-del-pentagrama, +respectivamente. + +Los objetos dentro-del-pentagrama son los que se sitúan sobre la +pauta: cabezas, plicas, alteraciones, etc. Sus posiciones normalmente +se fijan por la propia música; se posicionan verticalmente sobre +líneas específicas del pentagrama o están unidos a otros objetos +posicionados de esta forma. Las colisiones entre cabezas, plicas y +alteraciones en acordes de notas muy juntas, normalmente se evitan +automáticamente. Hay instrucciones y sobreescrituras que pueden +modificar este comportamiento automático, como veremos en breve. + +Entre los objetos que pertenecen al exterior de la pauta se encuentran +cosas como las marcas de ensayo, las marcas de texto y las de +dinámica. La regla de LilyPond para la colocación vertical de los +objetos fuera-de-pentagrama es colocarlos tan cerca del pentagrama +como sea posible, pero no tan cerca como para que puedan chocar con +algún otro objeto. LilyPond utiliza la propiedad +@code{outside-staff-priority} para determinar el orden en que se deben +situar los objetos, como veremos ahora. + +En primer lugar, LilyPond sitúa todos los objetos +dentro-del-pentagrama. Después ordena los objetos +fuera-del-pentagrama de acuerdo con su prioridad +@code{outside-staff-priority}. Los objetos fuera-del-pentagrama se +toman de uno en uno, comenzando por el que tiene la prioridad +@code{outside-staff-priority} más baja, y se sitúan de forma que no +colisionen con ningún objeto que se haya colocado ya. Esto es, si dos +grobs fuera-del-pentagrama compiten por el mismo espacio, el que tiene +la prioridad @code{outside-staff-priority} más baja se colocará más +cerca del pentagrama. Si dos objetos tienen la misma +@code{outside-staff-priority}, el que se ha encontrado primero se +situará más cerca de la pauta. + +En el siguiente ejemplo, todos los textos de marcado tienen la misma +prioridad (pues no se ha establecido explícitamente). Observe que +@q{Text3} se posiciona de nuevo automáticamente cerca del pentagrama, +acomodado por debajo de @q{Text2}. + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +c2^"Text1" +c^"Text2" +c^"Text3" +c^"Text4" +@end lilypond + +Los pentagramas también se posicionan, de forma predeterminada, tan +cerca unos de otros como sea posible (sujeto a una separación mínima). +Si las notas se proyectan muy lejos en dirección a un pentagrama +adyacente, forzarán a alejarse a los pentagramas sólo si en caso +contrario fuese a ocurrir un solapamiento de la notación. El ejemplo +siguiente muestra esta acomodación @q{nestling} de las notas sobre +pentagramas adyacentes: + +@lilypond[quote,ragged-right,verbatim] +<< + \new Staff { + \relative c' { c a, } + } + \new Staff { + \relative c'''' { c a, } + } +>> +@end lilypond + + +@node Within-staff objects +@subsection Within-staff objects + +Ya hemos visto cómo las instrucciones @code{\voiceXXX} affectan a la +dirección de las ligaduras de expresión y de unión, digitaciones y +todo lo demás que dependa de la dirección de las plicas. Cuando se +escribe música polifónica, estas instrucciones son esenciales para que +puedan distinguirse varias líneas melódicas entrelazadas. Pero +ocasionalmente puede ser necesario sobreescribir este comportamiento +automático. Se puede hacer por secciones de música completas o +incluso para una nota individual. La propiedad que controla este +comportamiento es la propiedad de @code{direction} (dirección) de cada +objeto de presentación. En primer lugar explicaremos qué hace esto, y +luego introduciremos algunas instrucciones listas para usar que le +evitarán tener que codificar sobreescrituras explícitas para las +modificaciones más comunes. + +Algunos objetos de presentación como las ligaduras se curvan hacia +arriba o hacia abajo; otros como las plicas y los corchetes también se +mueven a la derecha o a la izquierda cuando apuntan hacia arriba o +hacia abajo. Esto se controla automáticamente cuando está establecida +la propiedad @code{direction}. + +El ejemplo siguiente muestra en el compás 1 el comportamiento +predeterminado de las plicas, con las de las notas agudas apuntando +hacia abajo y las graves hacia arriba, seguidas de cuatro notas con +todas las plicas forzadas hacia abajo, cuatro notas con las plicas +forzadas hacia arriba, y por último cuatro notas devueltas al +comportamiento predeterminado. + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +a4 g c a +\override Stem #'direction = #DOWN +a g c a +\override Stem #'direction = #UP +a g c a +\revert Stem #'direction +a g c a +@end lilypond + +Aquí utilizamos las constantes @code{DOWN} (abajo) y @code{UP} +(arriba). Éstos tienen los valores @code{-1} y @code{+1} +respectivamente, y dichos valores numéricos también se pueden usar +directamente. El valor @code{0} también se puede usar en algunos +casos. Se trata simplemente con el significado de @code{UP} para las +plicas, pero para algunos objetos tiene el significado de +@q{centrado}. Existe una constante @code{CENTER} que tiene el valor +@code{0}. + +Sin embargo, estas sobreescrituras no se usan muy a menudo porque +están disponibles instrucciones predefinidas equivalentes más +sencillas. Aquí podemos ver una tabla de las más comunes. Se +menciona el significado de cada una allí donde no es obvio. + +@multitable @columnfractions .2 .2 .2 .4 +@headitem Abajo o Izquierda + @tab Arriba o Derecha + @tab Anular + @tab Efecto +@item @code{\arpeggioDown} + @tab @code{\arpeggioUp} + @tab @code{\arpeggioNeutral} + @tab La flecha está abajo, arriba o no hay flecha +@item @code{\dotsDown} + @tab @code{\dotsUp} + @tab @code{\dotsNeutral} + @tab Dirección del desplazamiento para evitar las líneas del pentagrama +@item @code{\dynamicDown} + @tab @code{\dynamicUp} + @tab @code{\dynamicNeutral} + @tab +@item @code{\phrasingSlurDown} + @tab @code{\phrasingSlurUp} + @tab @code{\phrasingSlurNeutral} + @tab Nota: diferente de las instrucciones de ligaduras de expresión +@item @code{\slurDown} + @tab @code{\slurUp} + @tab @code{\slurNeutral} + @tab +@item @code{\stemDown} + @tab @code{\stemUp} + @tab @code{\stemNeutral} + @tab +@item @code{\textSpannerDown} + @tab @code{\textSpannerUp} + @tab @code{\textSpannerNeutral} + @tab El texto introducido como objeto de extensión está debajo o encima del pentagrama +@item @code{\tieDown} + @tab @code{\tieUp} + @tab @code{\tieNeutral} + @tab +@item @code{\tupletDown} + @tab @code{\tupletUp} + @tab @code{\tupletNeutral} + @tab Los grupos especiales están debajo o encima de las notas +@end multitable + +Observe que estas instrucciones predefinidas @strong{no} pueden ir +precedidas de @code{\once}. Si quiere limitar el efecto a una sola +nota, deberá elegir entre usar la instrucción @code{\once \override} +equivalente, o usar la instrucción predefinida, seguida después de la +nota afectada por la instrucción @code{\xxxNeutral} correspondiente. + +@subheading Fingering +@cindex digitación, colocación + +La colocación de las digitaciones también resulta afectada por el +valor de su propiedad @code{direction}, pero existen instrucciones +especiales que permiten controlar las digitaciones de notas +individuales, situando la digitación encima, debajo, a la izquierda o +a la derecha de cada nota. + +En primer lugar, he aquí el efecto de @code{direction} sobre las +digitaciones; el primer compás muestra el comportamiento +predeterminado, y después el efecto de especificar @code{DOWN} y +@code{UP}: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +c-5 a-3 f-1 c'-5 +\override Fingering #'direction = #DOWN +c-5 a-3 f-1 c'-5 +\override Fingering #'direction = #UP +c-5 a-3 f-1 c'-5 +@end lilypond + +Así es como se controla la digitación sobre notas aisladas, pero la +propiedad @code{direction} se ignora para los acordes. En su lugar, +de forma predeterminada las digitaciones se colocan automáticamente +encima y debajo de las notas del acorde, como se muestra aquí: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] + + + +@end lilypond + +Es posible tener un mayor control sobre la situación exacta de las +digitaciones mediante la utilización de la instrucción @code{\set +fingeringOrientations}. El formato de esta instrucción es + +@example +@code{\set fingeringOrientations = #'([up] [left/right] [down])} +@end example + +@noindent +se utiliza @code{\set} porque @code{fingeringOrientations} es una +propiedad del contexto @code{Voice}, creado y usado por el grabador +@code{New_fingering_engraver}. + +La propiedad se puede establecer al valor de una lista de entre uno y +tres valores. Controla si las digitaciones se pueden colocar por +encima (si @code{up} aparece en la lista), por debajo (si aparece +@code{down}), a la izquierda (si aparece @code{left}) o a la derecha +(si aparece @code{right}). A la inversa, si una colocación no está en +la lista, no se sitúa ninguna digitación en dicho lugar. LilyPond +coma estas restricciones y se trabaja la mejor colocación para la +digitación de las notas de los acordes que siguen. Observe que +@code{left} y @code{right} son mutuamente excluyentes: las +digitaciones pueden situarse en un lado o en el otro, no en los dos. + +Para controlar la colocación de la digitación de una sola nota usando +esta instrucción es necesario escribirla como un acorde de una sola +nota encerrándola entre ángulos simples. + +Aquí podemos ver algunos ejemplos: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +\set fingeringOrientations = #'(left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(up left down) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(up left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(right) + +< c-1 e-2 g-3 b-5 > 4 +@end lilypond + +@noindent +Si la digitación parece un poco superpoblada, se puede reducir el +tamaño @code{font-size}. El valor predeterminado puede verse en el +objeto @code{Fingering} del RFI que es @code{-5}, así que probaremos +@code{-7}: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +\override Fingering #'font-size = #-7 +\set fingeringOrientations = #'(left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(up left down) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(up left) + +< c-1 e-2 g-3 b-5 > 4 +\set fingeringOrientations = #'(right) + +< c-1 e-2 g-3 b-5 > 4 +@end lilypond + +@node Outside staff objects +@subsection Outside staff objects + +Los objetos fuera-del-pentagrama se colocan automáticamente para +evitar las colisiones. Los objetos que tienen el valor más bajo de la +propiedad @code{outside-staff-priority} se sitúan más cerca del +pentagrama, y entonces otros objetos fuera-del-pentagrama se elevan +tanto como sea necesario para evitar la colisión. La prioridad +@code{outside-staff-priority} se defina en el @code{grob-interface} y +así es una propiedad de todos los objetos de presentación. De forma +predeterminada se establece a @code{#f} para todos los objetos +dentro-del-pentagrama, y a un valor numérico adecuado a cada objeto +fuera-del-pentagrama cuando se crea el objeto. La tabla siguiente +presenta los valores numéricos predeterminados para algunos de los +objetos fuera-del-pentagrama que están inicialmente dentro de los +contextos @code{Staff} o @code{Voice}. + +@multitable @columnfractions .3 .3 .3 +@headitem Objeto de presentación + @tab Prioridad + @tab Controla la posición de: +@item @code{MultiMeasureRestText} + @tab @code{450} + @tab Texto sobre silencios de compás completo +@item @code{TextScript} + @tab @code{450} + @tab Elementos de marcado de texto +@item @code{OttavaBracket} + @tab @code{400} + @tab Corchetes de octava alta y baja +@item @code{TextSpanner} + @tab @code{350} + @tab Objetos de extensión de texto +@item @code{DynamicLineSpanner} + @tab @code{250} + @tab Todas las indicaciones dinámicas +@item @code{VoltaBracketSpanner} + @tab @code{100} + @tab Corchetes de primera y segunda vez +@item @code{TrillSpanner} + @tab @code{50} + @tab Trinos mantenidos +@end multitable +He aquí un ejemplo que muestra la situación predeterminada de algunos +de ellos. + +@cindex texto, extensiones de +@funindex \startTextSpan +@funindex \stopTextSpan +@cindex octava alta y baja, corchete de + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +% Set details for later Text Spanner +\override TextSpanner #'bound-details #'left #'text + = \markup { \small \bold Slower } +% Place dynamics above staff +\dynamicUp +% Start Ottava Bracket +#(set-octavation 1) +c' \startTextSpan +% Add Dynamic Text +c\pp +% Add Dynamic Line Spanner +c\< +% Add Text Script +c^Text +c c +% Add Dynamic Text +c\ff c \stopTextSpan +% Stop Ottava Bracket +#(set-octavation 0) +c, c c c +@end lilypond -@node Moving objects -@section Moving objects +Este ejemplo también muestra cómo crear textos con extensión (Text +Spanners) : textos con líneas extensoras por encima de una sección de +música. El extensor abarca desde la instrucción @code{\startTextSpan} +hasta la instrucción @code{\stopTextSpan}, y el formado del texto se +define por medio de la instrucción @code{\override TextSpanner}. Para +ver más detalles, consulte @ruser{Text spanners}. + +También muestra la manera de crear corchetes de octava alta y baja. + +Observe que los números de compás, las indicaciones metronómicas y las +mercas de ensayo no se muestran. De forma predeterminada, se crean +dentro del contexto @code{Score} y su prioridad +@code{outside-staff-priority} se ignora con relación a los objetos de +presentación que se crean dentro del contexto @code{Staff}. Si quiere +colocar los números de compás, indicaciones metronómicas o llamadas de +ensayo en concordancia con el valor de su +@code{outside-staff-priority}, los grabadores +@code{Bar_number_engraver}, @code{Metronome_mark_engraver} o +@code{Mark_engraver} respectivamente se deben eliminar del contexto +@code{Score} y colocarlos en el contexto @code{Staff} del nivel +superior. Si se hace así, estas marcas obtendrán los siguientes +valores predeterminados de @code{outside-staff-priority}: + +@multitable @columnfractions .3 .3 +@headitem Objeto de presentación @tab Prioridad +@item @code{RehearsalMark} @tab @code{1500} +@item @code{MetronomeMark} @tab @code{1000} +@item @code{BarNumber} @tab @code{ 100} +@end multitable -Aunque pueda sorprenderle, LilyPond no es perfecto. Ciertos -elementos de notación se pueden superponer, lo que es una lástima, -pero en casi todos los casos se resuelve fácilmente. +Si los valores predeterminados de @code{outside-staff-priority} no le +ofrecen las colocaciones deseadas se puede sobreescribir la prioridad +de cualquiera de los objetos. Suponga que quisiéramos que el corchete +de octava estuviera situado por debajo del elemento extensor de texto +en el ejemplo de arriba. Todo lo que debemos hacer es localizar la +prioridad de @code{OttavaBracket} en el RFI o en las tablas +anteriores, y reducirlo a un valor inferior al de @code{TextSpanner}, +recordando que @code{OttavaBracket} se crea dentro del contexto de +@code{Staff}: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +% Set details for later Text Spanner +\override TextSpanner #'bound-details #'left #'text + = \markup { \small \bold Slower } +% Place dynamics above staff +\dynamicUp +%Place following Ottava Bracket below Text Spanners +\once \override Staff.OttavaBracket #'outside-staff-priority = #340 +% Start Ottava Bracket +#(set-octavation 1) +c' \startTextSpan +% Add Dynamic Text +c\pp +% Add Dynamic Line Spanner +c\< +% Add Text Script +c^Text +c c +% Add Dynamic Text +c\ff c \stopTextSpan +% Stop Ottava Bracket +#(set-octavation 0) +c, c c c +@end lilypond -@c FIXME: find a better example for 5.1 Moving Objects. -gp -@c yes, I want this TODO to be visible to end-users. It's better -@c than having nothing at all. -HACER: con las nuevas funcionalidades de espaciado en la versión 2.12, estos ejemplos específicos -ya no son de relevancia. Sin embargo siguen demostrando las poderosas funcionalidades de lilypond, -así que quedan aquí hasta que alguien elabore unos ejemplos mejores. +Los cambios en @code{outside-staff-priority} también se pueden emplear +para controlar la situación vertical de los objetos individuales, +aunque los resultados pueden no siempre ser deseables. Suponga que +quiere que @qq{Text3} se sitúe por encima de @qq{Text4} en el ejemplo +bajo el epígrafe Comportamiento Automático de más arriba (véase +@ref{Automatic behaviour}). Todo lo que debemos hacer es localizar la +prioridad de @code{TextScript} en el RFI o en las tablas de arriba, y +aumentar la prioridad de @qq{Text3} hasta un valor superior: @lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -e4^\markup{ \italic ritenuto } g b e +c2^"Text1" +c^"Text2" +\once \override TextScript #'outside-staff-priority = #500 +c^"Text3" +c^"Text4" @end lilypond -@cindex padding +Esto, ciertamente, eleva a @qq{Text3} por encima de @qq{Text4} pero +también lo eleva por encima de @qq{Text2}, y @qq{Text4} ahora se +desploma hacia abajo. Quizá no sea tan buena idea. ¿Y si lo que +realmente queremos hacer es posicionar todas las anotaciones a la +misma distancia por encima del pentagrama? Para hacerlo, vamos a +necesitar claramente espaciar las notas en sentido horizontal para +hacer sitio para el texto. Esto se hace empleando la instrucción +@code{textLengthOn}. + +@subheading \textLengthOn + +@funindex \textLengthOn +@cindex notas, espaciar junto al texto -La solución más fácil es aumentar la distancia entre el objeto -(texto en este caso, pero muy bien podrían ser digitaciones o dinámicas) -y la nota. En LilyPond, esto se llama la propiedad -@code{padding} (relleno); se mide en espacios de pentagrama. Para la mayor -parte de los objetos, este valor ronda la cantidad de 1.0 o menos (varía dependiendo del -objeto). Queremos aumentarlo, así que probaremos el valor 1.5 +De forma predeterminada, el texto producido mediante marcado no ocupa +ningún espacio horizontal en cuanto se refiere a la disposición de la +música. La instrucción @code{\textLengthOn} invierte este +comportamiento, ocasionando que las notas resulten tan espaciadas como +sea necesario para acomodar el texto: @lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -\once \override TextScript #'padding = #1.5 -e4^\markup{ \italic ritenuto } g b e +\textLengthOn % Cause notes to space out to accommodate text +c2^"Text1" +c^"Text2" +c^"Text3" +c^"Text4" @end lilypond -Esto tiene un mejor aspecto, pero no es suficiente. Después de probar -con algunos valores, creemos que 2.3 es el mejor número en este caso. Sin embargo -esta cantidad es el mero resultado del ensayo y error y de mi gusto personal -acerca de la notación. Pruebe el ejemplo anterior con 2.3... pero también con otros valores -mayores (y menores). ¿Cuál cree que queda mejor? +La instrucción para volver al comportamiento predeterminado es +@code{\textLengthOff}. Recuerde que @code{\once} funciona solamente +con @code{\override}, @code{\set}, @code{\revert} o @code{unset}, así +que no se puede usar con @code{\textLengthOn}. -La propiedad @code{staff-padding} (relleno de pentagrama) está estrechamente relacionada. -@code{padding} controla la cantidad de espacio mínima entre un objeto y el objeto más cercano -(generalmente la nota o las líneas del pentagrama); -@code{staff-padding} controla la cantidad mínima de espacio entre un -objeto y el pentagrama. Ello supone una sutil diferencia, pero podrá -observar el comportamiento a continuación. +El texto de marcado también evita las notas que se proyectan por +encima del pentagrama. Si esto no es lo que deseamos, el +desplazamiento automático hacia arriba se puede desactivar mediante el +establecimiento de la prioridad a @code{#f}. He aquí un ejemplo que +muestra cómo el texto de marcado interactúa con tales notas. @lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -c4^"piu mosso" b a b -\once \override TextScript #'padding = #4.6 -c4^"piu mosso" d e f -\once \override TextScript #'staff-padding = #4.6 -c4^"piu mosso" fis a g -\break -c'4^"piu mosso" b a b -\once \override TextScript #'padding = #4.6 -c4^"piu mosso" d e f -\once \override TextScript #'staff-padding = #4.6 -c4^"piu mosso" fis a g +% This markup is short enough to fit without collision +c2^"Tex" +c''2 +R1 +% This is too long to fit, so it is displaced upwards +c,,2^"Text" +c''2 +R1 +% Turn off collision avoidance +\once \override TextScript #'outside-staff-priority = ##f +c,,2^"Long Text " +c''2 +R1 +% Turn off collision avoidance +\once \override TextScript #'outside-staff-priority = ##f +\textLengthOn % and turn on textLengthOn +c,,2^"Long Text " % Spaces at end are honoured +c''2 @end lilypond -@cindex desplazamiento adicional -Otra solución nos proporciona un control absoluto sobre la situación del objeto: podemos -moverlo horizontal o verticalmente. Se hace con la propiedad -@code{extra-offset} (desplazamiento adicional). Es ligeramente más complicado y puede -causar otros problemas. Cuando movemos objetos con @code{extra-offset}, -el movimiento se hace después de que LilyPond haya colocado todos los demás objetos. -Esto significa -que el resultado podría entrar en conflicto con otros objetos. +@subheading Dynamics -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -\once \override TextScript #'extra-offset = #'( 1.0 . -1.0 ) -e4^\markup{ \italic ritenuto } g b e +Las indicaciones de matiz dinámico normalmente se colocarán por debajo +del pentagrama, pero se pueden posicionar por encima con la +instrucción @code{dynamicUp}. Se situarán verticalmente respecto a la +nota a la que van adosadas, y flotarán por debajo (o por encima) de +todos los objetos dentro-del-pentagrama tales como ligaduras de fraseo +y números de compás. Esto puede ofrecer resultados bastante +aceptables, como muestra este ejemplo: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +\clef "bass" +\key aes \major +\time 9/8 +\dynamicUp +bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | +ees,2.~\)\mf ees4 r8 | @end lilypond -Con @code{extra-offset}, el primer número controla el movimiento -horizontal (negativo hacia la izquierda); el segundo número controla el movimiento -vertical (positivo hacia arriba). Después de algunos ensayos, hemos decidido que los siguientes valores -son apropiados +Sin embargo, si las notas y sus indicaciones dinámicas adosadas están +muy cerca, la colocación automática evitará las colisiones desplazando +las marcas dinámicas posteriores más lejos, aunque este puede no ser +el lugar óptimo, como muestra el siguiente ejemplo más bien +artificial: @lilypond[quote,fragment,ragged-right,verbatim,relative=2] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -\once \override TextScript #'extra-offset = #'( -1.6 . 1.0 ) -e4^\markup{ \italic ritenuto } g b e +\dynamicUp +a4\f b\mf c\mp b\p @end lilypond @noindent -Una vez más, estos números son simplemente el resultado de algunos experimentos y -de observar la salida. Quizá prefiera que el texto se encuentre algo más arriba, -o a la izquierda, o en cualquier dirección. ¡Pruébelo y observe el resultado! - -Una advertencia final: en esta sección hemos usado +Si se presentara una situación similar en música @q{real}, podría ser +preferible espaciar las notas un poco más entre sí, de forma que todas +las marcas dinámicas puedan caber a la misma distancia vertical desde +el pentagrama. Hemos sido capaces de hacer esto para el texto de +marcado utilizando la instrucción @code{\textLengthOn}, pero no existe +una instrucción equivalente para las indicaciones de matiz dinámico. +Por tanto, tendremos que averiguar cómo hacerlo utilizando +instrucciones @code{\override}. + +@subheading Grob sizing + +@cindex grob, cambio de tamaño de un +@cindex escala de los grobs +@cindex @code{X-offset} +@cindex @code{Y-offset} +@cindex @code{X-extent} +@cindex @code{Y-extent} + +En primer lugar debemos aprender cómo se especifica el tamaño de los +grobs. Todos los grobs tienen un punto de referencia definido dentro +de ellos que se usa para colocarlos respecto a su objeto padre. +Entonces, este punto del grob se posiciona a una distancia horizontal, +@code{X-offset}, y una distancia vertical, @code{Y-offset}, a partir +de su padre. La dimensión horizontal del objeto viene dada por una +pareja de números, @code{X-extent}, que dice dónde están los límites +izquierdo y derecho respecto del punto de referencia. La amplitud +vertical se define de forma similar mediante una pareja de números, +@code{Y-extent}. Éstas son propiedades de todos los grobs que +contemplan el @code{grob-interface}. + +@cindex @code{extra-spacing-width} + +De forma predeterminada, los objetos fuera-del-pentagrama reciben una +anchura cero, de manera que pueden solaparse en la dirección +horizontal. Esto se hace mediante el truco de añadir una cantidad +infinita a la dimensión más a la izquierda y menos infinito a la +dimensión más a la derecha estableciendo el valor de +@code{extra-spacing-width} a @code{'(+inf.0 . -inf.0)}. Así, para +asegurar que no se superponen en la dirección horizontal tendremos que +sobreescribir este valor de @code{extra-spacing-width} a @code{'(0 +. 0)} de forma que el verdadero ancho se presente. Esta es la +instrucción que lo hace para las indicaciones dinámicas: @example -\once \override TextScript @dots{} +\override DynamicText #'extra-spacing-width = #'(0 . 0) @end example -Esto altera la presentación del texto para la nota siguiente. Si la nota no -tiene ningún texto, este truco no hace nada (y @strong{no} se queda esperando al -siguiente fragmento de texto). Para cambiar el comportamiento permanentemente a partir -del comando, omita el @code{\once}. Para detener este truco, use -@code{\revert} (revertir). Todo esto se explica en profundidad en -@ruser{The \override command}. +@noindent +Veamos si funciona en nuestro ejemplo anterior: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\dynamicUp +\override DynamicText #'extra-spacing-width = #'(0 . 0) +a4\f b\mf c\mp b\p +@end lilypond -@lilypond[quote,fragment,ragged-right,verbatim,relative=3] - % temporary code to break this example: - \override TextScript #'outside-staff-priority = ##f -c4^"piu mosso" b -\once \override TextScript #'padding = #4.6 - a4 b -c4^"piu mosso" d e f -\once \override TextScript #'padding = #4.6 -c4^"piu mosso" d e f -c4^"piu mosso" d e f -\break -\override TextScript #'padding = #4.6 -c4^"piu mosso" d e f -c4^"piu mosso" d e f -\revert TextScript #'padding -c4^"piu mosso" d e f +@noindent +Bueno, ciertamente ha hecho que las marcas dinámicas ya no estén +desplazadas, pero aún quedan dos problemas. Las marcas tendrían que +separarse un poco más entre sí, y sería mejor si todas estuvieran a la +misma distancia del pentagrama. Podemos resolver el primer problema +fácilmente. En vez de hacer cero la anchura +@code{extra-spacing-width}, podemos añadirle algo más. Las unidades +son el espacio entre dos líneas de pentagrama, así que al mover el +límite izquierdo media unidad a la izquierda y el límite derecho media +unidad hacia la derecha, deberíamos conseguirlo: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\dynamicUp +% Extend width by 1 staff space +\override DynamicText #'extra-spacing-width = #'(-0.5 . 0.5) +a4\f b\mf c\mp b\p @end lilypond -@seealso +@noindent +Esto tiene un mejor aspecto, pero quizá habríamos preferido que las +indicaciones de dinámica estuvieran alineadas sobre la misma línea de +base en lugar de ir hacia arriba y hacia abajo con las notas. La +propiedad que lo hace es @code{staff-padding} (relleno de pentagrama) +que se estudia en la sección siguiente. -En el presente manual: @ruser{The \override command}, @ruser{Common tweaks}. +@node Collisions of objects +@section Collisions of objects -@node Fixing overlapping notation -@section Fixing overlapping notation +@menu +* Moving objects:: +* Fixing overlapping notation:: +* Real music example:: +@end menu -En @ruser{Moving objects}, pudimos ver cómo mover un objeto @code{TextScript}. -El mismo mecanismo se puede usar para mover otros tipos de -objetos; simplemente sustituya @code{TextScript} con el nombre de -otro objeto. +@node Moving objects +@subsection Moving objects -Para encontrar el nombre del objeto, consulte la sección @q{@strong{véase también}} al -final de la página relevante dentro de la documentación. Por ejemplo, al -final de @ruser{Dynamics}, vemos +Aunque pueda sorprenderle, LilyPond no es perfecto. Ciertos elementos +de notación se pueden superponer, lo que es una lástima, pero en +realidad es bastante poco frecuente. Normalmente la necesidad de +mover objetos es por claridad o razones estéticas: el aspecto es mejor +con un poco más o un poco menos de espacio de separación. -@quotation -@seealso +Existen tres enfoques principales que llevan a la resolución de +superposiciones en la notación. Se deben considerar en el siguiente +orden: -Referencia del programa: @internalsref{DynamicText}, @internalsref{Hairpin}. -La posición vertical de estos símbolos se maneja por medio de -@internalsref{DynamicLineSpanner}. -@end quotation +@enumerate +@item +La @strong{dirección} de uno de los objetos que se superponen se puede +cambiar usando las instrucciones predefinidas que están relacionadas +arriba para los objetos dentro-del-pentagrama (véase @ref{Within-staff +objects}). Se pueden recolocar fácilmente las plicas, ligaduras de +expresión y de unión, barras de corchea, indicaciones dinámicas, texto +y grupos de valoración especial de esta forma. La limitación es que +sólo tiene la posibilidad de elegir entre dos posiciones, y podría ser +que ninguna de ellas sea la adecuada. -@noindent -Así que para mover expresiones dinámicas verticalmente, usamos +@item +Las @strong{propiedades del objeto}, que LilyPond usa cuando está +colocando los objetos de presentación, se pueden modificar usando la +instrucción de sobreescritura @code{\override}. Las ventadas de hacer +cambios a este tipo de propiedad son: a) que algún otro objeto se +moverá automáticamente si es necesario, para dejarle sitio, y b) una +única sobreescritura se puede aplicar a todas las instancias del mismo +tipo de objeto. Entre tales propiedades se encuentran: +@itemize -@example -\override DynamicLineSpanner #'padding = #2.0 -@end example +@item +@code{direction} (dirección) -No podemos listar todos y cada uno de los objetos, pero presentamos a continuación una lista -de los objetos más comunes. - -@multitable @columnfractions .33 .66 -@headitem Tipo de objeto @tab Nombre del objeto -@item Expresiones dinámicas (verticalmente) @tab @code{DynamicLineSpanner} -@item Expresiones dinámicas (horizontalmente) @tab @code{DynamicText} -@item Ligaduras de unión @tab @code{Tie} -@item Ligaduras de expresión @tab @code{Slur} -@item Articulaciones @tab @code{Script} -@item Digitaciones @tab @code{Fingering} -@item Texto, p.ej. @code{^"text"} @tab @code{TextScript} -@item Llamadas de ensayo o marcas de texto @tab @code{RehearsalMark} -@end multitable +Ya se ha estudiado con cierto detalle: véase @ref{Within-staff +objects}. +@item +@code{padding} (relleno), @code{left-padding} (relleno por la +izquierda), @code{right-padding} (relleno por la derecha), +@code{staff-padding} (relleno de pentagrama) + +@cindex left-padding, propiedad +@cindex padding, propiedad +@cindex right-padding, propiedad +@cindex staff-padding, propiedad +Según un objeto se está colocando, el valor de su propiedad de relleno +@code{padding} especifica el espacio intermedio que se debe dejar +entre él mismo y el límite más próximo del objeto contra el que se +está colocando. Observe que es el valor de @code{padding} del objeto +@strong{que se está colocando} el que se usa; el valor de +@code{padding} del objeto que ya está colocado se ignora. Los +espacios intermedios especificados mediante @code{padding} se pueden +aplicar a todos los objetos que contemplan el interface +@code{side-position-interface}. -@node Common tweaks -@section Common tweaks +En lugar de con @code{padding}, la colocación de los grupos de +alteraciones se controla con @code{left-padding} y +@code{right-padding}. Estas propiedades se encontrarán en el objeto +@code{AccidentalPlacement} que, observe, vive dentro del contexto de +@strong{staff}. Como las alteraciones accidentales siempre se +posicionan según las cabezas de las notas y a su izquierda, solamente +tiene algún efecto la propiedad de relleno por la derecha +@code{right-padding}. + +La propiedad @code{staff-padding} está estrechamente relacionada con +la propiedad @code{padding}: @code{padding} controla la separación +mínima entre cualquier objeto que contemple el interface +@code{side-position-interface} y el objeto más cercano (generalmente +la nota o las líneas del pentagrama); @code{staff-padding} se aplica +sólo a los objetos que siempre se sitúan fuera del pentagrama: +controla la separación mínima entre dicho objeto y el pentagrama. +Observe que @code{staff-padding} no tiene ningún efecto sobre objetos +que se posicionan respecto a la nota en vez de hacerlo respecto al +pentagrama, incluso aunque puede ser sobreescrito sin error por tales +objetos: simplemente se ignora. + +Para descubrir qué propiedad de relleno se necesita para el objeto que +quiere recolocar, debe volver al manual de RFI y buscar las +propiedades del objeto. Tenga cuidado porque las propiedades de +relleno podrían no estar en el objeto más obvio, así que busque en los +objetos que puedan tener alguna relación con él. + +Todos los valores de relleno se miden en espacios del pentagrama. +Para la mayor parte de los objetos el valor se establece de forma +predeterminada en aproximadamente 1.0 o menos (varía con cada objeto). +Se puede sobreescribir si se necesita una separación intermedia mayor +(o menor). -Algunas sustituciones son tan comunes que se proporcionan comandos preestablecidos -como atajos, como @code{\slurUp} (ligadura hacia arriba) y @code{\stemDown} (plica hacia abajo). Estos -comandos se describen dentro de la Referencia de Notación bajo las secciones -correspondientes. +@item +@code{self-alignment-X} (Auto-alineamiento en el eje X) + +@cindex self-alignment-X, propiedad +Esta propiedad se puede usar para alinear el objeto a la izquierda, a +la derecha, o centrarlo con respecto al punto de referencia del objeto +«padre». Se puede usar con todos los objetos que contemplan el +interface +@code{self-alignment-interface}. En general son objetos que contienen +texto. Los valores son @code{LEFT}, @code{RIGHT} o @code{CENTER}. De +forma alternativa se puede especificar un valor numérico entre +@code{-1} y @code{+1}, donde @code{-1} es alineado por la izquierda, +@code{+1} es alineado por la derecha, y los números intermedios mueven +el texto progresivamente desde alineado por la izquierda hasta alineado +por la derecha. Se pueden especificar valores numéricos mayores de +@code{1} para mover el texto incluso más lejos hacia la izquierda, o +menos de @code{-1} para alejarlo más hacia la derecha. Un cambio en +@code{1} en el valor corresponde a un movimiento de la mitad de la +longitud total del propio texto. -La lista completa de modificaciones disponibles para cada tipo de -objeto (como ligaduras o barras de corchea) están documentadas en la Referencia del -Programa. Sin embargo, muchos objetos de la presentación comparten propiedades que se pueden -usar para aplicar trucos genéricos. +@item +@code{extra-spacing-width} (anchura de separación adicional) + +@cindex extra-spacing-width, propiedad +Esta propiedad está disponible para todos los objetos que contemplan +el interface @code{item-interface}. Toma dos números, el primero se +suma al límite izquierdo y el segundo se suma al límite derecho. Los +números negativos desplazan el límite a la izquierda y los positivos a +la derecha, por lo que para ensanchar un objeto el primer número debe +ser negativo y el segundo positivo. Observe que no todos los objetos +ostentan los dos números. Por ejemplo, el objeto @code{Accidental} +(alteración) sólo toma nota del primer número (el borde izquierdo). -@itemize @bullet +@item +@code{staff-position} (posición de pentagrama) -@cindex relleno +@cindex staff-position, propiedad +@code{staff-position} es una propiedad del interface +@code{staff-symbol-referencer-interface}, que está contemplado por los +objetos que se colocan con relación al pentagrama. Especifica la +posición vertical del objeto con relación a la tercera línea del +pentagrama en medios espacios de pentagrama. Es útil en la +resolución de colisiones entre objetos de presentación como silencios +multi-compás, ligaduras de unión y notas en distintas voces. @item -La propiedad @code{padding} (relleno) se puede establecer de forma que incremente -(o disminuya) la distancia entre símbolos que se imprimen encima -o debajo de las notas. Se aplica a todos los objetos con -@code{side-position-interface}. +@code{force-hshift} (forzar desplazamiento horizontal) + +@cindex force-hshift, propiedad + +Las notas muy juntas de un acorde, o aquellas que ocurren al mismo +tiempo en voces distintas, se disponen en dos (y ocasionalmente más) +columnas para evitar la superposición de las cabezas. Éstas reciben +el nombre de columnas de notas, y se crea un objeto llamado +@code{NoteColumn} para disponer las notas en dicha columna. + +La propiedad @code{force-hshift} es una propiedad de una +@code{NoteColumn} (realmente lo es del interface +@code{note-column-interface}). Modificarlo permite mover una columna +de notas en unidades adecuadas a una columna de notas, por ejemplo la +anchura de la cabeza de la nota de la primera voz. Se debe usar en +situaciones complejas donde las instrucciones @code{\shiftOn} normales +(véase @ref{Explicitly instantiating voices}) no resuelven el +conflicto entre las notas. Es preferible a la propiedad +@code{extra-offset} para este propósito porque no hay necesidad de +averiguar la distancia en espacios de pentagrama, y mover las notas +dentro o fuera de una @code{NoteColumn} afecta a otras acciones como a +la fusión entre cabezas de nota. + +@end itemize + +@item +Finalmente, cuando todo lo demás falla, los objetos se pueden +reposicionar manualmente con relación a la tercera línea del +pentagrama verticalmente, o desplazándolas una cierta distancia a una +nueva posición. Las desventajas son que los valores correctos para el +reposicionamiento se deben adivinar, a menudo por ensayo y error, para +cada objeto individual y, puesto que el movimiento se hace después de +que LilyPond ha colocado todos los demás objetos es usuario es +responsable de evitar cualquier colisión que pudiera producirse. Pero +la dificultar principal con este enfoque es que los valores de +reposicionado podrían tener que ser vueltos a calcular si la música se +modifica más tarde. Las propiedades que se pueden usar para este tipo +de posicionamiento manual son: + +@table @code +@item extra-offset (desplazamiento adicional) +@cindex extra-offset, propiedad +Esta propiedad se aplica a cualquier objeto de presentación que +contemple el @code{grob-interface}. Toma una pareja de números que +especifican el desplazamiento adicional en las direcciones horizontal +y vertical. Los números negativos mueven el objeto a la izquierda o +hacia abajo. Las unidades son espacios de pentagrama. El +desplazamiento adicional se hace después de que la composición +tipográfica de los objetos ha terminado, así que un objeto puede ser +reposicionado a cualquier lugar sin afectar a ninguna otra cosa. + +@item positions (posiciones) +@cindex positions, propiedad +Ésta es de la mayor utilidad para ajustar manualmente la inclinación y +la altura de las barras de corchea, ligaduras de expresión y corchetes +de grupos de valoración especial. Toma una pareja de números que dan +la posición de los extremos izquierdo y derecho de la barra, ligadura, +etc. con relación a la tercera línea del pentagrama. Las unidades son +espacios de pentagrama. Observe, sin embargo, que las ligaduras de +expresión y de fraseo no se pueden reposicionar en cantidades +arbitrariamente grandes. LilyPond en primer lugar genera una lista de +posiciones posibles para la ligadura y de forma predeterminada +encuentra la ligadura que tiene @qq{mejor aspecto}. Si la propiedad +@code{positions} se ha sobreescrito, la ligadura que está más cerca de +las posiciones que se han solicitado, se selecciona de la lista. +@end table + +@end enumerate + +Un objeto en particular podría no tener todas estas propiedades. Es +necesario ir al manual RFI para buscar qué propiedades se encuentran +disponibles para el objeto en cuestión. + + +Aquí presentamos una lista de los objetos que es más probable que +estén implicados en colisiones, con el nombre del objeto que habría +que buscar en el RFI para descubrir qué propiedades se deben usar para +moverlos. + +@multitable @columnfractions .5 .5 +@headitem Tipo de objeto @tab Nombre del objeto +@item Articulaciones @tab @code{Script} +@item Barras @tab @code{Beam} +@item Dinámica (verticalmente) @tab @code{DynamicLineSpanner} +@item Dinámica (horizontalmente) @tab @code{DynamicText} +@item Digitaciones @tab @code{Fingering} +@item Llamadas de ensayo y textuales @tab @code{RehearsalMark} +@item Ligaduras de expresión @tab @code{Slur} +@item Texto, por ejemplo @code{^"texto"} @tab @code{TextScript} +@item Ligaduras de unión @tab @code{Tie} +@item Grupos de valoración especial @tab @code{TupletBracket} +@end multitable + + +@node Fixing overlapping notation +@subsection Fixing overlapping notation + +Veamos ahora cómo pueden ser de ayuda las propiedades que hemos visto +en la sección anterior, para resolver problemas de notación que se +superpone. + +@subheading padding property +@cindex relleno, propiedad +@cindex padding, propiedad + +La propiedad @code{padding} se puede ajustar para aumentar (o +disminuir) la distancia entre símbolos impresos encima o debajo de las +notas. @lilypond[quote,fragment,relative=1,verbatim] c2\fermata @@ -243,25 +2322,147 @@ c1 d1 @end lilypond -Observe en el segundo ejemplo cuán importante es determinar qué contexto -maneja un objeto determinado. Debido a que el objeto @code{MetronomeMark} (indicación metronómica) -se maneja en el contexto @code{Score}, los cambios de propiedades dentro del -contexto @code{Voice} no se tendrán en cuenta. Para ver más detalles, consulte -@ruser{Constructing a tweak}. +Observe en el segundo ejemplo la gran importancia que tiene saber qué +contexto maneja un determinado objeto. Puesto que el objeto +@code{MetronomeMark} se maneja dentro del contexto @code{Score}, los +cambios de propiedades en el contexto @code{Voice} pasarán +inadvertidos. Para ver más detalles, consulte @ruser{Constructing a +tweak}. -@cindex extra-offset (desplazamiento adicional) +Si la propiedad de relleno @code{padding} de un objeto se incrementa +cuando dicho objeto se encuentra en una pila de objetos que se están +colocando de acuerdo a su prioridad @code{outside-staff-priority}, +entonces ese objeto se moverá, y también todos los que están por fuera +de él. -@item -La propiedad @code{extra-offset} mueve objetos en la salida; -requiere una pareja de números. El primer número -controla el movimiento horizontal, un número positivo moverá -el objeto hacia la derecha. El segundo número controla el movimiento -vertical; un número positivo lo desplazará hacia arriba. La -propiedad @code{extra-offset} es una funcionalidad de bajo nivel: el motor -de formateo es completamente olvidadizo respecto de estos desplazamientos. -En el ejemplo siguiente, la segunda digitación se desplaza un poco hacia -la izquierda y 1.8 espacios de pentagrama hacia abajo: +@subheading left-padding and right-padding +@cindex left-padding, propiedad +@cindex right-padding, propiedad + +La propiedad @code{right-padding} afecta al espaciado entre la +alteración y la nota a que se aplica. Normalmente no es necesaria, +pero el ejemplo siguiente muestra una situación en la que sí se +necesita. Suponga que queremos presentar un acorde que contiene un Si +natural y un Si bemol. Para evitar la ambigüedad querríamos preceder +las notas con un becuadro y un bemol. Aquí vienen varios intentos de +hacerlo así: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] + + + +@end lilypond + +Ninguno de ellos funciona y el segundo además presenta una fea +colisión entre las dos alteraciones. + +Una forma de conseguirlo es sobreescribir el sello de la alteración +con un elemento de marcado que contenga los símbolos de becuadro y +bemol en el orden que nos gustaría que estuvieran, así: + +@lilypond[quote,ragged-right,verbatim] +naturalplusflat = \markup { \natural \flat } +\relative c'' { + \once \override Accidental + #'stencil = #ly:text-interface::print + \once \override Accidental #'text = #naturalplusflat + \once \override Score.AccidentalPlacement #'right-padding = #1.5 + +} +@end lilypond + +@noindent +Esto utiliza necesariamente una sobreescritura para el sello de la +alteración que no se estudiará hasta más adelante. El tipo de sello +debe ser un procedimiento, aquí modificado para que imprima el +contenido de la propiedad @code{text} del objeto @code{Accidental}, +que a su vez está establecido como un signo de becuadro seguido de un +bemol. Entonces el conjunto se puede separar de la cabeza de la nota +sobreescribiendo @code{right-padding}. + +@noindent + +@subheading staff-padding property +@cindex staff-padding, propiedad + +@code{staff-padding} se puede usar para alinear objetos como matices +dinámicos a lo largo de una línea de base a una altura fija sobre el +pentagrama, en lugar de hacerlo a una altura que dependa de la +posición de la nota a la que están adosados. No es una propiedad de +@code{DynamicText} sino de @code{DynamicLineSpanner}. Esto es así +porque la línea de base debe aplicarse por igual a @strong{todas} las +dinámicas, entre ellas las que se han creado como objetos de +extensión. Así que ésta es la forma de alinear las indicaciones de +matiz en el ejemplo de la sección anterior: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +\dynamicUp +% Extend width by 1 unit +\override DynamicText #'extra-spacing-width = #'(-0.5 . 0.5) +% Align dynamics to a base line 2 units above staff +\override DynamicLineSpanner #'staff-padding = #2 +a4\f b\mf c\mp b\p +@end lilypond + + +@subheading self-alignment-X property +@cindex self-alignment-X, propiedad + +El ejemplo siguiente muestra cómo esto puede resolver la colisión +entre un objeto de digitación de cuerda y la plica de una nota +mediante el alineamiento del límite derecho con el punto de referencia +de la nota «padre»: + +@lilypond[quote,fragment,ragged-right,verbatim,relative=3] +\voiceOne +< a \2 > +\once \override StringNumber #'self-alignment-X = #RIGHT +< a \2 > +@end lilypond + +@subheading staff-position property +@cindex staff-position, propiedad + +Los silencios multi-compás en una voz pueden chocar con las notas en +otra voz. Puesto que estos silencios se tipografían centrados entre +las barras de compás se necesitaría bastante esfuerzo para que +LilyPond averiguara qué otras notas podrían chocar con él, ya que +actualmente todo el manejo de colisiones entre notas y silencios se +hace solamente para notas y silencios que ocurren al mismo tiempo. He +aquí un ejemplo de colisión de este tipo: + +@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +<< {c c c c} \\ {R1} >> +@end lilypond + +La mejor solución aquí es mover el silencio multi-compás hacia abajo, +pues el silencio está en la voz dos. El ajuste predeterminado para +@code{\voiceTwo} (es decir, en la segunda voz de una construcción +@code{<<@{...@} \\ @{...@}>>}) es que @code{staff-position} tenga el +valor -4 para MultiMeasureRest, así que tenemos que bajarlo, digamos, +cuatro semi-espacios de pentagrama, al valor @code{-8}. + +@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +<< + {c c c c} +\\ + \override MultiMeasureRest #'staff-position = #-8 + {R1} +>> +@end lilypond + +Esto es mejor que utilizar, por ejemplo, @code{extra-offset}, porque +la línea adicional por encima del silencio se inserta automáticamente. + +@subheading extra-offset property +@cindex extra-offset, propiedad + +La propiedad @code{extra-offset} da un completo control sobre el +posicionamiento de un objeto tanto vertical como horizontalmente. + +En el ejemplo siguiente, la segunda digitación se desplaza ligeramente +a la izquierda, y 1.8 espacios de pentagrama hacia abajo: @lilypond[quote,fragment,relative=1,verbatim] \stemUp @@ -271,269 +2472,935 @@ f-5 f-5 @end lilypond -@item -El establecimiento de la propiedad @code{transparent} provocará que un objeto se imprima -con @q{tinta invisible}: el objeto no se imprime, pero se conserva todo el resto -de su comportamiento. El objeto aún ocupa un espacio, toma parte en las colisiones, -y se le pueden adjuntar ligaduras de unión o de expresión y barras de corchea. -@cindex objetos transparentes -@cindex quitar objetos -@cindex ocultar objetos -@cindex objetos invisibles -El ejemplo siguiente demuestra cómo conectar distintas voces -utilizando ligaduras. Normalmente las ligaduras sólo unen dos notas de la misma voz. -Al introducir una ligadura en una voz distinta, +@subheading positions property +@cindex positions, propiedad -@lilypond[quote,fragment,relative=2] -<< { - b8~ b8\noBeam -} \\ { - b[ g8] -} >> +La propiedad @code{positions} permite controlar manualmente la +posición e inclinación de los tresillos, ligaduras de expresión y de +fraseo, y barras de corchea. He aquí un ejemplo que tiene una fea +ligadura de fraseo debido a que intenta evitar la ligadura de +expresión que está sobre la acciaccatura. + +@lilypond[quote,verbatim,fragment,ragged-right,relative=1] +r4 \acciaccatura e8\( d8 c ~c d c d\) @end lilypond @noindent -y suprimiendo la primera plica hacia arriba en dicha voz, la ligadura parece cruzarse de una -voz a otra: - +Simplemente podemos mover la ligadura de fraseo por encima de las +notas, y de hecho ésta será la solución preferida: -@lilypond[quote,fragment,relative=2,verbatim] -<< { - \once \override Stem #'transparent = ##t - b8~ b8\noBeam -} \\ { - b[ g8] -} >> +@lilypond[quote,verbatim,fragment,ragged-right,relative=1] +r4 +\phrasingSlurUp +\acciaccatura e8\( d8 c ~c d c d\) @end lilypond -Para asegurarse de que la plica que hemos suprimido no aprieta demasiado a la -ligadura, también alargamos la plica, estableciendo su @code{length} (longitud) a -@code{8}, - -@lilypond[quote,fragment,relative=2,verbatim] -<< { - \once \override Stem #'transparent = ##t - \once \override Stem #'length = #8 - b8~ b8\noBeam -} \\ { - b[ g8] -} >> +@noindent +pero si por algún motivo no pudiéramos hacerlo, la otra alternativa +sería mover el extremo izquierdo de la ligadura de fraseo un poco +hacia abajo usando la propiedad @code{positions}. Esto también +resuelve la forma algo indecente de la ligadura. + +@lilypond[quote,verbatim,fragment,ragged-right,relative=1] +r4 +\once \override PhrasingSlur #'positions = #'(-4 . -3) +\acciaccatura +e8\( d8 c ~c d c d\) @end lilypond -@end itemize +Presentamos un ejemplo más extraído del comienzo del pentagrama de la +mano izquierda del preludio de Chopin Op 28 No. 2. vemos que la barra +choca con las notas superiores: -@cindex Trucos, distancias -@cindex Distancias +@lilypond[quote,verbatim,fragment,ragged-right] +{ +\clef "bass" +<< {b,8 ais, b, g,} \\ {e, g e, g} >> +<< {b,8 ais, b, g,} \\ {e, g e, g} >> +} +@end lilypond -Las distancias en LilyPond se miden en espacios de pentagrama, mientras que -las propiedades de grosor se miden en grosores de líneas de pentagrama. Algunas -propiedades son diferentes; por ejemplo, el grosor de las barras de corchea -se mide en espacios de pentagrama. Para más información, consulte la porción -correspondiente de la referencia del programa. +@noindent +Esto se puede resolver manualmente elevando los dos extremos de la +barra desde su posición a dos espacios de pentagrama sobre la línea +central hasta, digamos, 3 espacios: + +@lilypond[quote,verbatim,fragment,ragged-right] +{ + \clef "bass" + << + \override Beam #'positions = #'(3 . 3) + {b,8 ais, b, g,} + \\ + {e, g e, g} + >> + << {b,8 ais, b, g,} \\ {e, g e, g} >> +} +@end lilypond +@noindent +Observe que la sobreescritura sigue aplicándose en la primera voz del +segundo bloque de corcheas, pero no a ninguna de las barras de la +segunda voz. + +@subheading force-hshift property +@cindex force-hshift, propiedad +@c FIXME: formatting stuff (ie not important right now IMO) +@c @a nchor Chopin finally corrected TODOgp + +Ahora podremos ver cómo aplicar las correcciones finales al ejemplo de +Chopin que presentamos al final de @ref{I'm hearing Voices}, que +dejamos con este aspecto: + +@lilypond[quote,verbatim,fragment,ragged-right] +\new Staff \relative c'' { + \key aes \major + << + { c2 aes4. bes8 } \\ + { aes2 f4 fes } \\ + { \voiceFour + 2 + des2 + } + >> | + 1 | +} +@end lilypond -@menu -* Size of objects:: -@end menu +@noindent +Las dos notas inferiores del primer acorde (es decir, las que están en +al tercera voz) no deberían separarse de la columna de notas de las dos +notas agudas. Para corregir esto, establecemos el valor de +@code{force-hshift} (que es una propiedad de @code{NoteColumn}) de +esas notas a cero. La nota más grave del segundo acorde se sitúa +mejor justo a la derecha de las más agudas. Lo conseguimos +estableciendo el valor de @code{force-hshift} de esta nota a 0.5, o +sea, la anchura de media cabeza de nota a la derecha de la columna de +las notas agudas. + +Presentamos a continuación el resultado final: + +@lilypond[quote,verbatim,fragment,ragged-right] +\new Staff \relative c'' { + \key aes \major + << + { c2 aes4. bes8 } \\ + { aes2 f4 fes } \\ + { \voiceFour + \once \override NoteColumn #'force-hshift = #0 2 + \once \override NoteColumn #'force-hshift = #0.5 des2 + } + >> | + 1 | +} +@end lilypond -@node Size of objects -@subsection Size of objects -UNTRANSLATED NODE: IGNORE ME +@node Real music example +@subsection Real music example + +Finalizaremos esta sección sobre los trucos mostrando los pasos que se +deben tomar para tratar con un ejemplo complicado que necesita varios +trucos para producir el resultado deseado. El ejemplo se ha escogido +deliberadamente para ilustrar el uso de la Referencia de la Notación +para resolver problemas de notación poco comunes. No es +representativo de un proceso de grabado más usual, por lo que ¡le +recomendamos que no deje que estas dificultades le desanimen! +¡Afortunadamente, las dificultades como éstas no son muy comunes! + +El ejemplo está extraído de la Primera Balada de Chopin, Op. 23, +compases 6 al 9, la transición entre el Lento inicial y el Moderato. +Presentamos en primer lugar el aspecto que queremos que tenga el +resultado, pero para evitar complicar demasiado el ejemplo hemos +quitado las indicaciones dinámicas, las digitaciones y el pedal. + +@c The following should appear as music without code +@lilypond[quote,ragged-right] +rhMusic = \relative c'' { + r2 + c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + \override Staff.NoteCollision #'merge-differently-headed = ##t + \override Staff.NoteCollision #'merge-differently-dotted = ##t + bes2.^\markup {\bold "Moderato"} r8 + << + {c,8[ d fis bes a] | } + \\ + % Reposition the c2 to the right of the merged note + {c,8~ \once \override NoteColumn #'force-hshift = #1.0 + % Move the c2 out of the main note column so the merge will work + \shiftOnn c2} + \\ + % Stem on the d2 must be down to permit merging + {s8 \stemDown \once \override Stem #'transparent = ##t d2} + \\ + {s4 fis4.} + >> + \revert Staff.NoteCollision #'merge-differently-headed + \revert Staff.NoteCollision #'merge-differently-dotted + g2.\) +} -@node Default files -@section Default files +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} -La documentación de la Referencia del Programa contiene una gran cantidad de información -sobre LilyPond, pero más información aún se puede obtener a partir de la observación -de los archivos internos de LilyPond. +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond -Algunos ajustes por omisión como las definiciones de las -@code{\header@{@}}s (encabezamientos) están almacenados en archivos @code{.ly}. -Otros ajustes como las definiciones de los comandos de marcado se almacenan -como archivos @code{.scm} (de Scheme). Cae fuera del ámbito de presente manual -cualquier explicación más profunda; los usuarios están advertidos de que se necesita -una considerable cantidad de conocimientos técnicos -para comprender estos archivos. +Observamos en primer lugar que la parte de la mano derecha del tercer +compás requiere cuatro voces. Son las cinco corcheas unidas por una +barra, la nota Do ligada, el Re blanca que se funde con el Re corchea, +y el Fa sostenido negra con puntillo, que también está fundida con la +corchea de su misma altura. Todo lo demás está en una sola voz, así +que lo más fácil es introducir estas cuatro voces temporalmente en el +momento en que se necesiten. Si ha olvidado cómo hacerlo, lea +@ref{I'm hearing Voices}. Vamos a comenzar introduciendo las notas +como dos variables y disponiendo la estructura de pentagramas en un +bloque score, y veremos qué produce LilyPond de forma predeterminada: -@itemize @bullet +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4. g8 | + bes1~ | + \time 6/4 + bes2. r8 + % Start polyphonic section of four voices + << + {c,8 d fis bes a | } + \\ + {c,8~ c2 | } + \\ + {s8 d2 | } + \\ + {s4 fis4. | } + >> + g2. +} -@item Linux: @file{@var{directorio_de_instalación}/lilypond/usr/share/lilypond/current/} +lhMusic = \relative c' { + r2 2 | + 1 | + r2. d,,4 r4 r | + r4 +} -@item OSX: -@file{@var{carpeta_de_instalación}/LilyPond.app/Contents/Resources/share/lilypond/current/}. -Para llegar aquí, o bien entre con @code{cd} en este directorio desde el -Terminal, o haga control-clic sobre la aplicación LilyPond y elija -@q{Mostrar el Contenido del Paquete}. +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond -@item Windows: @file{@var{carpeta_de_instalación}/LilyPond/usr/share/lilypond/current/} +Todas las notas son correctas, pero el aspecto está lejos de ser +satisfactorio. La ligadura de unión choca con el cambio de compás, el +barrado del tercer compás es incorrecto, las notas no se funden +correctamente, y faltan algunos elementos de notación. En primer +lugar trataremos con lo más fácil. Podemos corregir el barrado de las +corcheas insertando una barra manualmente, y podemos añadir fácilmente +la ligadura de expresión de la mano izquierda y la ligadura de fraseo +de la mano derecha, pues todo ello se estudió en el Tutorial. Al +hacerlo así obtenemos: -@end itemize +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4.\( g8 | + bes1~ | + \time 6/4 + bes2. r8 + % Start polyphonic section of four voices + << + {c,8[ d fis bes a] | } + \\ + {c,8~ c2 | } + \\ + {s8 d2 | } + \\ + {s4 fis4. | } + >> + g2.\) +} -Los directorios @file{ly/} y @file{scm/} son de especial interés. -Archivos como @file{ly/property-init.ly} y -@file{ly/declarations-init.ly} definen todos los trucos comunes. +lhMusic = \relative c' { + r2 2( | + 1) | + r2. d,,4 r4 r | + r4 +} +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond -@node Fitting music onto fewer pages -@section Fitting music onto fewer pages +El primer compás ahora es correcto. El segundo compás contiene un +arpegio y acaba en una doble barra. ¿Cómo los hacemos, pues no han +sido mencionados en este Manual de Aprendizaje? Aquí es donde tenemos +que volver e la Referencia de la Notación. Buscando la palabra +@q{arpegio} y @q{línea divisoria} en el índice nos muestra rápidamente +que un arpegio se hace añadiendo @code{\arpeggio} a un acorde, y la +doble barra se produce por medio de la instrucción @code{\bar "||"}. +Esto podemos hacerlo fácilmente. A continuación tenemos que corregir +la colisión entre la ligadura de unión y la indicación de compás. +Esto se hace mejor moviendo la ligadura hacia arriba. Estudiamos cómo +mover objetos anteriormente en @ref{Moving objects}, donde dice que +los objetos que están situados de forma relativa al pentagrama se +pueden mover sobreescribiendo su propiedad @code{staff-position}, que +se especifica en unidades de medio espacio de pentagrama respecto de +la línea central del pentagrama. Así pues, la sobreescritura +siguiente colocada justo antes de la primera nota ligada subirá la +ligadura 3.5 medios espacios de pentagrama por encima de la línea +central: + +@code{\once \override Tie #'staff-position = #3.5} + +Con esto se completa el compás dos, dando como resultado: -A veces puede acabar con uno o dos pentagramas en una segunda página -(o tercera, o cuarta...). Es fastidioso sobre todo si observa las -páginas anteriores y parece haber -espacio suficiente en ellas. +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2. r8 + % Start polyphonic section of four voices + << + {c,8[ d fis bes a] | } + \\ + {c,8~ c2 | } + \\ + {s8 d2 | } + \\ + {s4 fis4. | } + >> + g2.\) +} -Al investigar asuntos relacionados con la presentación, la herramienta -@code{annotate-spacing} (anotar el espaciado) no tiene precio. -Este comando imprime los valores de algunos comandos de espaciado; -consulte @ruser{Displaying spacing} para ver más detalles. A partir de -la salida de de @code{annotate-spacing}, podemos ver qué márgenes podríamos desear alterar. +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} -Aparte de los márgenes, existen otras opciones para ahorrar espacio: +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond -@itemize -@item -Puede indicarle a LilyPond que coloque los sistemas tan juntos como sea -posible (para que quepan tantos sistemas como sea posible sobre una página), -pero luego separar estos sistemas para que no haya ningún espacio vacío -al final de la página. +Vayamos ahora al tercer compás y comienzo de la sección Moderato. El +tutorial nos enseñó cómo escribir texto en negrita mediante la +instrucción @code{\markup}, por lo que añadir @q{Moderato} en negrita +es fácil. Pero ahora ¿cómo fundimos notas que están en distintas +voces? El índice de la Referencia de la Notación no menciona la +mezcla de notas, pero una búsqueda de texto por la palabra @q{fusión} +o @q{mezcla} nos lleva rápidamente a las sobreescrituras necesarias +para mezclar o fusionar notas con distinta cabeza y con o sin puntillo +en @ruser{Collision resolution}. En nuestro ejemplo tenemos que +fusionar ambos tipos de nota en el transcurso de la sección polifónica +del compás 3; por tanto, en virtud de la información que aparece en la +Referencia de la Notación, escribimos @example -\paper @{ - between-system-padding = #0.1 - between-system-space = #0.1 - ragged-last-bottom = ##f - ragged-bottom = ##f -@} +\override Staff.NoteCollision #'merge-differently-headed = ##t +\override Staff.NoteCollision #'merge-differently-dotted = ##t @end example -@item -Puede forzar el número de sistemas (es decir, si LilyPond quiere -tipografiar la música con 11 sistemas, puede forzarlo -para que use 10). +@noindent +al principio de la sección, y @example -\paper @{ - system-count = #10 -@} +\revert Staff.NoteCollision #'merge-differently-headed +\revert Staff.NoteCollision #'merge-differently-dotted @end example -@item -Evite (o reduzca) el uso de objetos que aumenten el tamaño -vertical de un sistema. Por ejemplo, las repeticiones con -primera y segunda vez necesitan espacio adicional. Si -estas repeticiones abarcan dos sistemas, ocuparán más espacio -que un solo sistema con las repeticiones y otro sistema sin ellas. - -Otro ejemplo es desplazar las expresiones dinámicas que se -@q{asoman por encima} de un sistema. +@noindent +al final, dando como resultado: -@lilypond[verbatim,quote,fragment] -\relative c' { - e4 c g\f c - \override DynamicLineSpanner #'padding = #-1.8 - \override DynamicText #'extra-offset = #'( -2.1 . 0) - e4 c g\f c +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2.^\markup {\bold "Moderato"} r8 + \override Staff.NoteCollision #'merge-differently-headed = ##t + \override Staff.NoteCollision #'merge-differently-dotted = ##t + % Start polyphonic section of four voices + << + {c,8[ d fis bes a] | } + \\ + {c,8~ c2 | } + \\ + {s8 d2 | } + \\ + {s4 fis4. | } + >> + \revert Staff.NoteCollision #'merge-differently-headed + \revert Staff.NoteCollision #'merge-differently-dotted + g2.\) } -@end lilypond -@item -Altere el espaciado horizontal por medio de @code{SpacingSpanner}. Consulte -@ruser{Changing horizontal spacing} para ver más detalles. +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} -@lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | - g4 e e2 | f4 d d2 | c4 e g g | c,1 | - d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | - g4 e e2 | f4 d d2 | c4 e g g | c,1 | - } - \layout { - \context { - \Score - \override SpacingSpanner - #'base-shortest-duration = #(ly:make-moment 1 4) - } - } + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> } @end lilypond -@end itemize +Estas sobreescrituras han fundido los dos Fa sostenido, pero no los +dos Re. ¿Por qué no? La respuesta está en la misma sección de la +Referencia de la Notación: las notas que se fusionan deben tener las +plicas en direcciones opuestas y dos notas no se pueden fusionar bien +si hay una tercera nota en la misma columna. Aquí los dos Re tienen +las plicas hacia arriba y hay una tercera nota: el Do. Sabemos cómo +cambiar la dirección de la plica usando @code{\stemDown}, y la +Referencia de la Notación también explica cómo mover el Do: aplicar un +desplazamiento usando una de las instrucciones @code{\shift}. Pero +¿cuál? El Do está en la voz dos que tiene desactivado el +desplazamiento, y los dos Re están en las voces uno y tres, que tienen +el desplazamiento desactivado y activado, respectivamente. Por ello +tenemos que desplazar el Do un nivel más todavía, usando +@code{\shiftOnn} para evitar que interfiera con los dos Re. Al +aplicar estos cambios obtenemos: +@lilypond[quote,verbatim,ragged-right] +rhMusic = \relative c'' { + r2 c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2.^\markup {\bold "Moderato"} r8 + \override Staff.NoteCollision #'merge-differently-headed = ##t + \override Staff.NoteCollision #'merge-differently-dotted = ##t + % Start polyphonic section of four voices + << + {c,8[ d fis bes a] | } + \\ + % Move the c2 out of the main note column so the merge will work + {c,8~ \shiftOnn c2 | } + \\ + % Stem on the d2 must be down to permit merging + {s8 \stemDown d2 | } + \\ + {s4 fis4. | } + >> + \revert Staff.NoteCollision #'merge-differently-headed + \revert Staff.NoteCollision #'merge-differently-dotted + g2.\) +} -@node Advanced tweaks with Scheme -@section Advanced tweaks with Scheme +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} -Hemos visto cómo la salida de LilyPond se puede modificar de manera muy profunda utilizando -comandos como -@code{\override TextScript #'extra-offset = ( 1 . -1)}. Pero -tenemos un potencial incluso mayor si utilizamos Scheme. Para ver una explicación completa -de esto, consulte el @ruser{Scheme tutorial} e -@ruser{Interfaces for programmers}. +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond -Podemos usar Scheme simplemente para sobreponer (@code{\override}) comandos, +Ya casi está. Solamente quedan dos problemas: la plica hacia abajo +sobre el Re fusionado no tendría que estar ahí, y el Do estaría mejor +colocado a la derecha de los Re. Sabemos cómo hacer las dos cosas a +partir de trucos anteriores: hacemos la plica transparente, y movemos +el Do con la propiedad @code{force-hshift}. Aquí tenemos el resultado +final: @lilypond[quote,verbatim,ragged-right] -padText = #(define-music-function (parser location padding) (number?) -#{ - \once \override TextScript #'padding = #$padding -#}) +rhMusic = \relative c'' { + r2 + c4.\( g8 | + \once \override Tie #'staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2.^\markup {\bold "Moderato"} r8 + \override Staff.NoteCollision #'merge-differently-headed = ##t + \override Staff.NoteCollision #'merge-differently-dotted = ##t + << + {c,8[ d fis bes a] | } + \\ + % Reposition the c2 to the right of the merged note + {c,8~ \once \override NoteColumn #'force-hshift = #1.0 + % Move the c2 out of the main note column so the merge will work + \shiftOnn c2} + \\ + % Stem on the d2 must be down to permit merging + {s8 \stemDown \once \override Stem #'transparent = ##t d2} + \\ + {s4 fis4.} + >> + \revert Staff.NoteCollision #'merge-differently-headed + \revert Staff.NoteCollision #'merge-differently-dotted + g2.\) +} + +lhMusic = \relative c' { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} -\relative c''' { - c4^"piu mosso" b a b - \padText #1.8 - c4^"piu mosso" d e f - \padText #2.6 - c4^"piu mosso" fis a g +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> } @end lilypond -Podemos usarlo para crear comandos nuevos, -@lilypond[quote,verbatim,ragged-right] -tempoMark = #(define-music-function (parser location padding marktext) - (number? string?) -#{ - \once \override Score . RehearsalMark #'padding = $padding - \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) - \mark \markup { \bold $marktext } -#}) +@node Further tweaking +@section Further tweaking -\relative c'' { - c2 e - \tempoMark #3.0 #"Allegro" - g c -} +@menu +* Other uses for tweaks:: +* Using variables for tweaks:: +* Other sources of information:: +* Avoiding tweaks with slower processing:: +* Advanced tweaks with Scheme:: +@end menu + +@node Other uses for tweaks +@subsection Other uses for tweaks + +@cindex transparent, uso de la propiedad +@cindex objetos, hace invisibles +@cindex eliminar objetos +@cindex objetos, eliminar +@cindex ocultar objetos +@cindex invisibles, objetos +@cindex ligar notas entre voces distintas + +@subheading Tying notes across voices + +El ejemplo siguiente muestra cómo conectar notas que están en +distintas voces utilizando ligaduras de unión. Normalmente sólo se +pueden conectar mediante ligaduras de unión dos notas que estén en la +misma voz. Usando dos voces, con las notas ligadas en una de ellas: + +@lilypond[quote,fragment,relative=2] +<< { b8~ b8\noBeam } +\\ { b[ g8] } +>> +@end lilypond + +@noindent +y borrando la primera plica hacia arriba en esa voz, da la impresión +de que la ligadura se cruza entre las voces: + +@lilypond[quote,fragment,relative=2,verbatim] +<< + { + \once \override Stem #'transparent = ##t + b8~ b8\noBeam + } +\\ + { b[ g8] } +>> +@end lilypond + +Para estar seguros de que la plica que acabamos de borrar no aprieta +demasiado a la ligadura, podemos alargar la plica estableciendo su +valor de longitud @code{length} a @code{8}, + +@lilypond[quote,fragment,relative=2,verbatim] +<< + { + \once \override Stem #'transparent = ##t + \once \override Stem #'length = #8 + b8~ b8\noBeam + } +\\ + { b[ g8] } +>> @end lilypond -E incluso se le pueden pasar expresiones musicales. +@subheading Simulating a fermata + +@cindex sello, uso de la propiedad +@cindex fermata, realización en MIDI + +Para los objetos fuera-del-pentagrama, normalmente es mejor +sobreescribir la propiedad @code{stencil} («sello») del objeto que su +propiedad @code{transparent} cuando desee quitarlos de la salida +impresa. Mediante el establecimiento de la propiedad @code{stencil} +de un objeto al valor @code{#f} podemos quitar el objeto por completo +de la salida impresa. Esto significa que no tiene efecto sobre la +colocación de otros objetos que pudieran colocarse en relación a él. + +Por ejemplo, si quisiéramos cambiar la indicación metronómica con el +propósito de simular un calderón en la salida MIDI, seguramente no +querríamos que la indicación metronómica apareciese en la salida +impresa, y no querríamos influir sobre la separación entre los dos +sistemas o entre las notas del pentagrama. Por lo tanto, establecer +su propiedad @code{stencil} al valor @code{#f} sería la mejor manera. +Mostramos aquí el efecto de los dos métodos: @lilypond[quote,verbatim,ragged-right] -pattern = #(define-music-function (parser location x y) (ly:music? ly:music?) -#{ - $x e8 a b $y b a e -#}) +\score { + \relative c'' { + % Visible tempo marking + \tempo 4=120 + a4 a a + \once \override Score.MetronomeMark #'transparent = ##t + % Invisible tempo marking to lengthen fermata note in MIDI + \tempo 4=80 + a\fermata + \once \override Score.MetronomeMark #'stencil = ##f + % Invisible tempo marking to restore tempo in MIDI + \tempo 4=120 + a a a a + } + \layout { } + \midi { } +} +@end lilypond + +@noindent +Ambos métodos quitan la indicación metronómica de la salida impresa, y +los dos afectan al tempo del MIDI tal y como queríamos, pero la +primera indicación de metrónomo (la transparente) aún influye sobre la +separación de las notas, mientras que la segunda (sin «sello») no +influye. + +@node Using variables for tweaks +@subsection Using variables for tweaks + +Las instrucciones de sobreescritura son con frecuencia largas y +tediosas de escribir, y se tienen que escribir de forma absolutamente +correcta. Si las mismas sobreescrituras se van a utilizar muchas +veces, podría merecer la pena definir variables para guardarlas. +Suponga que queremos realzar ciertas palabras de la letra de una +canción imprimiéndolas en cursiva y negrita. Las instrucciones +@code{\italic} y @code{\bold} no funcionan dentro de la letra de las +canciones, así que tenemos de usar en su lugar las siguientes +instrucciones @code{\override} y @code{\revert}: + +@example +@code{\override Lyrics . LyricText #'font-shape = #'italic} +@code{\override Lyrics . LyricText #'font-series = #'bold} + +@code{\revert Lyrics . LyricText #'font-shape} +@code{\revert Lyrics . LyricText #'font-series} +@end example -\relative c''{ - \pattern c8 c8\f - \pattern {d16 dis} { ais16-> b\p } +Estas instrucciones serían extremadamente tediosas de escribir si +hubiera muchas palabras que quisiéramos subrayar. Entonces, en vez de +esto las definimos como dos variables, y las usamos de la siguiente +forma: + +@lilypond[quote,verbatim] +emph = { + \override Lyrics . LyricText #'font-shape = #'italic + \override Lyrics . LyricText #'font-series = #'bold +} +norm = { + \revert Lyrics . LyricText #'font-shape + \revert Lyrics . LyricText #'font-series +} + +global = { \time 4/4 \partial 4 \key c \major} +SopMusic = \relative c' { c4 | e4. e8 g4 g | a a g } +AltoMusic = \relative c' { c4 | c4. c8 e4 e | f f e } +TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +VerseOne = \lyrics { E -- | ter -- nal \emph Fa -- ther, \norm | strong to save, } +VerseTwo = \lyricmode { O | \emph Christ, \norm whose voice the | wa -- ters heard, } +VerseThree = \lyricmode { O | \emph Ho -- ly Spi -- rit, \norm | who didst brood } +VerseFour = \lyricmode { O | \emph Tri -- ni -- ty \norm of | love and pow'r } + +\score { + \new ChoirStaff << + \new Staff << + \clef "treble" + \new Voice = "Sop" { \voiceOne \global \SopMusic } + \new Voice = "Alto" { \voiceTwo \AltoMusic } + \new Lyrics \lyricsto "Sop" { \VerseOne } + \new Lyrics \lyricsto "Sop" { \VerseTwo } + \new Lyrics \lyricsto "Sop" { \VerseThree } + \new Lyrics \lyricsto "Sop" { \VerseFour } + >> + \new Staff << + \clef "bass" + \new Voice = "Tenor" { \voiceOne \TenorMusic } + \new Voice = "Bass" { \voiceTwo \BassMusic } + >> + >> } @end lilypond + +@node Other sources of information +@subsection Other sources of information + +La documentación del manual de Referencia de Funcionamiento Interno +contiene montañas de información sobre LilyPond, pero se puede obtener +más información aún leyendo los archivos internos de LilyPond. Para +echarles un vistazo, en primer lugar busque la carpeta correspondiente +a su sistema, de la siguiente forma: + +@strong{Linux} + +Diríjase a +@file{@var{installdir}/lilypond/usr/share/lilypond/current/} + +@strong{MacOS X} + +Diríjase a +@file{@var{installdir}/LilyPond.app/Contents/Resources/share/lilypond/current/} +bien haciendo @code{cd} hacia este directorio desde el Terminal, o +bien manteniendo pulsada la tecla de Control y haciendo click sobre la +aplicación de LilyPond, y allí eligiendo @q{Mostrar el contenido del +paquete}. + +@strong{Windows} + +Mediante el Explorador de Windows, diríjase a +@file{@var{installdir}/LilyPond/usr/share/lilypond/current/} + +Dentro de esta carpeta, las dos subcarpetas interesantes son + +@itemize +@item @file{../ly/ } - contiene archivos en formato LilyPond +@item @file{../scm/} - contiene archivos en formato Scheme +@end itemize + +Vamos a comenzar observando algunos archivos que están en +@file{../ly/}. Abra @file{../ly/property-init.ly} con un editor de +textos. El mismo que usaría normalmente para los archivos @code{.ly} +servirá perfectamente. Este archivo contiene las definiciones de +todas las instrucciones incorporadas como estándar dentro de LilyPond, +como por ejemplo @code{\stemUp} y @code{\slurDotted}. Podrá ver que +no son nada más que definiciones de variables que contienen una o +varias instrucciones @code{\override}. Por ejemplo, @code{/tieDotted} +está definido de tal forma que su valor es: + +@example +tieDotted = @{ + \override Tie #'dash-period = #0.75 + \override Tie #'dash-fraction = #0.1 +@} +@end example + +Si no le gustan los valores predeterminados, estas instrucciones +incorporadas se pueden redefinir con facilidad como cualquier otra +variable, al principio de su archivo de código de entrada. + +Los siguientes son los archivos más útiles que se encuentran en +@file{../ly/}: + +@multitable @columnfractions .4 .6 +@headitem Archivo + @tab Contenido +@item @file{../ly/engraver-init.ly} + @tab Definiciones de Contextos de grabadores +@item @file{../ly/paper-defaults.ly} + @tab especificaciones de valores predeterminados relacionados con el papel +@item @file{../ly/performer-init.ly} + @tab Definiciones de Contextos de interpretación +@item @file{../ly/property-init.ly} + @tab Definiciones de todas las instrucciones incorporadas que son comunes +@end multitable + +Otros ajustes (como las definiciones de las instrucciones de marcado) +se almacenan como archivos @code{.scm} (de Scheme). El lenguaje de +programación Scheme se utiliza para proporcionar un interfaz +programable en el funcionamiento interno de LilyPond. Cualquier +explicación adicional sobre estos archivos se encuentra por el momento +fuera del ámbito de este manual, porque se requieren conocimientos del +lenguaje Scheme. Se advierte a los usuarios que se necesita una +importante cantidad de conocimientos técnicos o de tiempo para +comprender el lenguaje Scheme y estos archivos (véase @ref{Scheme +tutorial}). + +Si ya tiene estos conocimientos, los archivos de Scheme que pueden +interesarle son: + +@multitable @columnfractions .4 .6 +@headitem Archivo + @tab Contenido +@item @file{../scm/auto-beam.scm} + @tab Valores predeterminados de sub-barrado +@item @file{../scm/define-grobs.scm} + @tab valores predeterminados de las propiedades de grobs +@item @file{../scm/define-markup-commands.scm} + @tab Especificar todas las instrucciones de marcado +@item @file{../scm/midi.scm} + @tab Ajustes predeterminados para la salida MIDI +@item @file{../scm/output-lib.scm} + @tab Ajustes que afectan al aspecto de los trastes, colores, alteraciones, lineas divisorias, etc. +@item @file{../scm/parser-clef.scm} + @tab Definiciones de las claves contempladas +@item @file{../scm/script.scm} + @tab Ajustes predeterminados para las articulaciones +@end multitable + + + @node Avoiding tweaks with slower processing -@section Avoiding tweaks with slower processing +@subsection Avoiding tweaks with slower processing LilyPond puede llevar a cabo comprobaciones adicionales al tiempo que -procesa los archivos. Estos comandos consumen tiempo, pero el -resultado puede necesitar menos trucos manuales. +procesa los archivos. Estas instrucciones consumen tiempo, pero el +resultado puede necesitar menos trucos manuales para obtener un +resultado aceptable. Si una inscripción de texto o parte de la letra +se sale de los márgenes, estas comprobaciones comprimirán dicha línea +en la medida justa como para que encaje dentro de los márgenes. + +Para que sean efectivos bajo cualquier circunstancia, estas +comprobaciones deben habilitarse colocando las instrucciones de +sobreescritura dentro del bloque @code{\with} dentro de un Score, y no +en línea con la música, de la forma siguiente: + @example -%% asegura que las marcas de texto y letras de las canciones se encuentran dentro de los márgenes de la página -\override Score.PaperColumn #'keep-inside-line = ##t +\new Score \with @{ + % asegura que las marcas de texto y letras de las canciones se encuentran dentro de los márgenes de la página + \override PaperColumn #'keep-inside-line = ##t + \override NonMusicalPaperColumn #'keep-inside-line = ##t +@} @{ + .. +@} @end example +@node Advanced tweaks with Scheme +@subsection Advanced tweaks with Scheme + +Aunque es posible hacer muchas cosas con las instrucciones +@code{\override} y @code{\tweak} , tenemos una forma incluso más +poderosa de modificar el funcionamiento de LilyPond, a través de un +interface programable hacia las operaciones internas de LilyPond. Se +puede incorporar código escrito en el lenguaje de programación Scheme, +directamente en el mecanismo de funcionamiento de LilyPond. Por +supuesto, para hacer esto se necesitan al menos unos conocimientos +básicos de programación en Scheme, y damos una introducción en el +@ref{Scheme tutorial}. + +Como ejemplo que ilustra una de las muchas posibilidades, en lugar de +dar a una propiedad un valor constante, se puede establecer al +resultado de un procedimiento de Scheme que se invoca cada vez que +LilyPond accede a esta propiedad. La propiedad se puede establecer +dinámicamente a un valor determinado por el procedimiento en el +momento en que se invoca. En este ejemplo damos a las cabezas de las +notas un color que depende de su posición dentro del pentagrama. + +@lilypond[quote,verbatim,ragged-right] +#(define (color-notehead grob) + "Color the notehead according to its position on the staff." + (let ((mod-position (modulo (ly:grob-property grob 'staff-position) 7))) + (case mod-position + ;; Return rainbow colors + ((1) (x11-color 'red )) ; for C + ((2) (x11-color 'orange )) ; for D + ((3) (x11-color 'yellow )) ; for E + ((4) (x11-color 'green )) ; for F + ((5) (x11-color 'blue )) ; for G + ((6) (x11-color 'purple )) ; for A + ((0) (x11-color 'violet )) ; for B + ) + ) +) +\relative c' { + % Arrange to obtain color from color-notehead procedure + \override NoteHead #'color = #color-notehead + c2 c' | + b4 g8 a b4 c | + c,2 a' | + g1 | +} +\addlyrics { + Some -- where o -- ver the Rain -- bow way up high, +} +@end lilypond +Se pueden encontrar ejemplos adicionales que muestran la utilización +de estos interfaces programables, en @ref{Tweaking with Scheme}.