X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Documentation%2Fes%2Fuser%2Fworking.itely;h=d1e2582d26ba694cc4aa7e35c01b8be5c8f3eb39;hb=1423508c355989fa26a8cfe5985b0d6e1ab0a538;hp=54ca78974658f69dbaf733d6d8f00b3ebfe9aa36;hpb=8ceea06f2c26334f50ec15a1e092293fea4fc4bd;p=lilypond.git diff --git a/Documentation/es/user/working.itely b/Documentation/es/user/working.itely index 54ca789746..d1e2582d26 100644 --- a/Documentation/es/user/working.itely +++ b/Documentation/es/user/working.itely @@ -1,12 +1,14 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @c This file is part of lilypond.tely @ignore - Translation of GIT committish: 993fc5189dc039afd51a98df9b71adf59f2ab20f + Translation of GIT committish: 45945bd973aa9161b10e3f517902afb7ef4b4a56 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.12.0" + @node Working on LilyPond projects @chapter Working on LilyPond projects @@ -17,48 +19,52 @@ que lea este capítulo. @menu -* Suggestions for writing LilyPond files:: -* Saving typing with identifiers and functions:: -* Style sheets:: -* Updating old files:: -* Troubleshooting (taking it all apart):: -* Minimal examples:: +* Suggestions for writing LilyPond input files:: +* When things don't work:: +* Scores and parts:: +* Make and Makefiles:: @end menu -@node Suggestions for writing LilyPond files -@section Suggestions for writing LilyPond files +@node Suggestions for writing LilyPond input files +@section Suggestions for writing LilyPond input files -En este momento está preparado para comenzar a escribir archivos de LilyPond más grandes -- no sólo los -pequeños ejemplos que aparecen en el tutorial, sino piezas completas --. Pero ¿cómo debe proceder -para hacerlo? +En este momento está preparado para comenzar a escribir archivos de +LilyPond más grandes -- no sólo los pequeños ejemplos que aparecen en +el tutorial, sino piezas completas --. Pero ¿cómo debe proceder para +hacerlo? -En la medida en que LilyPond entienda sus archivos y produzca la salida que usted -pretendía, realmente no importa mucho qué aspecto tengan sus archivos. Sin embargo -existen algunas otras cosas a tener en cuenta cuando se escriben archivos de LilyPond. +En la medida en que LilyPond entienda sus archivos y produzca la +salida que usted pretendía, realmente no importa mucho qué aspecto +tengan sus archivos. Sin embargo existen algunas otras cosas a tener +en cuenta cuando se escriben archivos de LilyPond. -@itemize @bullet +@itemize @item ¿Qué ocurre si comete un fallo? La estructura de un archivo -lilypond puede hacer que ciertos errores se hagan más fáciles (o más difíciles) de encontrar. +de LilyPond puede hacer que ciertos errores se hagan más fáciles (o +más difíciles) de encontrar. @item ¿Qué ocurre si quiere compartir sus archivos con otras personas? -De hecho, ¿y si quiere alterar sus propios archivos después de algunos años? -Algunos archivos de lilypond se comprenden a primera vista; -otros pueden tenerle rascándose la cabeza -durante una hora. - -@item ¿Qué ocurre si quiere actualizar su archivo de lilypond para poderlo usar con -una versión más reciente del programa? La sintaxis de la entrada se modifica -de forma ocasional según lilypond se va perfeccionando. Casi todos los cambios se pueden -hacer de forma automática con @code{convert-ly}, pero algunos podrían necesitar de una -ayuda manual. Los archivos de LilyPond se pueden estructurar para que sean -más fáciles (o más difíciles) de actualizar. +De hecho, ¿y si quiere alterar sus propios archivos después de algunos +años? Algunos archivos de LilyPond se comprenden a primera vista; +otros pueden tenerle rascándose la cabeza durante una hora. + +@item ¿Qué ocurre si quiere actualizar su archivo de LilyPond para poderlo usar con +una versión más reciente del programa? La sintaxis de la entrada se +modifica de forma ocasional según LilyPond se va perfeccionando. Casi +todos los cambios se pueden hacer de forma automática con +@code{convert-ly}, pero algunos podrían necesitar de una ayuda manual. +Los archivos de LilyPond se pueden estructurar para que sean más +fáciles (o más difíciles) de actualizar. + @end itemize @menu -* General suggestions:: -* Typesetting existing music:: -* Large projects:: +* General suggestions:: +* Typesetting existing music:: +* Large projects:: +* Saving typing with variables and functions:: +* Style sheets:: @end menu @@ -68,50 +74,50 @@ más fáciles (o más difíciles) de actualizar. Presentamos algunas sugerencias que le pueden servir de ayuda para evitar o corregir problemas: -@itemize @bullet -@item @strong{Incluya los números de @code{\version} en todos los archivos}. Dese cuenta de que todas las -plantillas contienen una cadena como @code{\version "2.11.38"}. Le recomendamos -mucho que siempre incluya la @code{\version}, sin importar cuán -pequeño pueda ser su archivo. Desde la experiencia personal podemos decirle que es bastante frustrante -intentar recordar el número de versión de LilyPond que estaba usando hace unos años. -@code{convert-ly} requiere que declare -qué versión de LilyPond utilizó. - -@item @strong{Incluya comprobaciones}: @ruser{Bar check}, @ruser{Octave check} y -@ruser{Barnumber check}. Si -incluye comprobaciones de vez en cuando, en caso de que cometa un error podrá localizarlo mucho más rápidamente. -¿Con qué frecuencia es @q{de vez en cuando}? Depende de la complejidad -de la música. Para una música muy sencilla, quizá tan sólo una o dos veces. Para -una música muy compleja, quizá a cada compás. +@itemize +@item @strong{Incluya los números de @code{\version} en todos los archivos}. Dése cuenta de que todas las +plantillas contienen información sobre la @code{\version}. Le +recomendamos mucho que siempre incluya la @code{\version}, sin +importar cuán pequeño pueda ser su archivo. Desde la experiencia +personal podemos decirle que es bastante frustrante intentar recordar +el número de versión de LilyPond que estaba usando hace unos años. +@code{convert-ly} requiere que declare qué versión de LilyPond +utilizó. + +@item @strong{Incluya comprobaciones}: @ruser{Bar and bar number checks}, +@ruser{Octave checks}. Si incluye comprobaciones de vez en cuando, en +caso de que cometa un error podrá localizarlo mucho más rápidamente. +¿Con qué frecuencia es @q{de vez en cuando}? Depende de la +complejidad de la música. Para una música muy sencilla, quizá tan +sólo una o dos veces. Para una música muy compleja, quizá a cada +compás. @item @strong{Un compás por cada línea de texto}. Si hay algo muy complicado, ya sea -en la propia música -o en la salida que desea producir, a menudo conviene escribir un solo compás -por cada línea. El ahorro en espacio de pantalla que se obtiene al amontonar ocho compases por línea no merece la pena -si luego tiene que @q{depurar} los archivos. +en la propia música o en la salida que desea producir, a menudo +conviene escribir un solo compás por cada línea. El ahorro en espacio +de pantalla que se obtiene al amontonar ocho compases por línea no +merece la pena si luego tiene que @q{depurar} los archivos. @item @strong{Comente los archivos}. Utilice o números de compás (de vez en cuando) -o -referencias a temas musicales (@q{segundo tema de los violines,} @q{cuarta -variación,} etc.). Puede que no necesite comentarios cuando introduce una pieza por vez primera, -pero si quiere volver a ella o modificar algo al cabo de dos o tres años, -y también si le pasa la fuente a un amigo, -será todo un desafío -determinar sus intenciones o de qué manera estaba estructurado el archivo -si no le añadió los comentarios. +o referencias a temas musicales (@q{segundo tema de los violines,} +@q{cuarta variación,} etc.). Puede que no necesite comentarios cuando +introduce una pieza por vez primera, pero si quiere volver a ella o +modificar algo al cabo de dos o tres años, y también si le pasa la +fuente a un amigo, será todo un desafío determinar sus intenciones o +de qué manera estaba estructurado el archivo si no le añadió los +comentarios. @item @strong{Aplique márgenes a las llaves}. Muchos problemas están causados por una -falta de equilibrio -en el número de @code{@{} y @code{@}}. +falta de equilibrio en el número de @code{@{} y @code{@}}. @item @strong{Escriba las duraciones explícitamente} al comienzo de las secciones -e identificadores. Si especifica @code{c4 d e} al principio de una frase -(en lugar de sólo @code{c d e}) se puede ahorrar problemas -si reelabora la música más tarde. +e identificadores. Si especifica @code{c4 d e} al principio de una +frase (en lugar de sólo @code{c d e}) se puede ahorrar problemas si +reelabora la música más tarde. @item @strong{Separe los trucos} de las definiciones musicales. Consulte -@ruser{Saving typing with identifiers and functions} y -@ruser{Style sheets}. +@ref{Saving typing with variables and functions} y +@ref{Style sheets}. @end itemize @@ -119,24 +125,45 @@ si reelabora la música más tarde. @node Typesetting existing music @subsection Typesetting existing music -Si está introduciendo música a partir de una partitura existente (es decir, tipografiando una hoja -de música ya impresa), +Si está introduciendo música a partir de una partitura existente (es +decir, tipografiando una hoja de música ya impresa), -@itemize @bullet +@itemize -@item Introduzca un sistema del manuscrito (la copia física) cada vez (pero mantenga -la práctica de escribir un compás por línea de texto), y -compruebe cada sistema cuando lo haya terminado. Puede usar el comando -@code{showLastLength} para acelerar el proceso -- ver -@ruser{Skipping corrected music} -- . +@item Introduzca en LilyPond un sistema del manuscrito, o copia física, de +cada vez (pero mantenga la práctica de escribir un compás por línea de +texto), y compruebe cada sistema cuando lo haya terminado. Puede usar +las propiedades @code{showLastLength} o @code{showFirstLength} para +acelerar el proceso (véase @ruser{Skipping corrected music}). @item Defina @code{mBreak = @{ \break @}} e inserte @code{\mBreak} -dentro del archivo de entrada donde el manuscrito tenga un saldo de línea. De esta forma -le resultará mucho más fácil comparar la música de LilyPond con la original. -Cuando haya terminado de revisar su partitura podrá -definir @code{mBreak = @{ @}} para quitar todos esos saltos de línea. Así -permitirá a LilyPond colocar los saltos donde éste lo estime -más oportuno. +dentro del archivo de entrada donde el manuscrito tenga un saldo de +línea. De esta forma le resultará mucho más fácil comparar la música +de LilyPond con la original. Cuando haya terminado de revisar su +partitura podrá definir @code{mBreak = @{ @}} para quitar todos esos +saltos de línea. Así permitirá a LilyPond colocar los saltos donde +éste lo estime más oportuno. + +@item Al escribir una parte para un instrumento transpositor dentro de una +variable, se recomienda que las notas estén envueltas dentro de + +@example +\transpose c altura-natural @{...@} +@end example +(donde @code{altura-natural} es la afinación natural del instrumento) +de forma que la música dentro de la variable esté realmente en Do +mayor. Después podemos volver a transportarlas en sentido inverso +cuando se utiliza la variable, si es necesario, pero quizá no queramos +hacerlo (p.ej., al imprimir una partitura en afinación de concierto, +al convertir una parte de trombón de clave de Sol a clave de Fa, +etc.). Es menos probable cometer errores en los transportes si toda +la música que está dentro de las variables se encuentra en un tono +coherente. + +Asimismo, haga los transportes exclusivamente hacia o desde Do mayor. +Esto significa que aparte de ésta, las únicas tonalidades que usaremos +serán los tonos de afinación de los instrumentos transpositores: bes +para una trompeta en Si bemol, aes para un clarinete en La bemol, etc. @end itemize @@ -145,9 +172,9 @@ más oportuno. @subsection Large projects Al trabajar en proyecto grande se hace esencial tener una estructura clara -en los archivos de lilypond. +en los archivos de LilyPond -@itemize @bullet +@itemize @item @strong{Utilice un identificador para cada voz}, con un mínimo de estructura dentro de la definición. La estructura de la sección @@ -169,26 +196,25 @@ g4 c'8. e16 @} @end example -@item @strong{Separe los trucos de las definiciones musicales}. Ya se mencionó -en @ruser{General suggestions}, pero para proyectos -grandes es vital. Quizá tengamos que cambiar la -definición de @code{fthenp}, pero en ese caso sólo lo tendremos que -hacer una vez, y aún podremos evitar tocar nada -dentro de @code{violin}. +@item @strong{Separe los trucos de las definiciones musicales}. +Ya se mencionó con anterioridad, pero para proyectos grandes es vital. +Quizá tengamos que cambiar la definición de @code{fluegop}, pero en ese +caso sólo lo tendremos que hacer una vez, y aún podremos evitar tocar +nada dentro de @code{violin}. @example -fthenp = _\markup@{ +fluegop = _\markup@{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} violin = \relative c'' @{ -g4\fthenp c'8. e16 +g4\fluegop c'8. e16 @} @end example @end itemize -@node Saving typing with identifiers and functions -@section Saving typing with identifiers and functions +@node Saving typing with variables and functions +@subsection Saving typing with variables and functions @cindex variables @cindex identificadores @@ -204,12 +230,13 @@ hornNotes = \relative c'' { c4 b dis c } } @end lilypond -Incluso se dará cuenta de que esto puede ser útil en música minimalista: +Incluso se dará cuenta de que esto puede ser útil en música +minimalista: @lilypond[quote,verbatim,ragged-right] -fragA = \relative c'' { a4 a8. b16 } -fragB = \relative c'' { a8. gis16 ees4 } -violin = \new Staff { \fragA \fragA \fragB \fragA } +fragmentA = \relative c'' { a4 a8. b16 } +fragmentB = \relative c'' { a8. gis16 ees4 } +violin = \new Staff { \fragmentA \fragmentA \fragmentB \fragmentA } \score { { \violin @@ -217,8 +244,9 @@ violin = \new Staff { \fragA \fragA \fragB \fragA } } @end lilypond -Sin embargo también puede usar estos identificadores (que también se conocen como -variables, macros o comandos definidos por el usuario) para hacer trucos: +Sin embargo también puede usar estos identificadores (que también se +conocen como variables, macros o instrucciones definidas por el +usuario) para hacer trucos: @lilypond[quote,verbatim,ragged-right] dolce = \markup{ \italic \bold dolce } @@ -240,12 +268,11 @@ violin = \relative c'' { } @end lilypond -Obviamente estos identificadores son útiles para ahorrar tecleo. -Pero son dignos de tener en cuenta incluso si se van a utilizar una sola vez: -reducen la complejidad. Examinemos -el ejemplo anterior reescrito sin ningún identificador. -Encontrará que es mucho más difícil de leer, sobre todo -la última línea. +Obviamente estos identificadores son útiles para ahorrar tecleo. Pero +son dignos de tener en cuenta incluso si se van a utilizar una sola +vez: reducen la complejidad. Examinemos el ejemplo anterior reescrito +sin ningún identificador. Encontrará que es mucho más difícil de +leer, sobre todo la última línea. @example violin = \relative c'' @{ @@ -259,13 +286,16 @@ violin = \relative c'' @{ @} @end example +@c TODO Replace the following with a better example -td +@c Skylining handles this correctly without padText + Hasta ahora hemos contemplado la sustitución estática: cuando LilyPond se encuentra con @code{\padText}, lo sustituye con aquello que hemos definido que sea (es decir, todo lo que está a la derecha de @code{padtext=}). -LilyPond también puede manejar sustituciones no estáticas (piense en ellas -como en funciones). +LilyPond también puede manejar sustituciones no estáticas (piense en +ellas como en funciones). @lilypond[quote,verbatim,ragged-right] padText = @@ -283,98 +313,105 @@ padText = } @end lilypond -La utilización de identificadores también es una buena forma de reducir el trabajo si -la sintaxis de entrada de LilyPond cambia (ver @ruser{Updating old files}). Si -tiene una sola definición (como p.ej. @code{\dolce}) para todos sus -archivos (ver @ruser{Style sheets}), y después la sintaxis se modifica, sólo tendrá -que actualizar su definición @code{\dolce} única, -en lugar de tener que hacer cambios en cada uno de los archivos @code{.ly}. +La utilización de identificadores también es una buena forma de +reducir el trabajo si la sintaxis de entrada de LilyPond cambia (véase +@ref{Updating old input files}). Si tiene una sola definición (como +p.ej. @code{\dolce}) para todos sus archivos (ver @ref{Style sheets}), +y después la sintaxis se modifica, sólo tendrá que actualizar su +definición @code{\dolce} única, en lugar de tener que hacer cambios en +cada uno de los archivos @code{.ly}. @node Style sheets -@section Style sheets +@subsection Style sheets -La salida que produce LilyPond se puede modificar profundamente; consulte -@ruser{Tweaking output} para leer detalles sobre este asunto. Pero ¿qué ocurre si tiene muchos -archivos a los que les quiere aplicar sus propios trucos? O ¿qué ocurre si, sencillamente, -quiere separar los trucos de la propia música? Todo esto -es bastante fácil de conseguir. +La salida que produce LilyPond se puede modificar profundamente; +consulte @ref{Tweaking output} para leer detalles sobre este asunto. +Pero ¿qué ocurre si tiene muchos archivos a los que les quiere aplicar +sus propios trucos? O ¿qué ocurre si, sencillamente, quiere separar +los trucos de la propia música? Todo esto es bastante fácil de +conseguir. Veamos un ejemplo. No se preocupe si no entiende las partes que tienen todos los @code{#()}. Esto se explicará en -@ruser{Advanced tweaks with Scheme}. +@ref{Advanced tweaks with Scheme}. @lilypond[quote,verbatim,ragged-right] -mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) +mpdolce = #(make-dynamic-script (markup #:hspace 0 #:translate '(5 . 0) #:line(#:dynamic "mp" #:text #:italic "dolce" ))) -tempoMark = #(define-music-function (parser location markp) (string?) -#{ - \once \override Score . RehearsalMark #'self-alignment-X = #left - \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) - \mark \markup { \bold $markp } -#}) + +inst = #(define-music-function (parser location string) (string?) + (make-music + 'TextScriptEvent + 'direction UP + 'text (markup #:bold (#:box string)))) \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 - \tempoMark "Poco piu mosso" + \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 } @end lilypond -Existen varios problemas con la salida que se superpone; los arreglaremos utilizando -las técnicas descritas en @ruser{Moving objects}. Pero también haremos algo respecto a -las definiciones @code{mpdolce} y @code{tempoMark}. Éstas producen la salida que -deseamos, pero quizá las querríamos utilizar en otra pieza. -Podríamos simplemente copiarlas y pegarlas al principio de cada archivo, -pero sería bastante molesto. También hace que se queden las definiciones -a la vista dentro de nuestros archivos de música, y yo personalmente encuentro -todos los @code{#()} bastante poco estéticos. Los vamos a esconder dentro de otro archivo: +Existen varios problemas con la salida que se superpone; los +arreglaremos utilizando las técnicas descritas en @ref{Moving +objects}. Pero también haremos algo respecto a las definiciones +@code{mpdolce} e @code{inst}. Éstas producen la salida que deseamos, +pero quizá las querríamos utilizar en otra pieza. Podríamos +simplemente copiarlas y pegarlas al principio de cada archivo, pero +sería bastante molesto. También hace que se queden las definiciones a +la vista dentro de nuestros archivos de música, y yo personalmente +encuentro todos los @code{#()} bastante poco estéticos. Los vamos a +esconder dentro de otro archivo: @example -%%% guardar esto en un archivo de nombre "definiciones.ly" -mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) +%%% guardar esto en un archivo de nombre "definiciones.ily" +mpdolce = #(make-dynamic-script (markup #:hspace 0 #:translate '(5 . 0) #:line(#:dynamic "mp" #:text #:italic "dolce" ))) -tempoMark = #(define-music-function (parser location markp) (string?) -#@{ - \once \override Score . RehearsalMark #'self-alignment-X = #left - \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) - \mark \markup @{ \bold $markp @} -#@}) + +inst = #(define-music-function (parser location string) (string?) + (make-music + 'TextScriptEvent + 'direction UP + 'text (markup #:bold (#:box string)))) @end example -Ahora modificaremos la música (guardemos este archivo como @file{"musica.ly"}). +Haremos referencia a este archivo utilizando la instrucción +@code{\include} al principio del archivo de música (la extensión +@code{.ily} se utiliza para distinguir este archivo de inclusión --que +se supone que no debe ser procesado de forma independiente-- del +archivo principal). Ahora modificaremos la música (guardemos este +archivo como @file{"musica.ly"}). @c We have to do this awkward example/lilypond-non-verbatim @c because we can't do the \include stuff in the manual. @example -\include "definiciones.ly" +\include "definiciones.ily" \relative c'' @{ \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 - \once \override Score.RehearsalMark #'padding = #2.0 - \tempoMark "Poco piu mosso" + \inst "Clarinete" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 @} @end example @lilypond[quote,ragged-right] -mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) +mpdolce = #(make-dynamic-script (markup #:hspace 0 #:translate '(5 . 0) #:line(#:dynamic "mp" #:text #:italic "dolce" ))) -tempoMark = #(define-music-function (parser location markp) (string?) -#{ - \once \override Score . RehearsalMark #'self-alignment-X = #left - \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) - \mark \markup { \bold $markp } -#}) + +inst = #(define-music-function (parser location string) (string?) + (make-music + 'TextScriptEvent + 'direction UP + 'text (markup #:bold (#:box string)))) \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 - \once \override Score.RehearsalMark #'padding = #2.0 - \tempoMark "Poco piu mosso" + \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 } @end lilypond @@ -385,19 +422,19 @@ la indicación metronómica encima de la clave, en lugar de ir encima de la prim nota. Y por último, mi profesor de composición odia las indicaciones de compás @q{C}, así que la convertiremos en @q{4/4}. -Sin embargo, no debe cambiar el archivo @file{musica.ly}. Sustituya nuestro archivo @file{definiciones.ly} -con éste: +Sin embargo, no debemos cambiar el archivo @file{musica.ly}. +Sustituyamos nuestro archivo @file{definiciones.ily} con éste: @example -%%% definiciones.ly -mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) +%%% definiciones.ily +mpdolce = #(make-dynamic-script (markup #:hspace 0 #:translate '(5 . 0) #:line( #:dynamic "mp" #:text #:italic "dolce" ))) -tempoMark = #(define-music-function (parser location markp) (string?) -#@{ - \once \override Score . RehearsalMark #'self-alignment-X = #left - \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) - \mark \markup @{ \bold $markp @} -#@}) + +inst = #(define-music-function (parser location string) (string?) + (make-music + 'TextScriptEvent + 'direction UP + 'text (markup #:bold (#:box string)))) \layout@{ \context @{ \Score @@ -415,14 +452,14 @@ tempoMark = #(define-music-function (parser location markp) (string?) @end example @lilypond[quote,ragged-right] -mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) +mpdolce = #(make-dynamic-script (markup #:hspace 0 #:translate '(5 . 0) #:line( #:dynamic "mp" #:text #:italic "dolce" ))) -tempoMark = #(define-music-function (parser location markp) (string?) -#{ - \once \override Score . RehearsalMark #'self-alignment-X = #left - \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) - \mark \markup { \bold $markp } -#}) + +inst = #(define-music-function (parser location string) (string?) + (make-music + 'TextScriptEvent + 'direction UP + 'text (markup #:bold (#:box string)))) \layout{ \context { \Score @@ -441,8 +478,7 @@ tempoMark = #(define-music-function (parser location markp) (string?) \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 - \once \override Score.RehearsalMark #'padding = #2.0 - \tempoMark "Poco piu mosso" + \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 } @end lilypond @@ -450,21 +486,21 @@ tempoMark = #(define-music-function (parser location markp) (string?) ¡Eso tiene un aspecto mucho mejor! Ahora suponga que quiere publicar esta pieza. A mi profesor de composición no le gustan las indicaciones de compás @q{C}, pero yo les tengo cierto cariño. Copiaremos el archivo -actual @file{definiciones.ly} a @file{publicar-web.ly} y modificaremos +actual @file{definiciones.ily} a @file{publicar-web.ily} y modificaremos éste. Como el propósito de esta música es producir un PDF que va a mostrarse en la pantalla, también vamos a aumentar el tamaño general de la salida. @example -%%% definiciones.ly -mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) +%%% definiciones.ily +mpdolce = #(make-dynamic-script (markup #:hspace 0 #:translate '(5 . 0) #:line( #:dynamic "mp" #:text #:italic "dolce" ))) -tempoMark = #(define-music-function (parser location markp) (string?) -#@{ - \once \override Score . RehearsalMark #'self-alignment-X = #left - \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) - \mark \markup @{ \bold $markp @} -#@}) + +inst = #(define-music-function (parser location string) (string?) + (make-music + 'TextScriptEvent + 'direction UP + 'text (markup #:bold (#:box string)))) #(set-global-staff-size 23) \layout@{ @@ -482,14 +518,14 @@ tempoMark = #(define-music-function (parser location markp) (string?) @end example @lilypond[quote,ragged-right] -mpdolce = #(make-dynamic-script (markup #:hspace 1 #:translate (cons 5 0) +mpdolce = #(make-dynamic-script (markup #:hspace 0 #:translate '(5 . 0) #:line( #:dynamic "mp" #:text #:italic "dolce" ))) -tempoMark = #(define-music-function (parser location markp) (string?) -#{ - \once \override Score . RehearsalMark #'self-alignment-X = #left - \once \override Score . RehearsalMark #'extra-spacing-width = #'(+inf.0 . -inf.0) - \mark \markup { \bold $markp } -#}) + +inst = #(define-music-function (parser location string) (string?) + (make-music + 'TextScriptEvent + 'direction UP + 'text (markup #:bold (#:box string)))) #(set-global-staff-size 23) \layout{ @@ -506,91 +542,184 @@ tempoMark = #(define-music-function (parser location markp) (string?) \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 - \once \override Score.RehearsalMark #'padding = #2.0 - \tempoMark "Poco piu mosso" + \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 } @end lilypond -Ahora, en la música, simplemente sustituyo -@code{\include "definiciones.ly"} por -@code{\include "publicar-web.ly"}. Por supuesto, podríamos hacer esto aún más -práctico. Podríamos hacer un archivo @file{definiciones.ly} que contuviera -solamente las definiciones de @code{mpdolce} y @code{tempoMark}, un archivo -@file{web-publish.ly} que contuviera solamente la sección @code{\layout} -que se mostró en el ejemplo, y un archivo @file{universidad.ly} que contendría -solamente los trucos para producir la salida que le gusta a mi -profesor. La parte más alta de @file{musica.ly} tendría entonces este aspecto: +Ahora, en la música, simplemente sustituyo @code{\include +"definiciones.ily"} por @code{\include "publicar-web.ily"}. Por +supuesto, podríamos hacer esto aún más práctico. Podríamos hacer un +archivo @file{definiciones.ily} que contuviera solamente las +definiciones de @code{mpdolce} y de @code{inst}, un archivo +@file{publicar-web.ily} que contuviera solamente la sección +@code{\layout} que se mostró en el ejemplo, y un archivo +@file{universidad.ily} que contendría solamente los trucos para +producir la salida que le gusta a mi profesor. El comienzo de +@file{musica.ly} tendría entonces este aspecto: @example -\include "definiciones.ly" +\include "definiciones.ily" %%% ¡Quitar el comentario de una sola de estas líneas! -\include "publicar-web.ly" -%\include "universidad.ly" +\include "publicar-web.ily" +%\include "universidad.ily" @end example -Este enfoque puede ser útil incluso si va a producir sólo un conjunto de particellas. -Yo utilizo media docena de archivos de -@q{hojas de estilo} para mis proyectos. Comienzo todos los archivos de música con -@code{\include "../global.ly"}, que contiene +Este enfoque puede ser útil incluso si va a producir sólo un conjunto +de particellas. Yo utilizo media docena de archivos de @q{hojas de +estilo} para mis proyectos. Comienzo todos los archivos de música con +@code{\include "../global.ily"}, que contiene @example -%%% global.ly +%%% global.ily \version @w{"@version{}"} #(ly:set-option 'point-and-click #f) -\include "../iniciar/iniciar-definiciones.ly" -\include "../iniciar/iniciar-disposicion.ly" -\include "../iniciar/iniciar-cabeceras.ly" -\include "../iniciar/iniciar-papel.ly" +\include "../iniciar/iniciar-definiciones.ily" +\include "../iniciar/iniciar-disposicion.ily" +\include "../iniciar/iniciar-cabeceras.ily" +\include "../iniciar/iniciar-papel.ily" @end example -@node Updating old files -@section Updating old files +@node When things don't work +@section When things don't work + +@menu +* Updating old input files:: +* Common errors:: +* Troubleshooting (taking it all apart):: +* Minimal examples:: +@end menu + +@node Updating old input files +@subsection Updating old input files + +@cindex convert-ly +@cindex actualizar archivos de entrada antiguos -La sintaxis de la entrada de LilyPond cambia de manera ocasional. A medida que el propio -LilyPond mejora, la sintaxis (el lenguaje de la entrada) se modifica en consonancia. A -veces estos cambios se hacen para conseguir que la entrada sea más fácil de leer y escribir, y -otras veces estos cambios son para dar cabida a nuevas funcionalidades de LilyPond. +La sintaxis de la entrada de LilyPond cambia de manera ocasional. A +medida que el propio LilyPond mejora, la sintaxis (el lenguaje de la +entrada) se modifica en consonancia. A veces estos cambios se hacen +para conseguir que la entrada sea más fácil de leer y escribir, y +otras veces estos cambios son para dar cabida a nuevas funcionalidades +de LilyPond. LilyPond lleva incorporado un archivo que facilita esta actualización: -@code{convert-ly}. Para ver detalles sobre cómo ejecutar este programa, consulte -@rprogram{Updating files with convert-ly}. +@code{convert-ly}. Para ver detalles sobre cómo ejecutar este +programa, consulte @rprogram{Updating files with convert-ly}. + +Desgraciadamente @code{convert-ly} no puede tratar todos los cambios +en la entrada. Se ocupa de los cambios sencillos de búsqueda y +sustitución (como @code{raggedright} que se convierte en +@code{ragged-right}), pero algunos cambios son demasiado complicados. +Los cambios de sintaxis que @code{convert-ly} es incapaz de manejar se +relacionan en @rprogram{Updating files with convert-ly}. + +Por ejemplo, en la versión 2.4 y anteriores de LilyPond, los acentos y +las letras no inglesas se introducían utilizando LaTeX: por ejemplo, +@code{No\"el} (que significa @q{Navidad} en francés). En LilyPond 2.6 +y siguientes, el carácter especial @code{ë} debe introducirse +directamente en el archivo de LilyPond como un carácter UTF-8. +@code{convert-ly} no puede cambiar todos los caracteres especiales de +LaTeX a caracteres de UTF-8; tendrá que actualizar manualmente sus +archivos de LilyPond antiguos. + +@node Common errors +@subsection Common errors + +Las condiciones de error que se han descrito más arriba se producen +con frecuencia, aunque su causa no sea obvia o no se pueda encontrar +fácilmente. Una vez se han visto y comprendido, son fáciles de +manejar. + -Desgraciadamente @code{convert-ly} no puede tratar todos los cambios en la entrada. -Se ocupa de los cambios sencillos de búsqueda y sustitución (como @code{raggedright} -que se convierte en @code{ragged-right}), pero algunos cambios son demasiado -complicados. Los cambios de sintaxis que @code{convert-ly} es incapaz de manejar -se relacionan en @rprogram{Updating files with convert-ly}. +@menu +* Music runs off the page:: +* Apparent error in ../ly/init.ly:: +* Error message Unbound variable %:: +@end menu -Por ejemplo, en la versión 2.4 y anteriores de LilyPond, -los acentos y las letras no inglesas se introducían utilizando -LaTeX: por ejemplo, @samp{No\"el} (que significa @q{Navidad} en francés). -En LilyPond 2.6 y siguientes, el carácter especial @samp{ë} -debe introducirse directamente en el archivo de LilyPond como un carácter UTF-8. -@code{convert-ly} no puede cambiar todos los caracteres especiales -de LaTeX a caracteres de UTF-8; tendrá que actualizar manualmente -sus archivos de LilyPond antiguos. +@node Music runs off the page +@unnumberedsubsubsec Music runs off the page + +La música que se sale de la página por el margen derecho o que aparece +exageradamente comprimida está causada casi siempre por haber +introducido una duración incorrecta para una nota, produciendo que la +nota final de un compás se extienda más allá de la línea divisoria. +Esto no es inválido si la nota final de un compás no termina sobre la +línea divisoria introducida automáticamente, pues simplemente se +supone que la nota se solapa encima del siguiente compás. Pero si se +produce una larga secuencia tales notas solapadas, la música puede +aparecer comprimida o salirse de la página porque los saltos de línea +automáticos solamente se pueden insertar al final de compases +completos, es decir, aquellos en que todas las notas terminan antes de +o justo al final del compás. + +@warning{Una duración incorrecta puede hacer que se inhiban los saltos +de línea, lo que llevaría a una sola línea de música muy comprimida o +que se salga de la página.} + +La duración incorrecta se puede encontrar fácilmente si se utilizan +comprobaciones de compás, véase @ruser{Bar and bar number checks}. + +Si realmente quueremos tener una serie de estos compases con notas +solapadas, debemos insertar una línea divisoria invisible donde +queramos el salto de línea. Para ver más detalles, consulte +@ruser{Bar lines}. + +@node Apparent error in ../ly/init.ly +@unnumberedsubsubsec Apparent error in @code{../ly/init.ly} + +Pueden aparecer varios mensajes de error extraños acerca de errores de +sintaxis en @code{../ly/init.ly} si el archivo de entrada no está +correctamente formado, por ejemplo si no contiene llaves o comillas +correctamente emparejados. + +El error más común es la falta de una llave de cierre, (@code{@}}), al +final de un bloque @code{score}. Aquí la solución es obvia: compruebe +que el bloque @code{score} está correctamente cerrado. La estructura +correcta de un archivo de entrada está descrita en @ref{How LilyPond +input files work}. Usando un editor que resalte automáticamente las +llaves correspondientes es de mucha ayuda para evitar estos errores. + +Este mensaje de error también puede aparecer si se omiten las comillas +de terminación (@code{"}). En este caso, un mensaje de error +adicional debería indicar un número de línea cercano al de aquella +donde está el error. Las comillas desbalanceadas estarán por lo +general una o dos líneas por encima. + +@node Error message Unbound variable % +@unnumberedsubsubsec Error message Unbound variable % + +Este mensaje de error aparece al final de los mensajes de la consola o +del archivo de registro junto a un mensaje @qq{GUILE señaló un error +...} cada vez que se llame a una rutina de Scheme que +(incorrectamente) contenga un comentario @emph{de LilyPond} en lugar +de un comentario @emph{de Scheme}. + +Los comentarios de LilyPond comienzan con un símbolo de porcentaje, +(@code{%}), y no se deben utilizar dentro de las rutinas de Scheme. +Los comentarios de Scheme comienzan con punto y coma, (@code{;}). @node Troubleshooting (taking it all apart) -@section Troubleshooting (taking it all apart) +@subsection Troubleshooting (taking it all apart) Antes o después escribirá un archivo que LilyPond no podrá compilar. Los mensajes que LilyPond proporciona pueden ayudarle a encontrar el error, pero en muchos casos tendrá que llevar a cabo algún tipo de investigación para determinar el origen del problema. -Las herramientas más poderosas para este cometido son el -comentario de una sola línea (indicado por @code{%}) y el comentario de bloque -(indicado por @code{%@{ ... %@}}). Si no sabe dónde está -el problema, comience convirtiendo grandes secciones del -archivo de entrada en un comentario. Después de eliminar una -sección convirtiéndola en un comentario, pruebe a compilar el -archivo otra vez. Si funciona, entonces el problema debía estar -en la porción que había eliminado. Si no funciona, continúe eliminando material -(transformándolo en comentarios) hasta que tenga algo que funcione. +Las herramientas más poderosas para este cometido son el comentario de +una sola línea (indicado por @code{%}) y el comentario de bloque +(indicado por @code{%@{ ... %@}}). Si no sabe dónde está el problema, +comience convirtiendo grandes secciones del archivo de entrada en un +comentario. Después de eliminar una sección convirtiéndola en un +comentario, pruebe a compilar el archivo otra vez. Si funciona, +entonces el problema debía estar en la porción que había eliminado. +Si no funciona, continúe eliminando material (transformándolo en +comentarios) hasta que tenga algo que funcione. En un caso extremo podría terminar con sólo @@ -609,9 +738,9 @@ En un caso extremo podría terminar con sólo (en otras palabras: un archivo sin música) Si ocurre esto, no abandone. Descomente un trozo pequeño -- digamos -la parte del bajo -- y observe si funciona. Si no es así, -transforme en comentarios toda la música del bajo (pero deje el -@code{\bajo} de la sección @code{\score} no comentado. +la parte del bajo -- y observe si funciona. Si no es así, transforme +en comentarios toda la música del bajo (pero deje el @code{\bajo} de +la sección @code{\score} no comentado. @example bajo = \relative c' @{ @@ -626,15 +755,15 @@ Ahora empiece poco a poco descomentando cada vez más fracciones de la parte del @code{bajo} hasta que encuentre la línea del problema. Otra técnica de depuración muy útil es la construcción de -@ruser{Minimal examples}. +@ref{Minimal examples}. @node Minimal examples -@section Minimal examples +@subsection Minimal examples Un ejemplo mínimo es un ejemplo tan pequeño como sea posible. Estos -ejemplos son mucho más fáciles de comprender que los ejemplos largos. Los ejemplos -mínimos se utilizan para +ejemplos son mucho más fáciles de comprender que los ejemplos largos. +Los ejemplos mínimos se utilizan para @itemize @item Informes de fallo @@ -645,10 +774,10 @@ mínimos se utilizan para Para construir un ejemplo que sea lo más pequeño posible, la regla es bastante simple: quite todo lo que no sea necesario. Al tratar de -quitar partes innecesarias de un archivo, es una buena idea convertir líneas en -comentarios en vez de borrarlas. De esta forma, si descubre que en realidad -sí @emph{necesitaba} algunas de estas líneas, podrá descomentarlas y no tendrá que -teclearlas de nuevo partiendo de cero. +quitar partes innecesarias de un archivo, es una buena idea convertir +líneas en comentarios en vez de borrarlas. De esta forma, si descubre +que en realidad sí @emph{necesitaba} algunas de estas líneas, podrá +descomentarlas y no tendrá que teclearlas de nuevo partiendo de cero. Existen dos excepciones a la regla del @qq{lo más pequeño posible}: @@ -663,8 +792,497 @@ En resumen, el objetivo de un ejemplo mínimo es que sea fácil de leer: @itemize @item Evite usar notas, tonalidades o compases demasiado complicados, a no ser que quiera demostrar algo sobre el comportamiento de estos elementos precisamente. -@item No use comandos @code{\override} a no ser que ése sea el propósito +@item No use instrucciones @code{\override} a no ser que ése sea el propósito del ejemplo. @end itemize +@node Scores and parts +@section Scores and parts + +En música orquestal, todas las notas se imprimen dos veces. Una vez +en las particellas para los músicos, y otra para la partitura del +director. Los identificadores se pueden usar para evitar la +duplicación del trabajo. La música se escribe una vez y se almacena +en una variable. El contenido de dicha variable se usa después para +generar tanto la particella como la partitura del director. + +Es muy conveniente definir las notas en un archivo especial. Por +ejemplo, supongamos que el archivo @file{trompa.ly} contiene la +siguiente parte de un dúo para trompa y fagot: + +@example +notasTrompa = \relative c @{ + \time 2/4 + r4 f8 a cis4 f e d +@} +@end example + +@noindent +Luego se hace una particella escribiendo en un archivo lo siguiente + +@example +\include "trompa.ly" +\header @{ + instrument = "Trompa en Fa" +@} + +@{ + \transpose f c' \notasTrompa +@} +@end example + +La línea + +@example +\include "trompa.ly" +@end example + +@noindent +sustituye el contenido de @file{trompa.ly} en esta posición dentro del +archivo, así que @code{notasTrompa} se define con posterioridad. La +instrucción @code{\transpose f@tie{}c'} indica que el argumento +constituido por @code{\notasTrompa} se debe transponer una quinta +hacia arriba. Lo que suena como @code{f} se escribe como @code{c'}, +lo que corresponde con el tono de afinación de una trompa normal +en@tie{}Fa. La transposición se puede ver en la siguiente salida + +@lilypond[quote,ragged-right] +\transpose f c' \relative c { + \time 2/4 + r4 f8 a cis4 f e d +} +@end lilypond + +En piezas para conjunto, con frecuencia una de las voces no suena +durante muchos compases. Esto queda denotado por un silencio +especial, el silencio multicompás. Se introduce con una @code{R} +mayúscula seguida de una duración (@code{1}@tie{}en el caso de la +redonda, @code{2}@tie{}en el caso de una blanca, etc.). Multiplicando +la duración se pueden construir silencios más largos. Por ejemplo, +este silencio ocupa 3@tie{}compases de 2/4 + +@example +R2*3 +@end example + +Cuando se imprime la particella tienen que comprimirse los silencios +multicompás. Esto se hace estableciendo una variable en tiempo de +ejecución + +@example +\set Score.skipBars = ##t +@end example + +@noindent +Esta instrucción establece el valor de la propiedad @code{skipBars} en +el contexto de @code{Score} a verdadero (@code{##t}). Anteponiendo el +silencio y esta opción a la música anterior, llegamos al siguiente +resultado + +@lilypond[quote,ragged-right] +\transpose f c' \relative c { + \time 2/4 + \set Score.skipBars = ##t + R2*3 + r4 f8 a cis4 f e d +} +@end lilypond + + +Esta partitura se hace combinando toda la música junta. Suponiendo +que la otra voz se encuentra dentro de @code{notasFagot} en el archivo +@file{fagot.ly}, la partitura se hace con + +@example +\include "fagot.ly" +\include "trompa.ly" + +<< + \new Staff \notasTrompa + \new Staff \notasFagot +>> +@end example + +@noindent +lo que nos lleva a + +@lilypond[quote,ragged-right] +\relative c << + \new Staff { + \time 2/4 R2*3 + r4 f8 a cis4 f e d + } + \new Staff { + \clef bass + r4 d,8 f | gis4 c | b bes | + a8 e f4 | g d | gis f + } +>> +@end lilypond + + +@node Make and Makefiles +@section Make and Makefiles + +@cindex make, archivos de +@cindex make + +Posiblemente todas las plataformas en que puede correr LilyPond, +contemplan una posibilidad de software llamada @code{make}. Este +programa lee un archivo especial llamado @code{Makefile} que define +las relaciones de dependencia entre los archivos y qué instrucciones +necesitamos dar al sistema operativo para producir un archivo a partir +de otro. Por ejemplo, el archivo de make detallaría cómo obtener +@code{balada.pdf} y @code{balada.midi} a partir de @code{balada.ly} +mediante la ejecución de Lilypond. + +Existen ocasiones en las que es buena idea crear un @code{Makefile} +para nuestro proyecto, bien sea por nuestra propia comodidad o como +cortesía para otros que posiblemente tengan acceso a nuestros archivos +fuente. Esto es cierto para proyectos muy grandes con muchos archivos +de inclusión y distintas opciones de salida (p.ej. partitura completa, +particellas, partitura del director, reducción para piano, etc.), o +para proyectos que requieren instrucciones difíciles para montarlas +(como los proyectos de @code{lilypond-book}). La complejidad y +flexibilidad de los Makefiles varía enormemente según las necesidades +y la habilidad de los autores. El programa GNU Make viene instalado +en las distribuciones de GNU/Linux y en MacOS X, y también existe para +Windows. + +Consulte el @strong{Manual de GNU Make} para ver todos los detalles +sobre el uso de @code{make}, pues lo que sigue a continuación ofrece +solamente una pincelada de todo lo que es capaz de hacer. + +Las instrucciones que definen las reglas en un archivo de make +difieren en función de la plataforma; por ejemplo, las distintas +formas de Linux y MacOS usan @code{bash}, mientras que Windows usa +@code{cmd}. Observeque en MacOS X, tenemos que configurar el sistema +para que utilice el intérprete de órdenes. A continuación presentamos +algunos makefiles de ejemplo, con versiones tanto para Linux/MacOS +como para Windows. + +El primer ejemplo es para una obra orquestal en cuatro movimientos con +la estructura de directorios siguiente: + +@example +Sinfonia/ +|-- MIDI/ +|-- Makefile +|-- Notas/ +| |-- cello.ily +| |-- cifras.ily +| |-- trompa.ily +| |-- oboe.ily +| |-- trioCuerdas.ily +| |-- viola.ily +| |-- violinUno.ily +| `-- violinDos.ily +|-- PDF/ +|-- Particellas/ +| |-- sinfonia-cello.ly +| |-- sinfonia-trompa.ly +| |-- sinfonia-oboes.ly +| |-- sinfonia-viola.ly +| |-- sinfonia-violinUno.ly +| `-- sinfonia-violinDos.ly +|-- Partituras/ +| |-- sinfonia.ly +| |-- sinfoniaI.ly +| |-- sinfoniaII.ly +| |-- sinfoniaIII.ly +| `-- sinfoniaIV.ly +`-- sinfoniaDefs.ily +@end example + +Los archivos @code{.ly} de los directorios @code{Partituras} y +@code{Particellas} obtienen las notas de archivos @code{.ily} que están en +el directorio @code{Notas}: + +@example +%%% principio del archivo "sinfonia-cello.ly" +\include ../definiciones.ily +\include ../Notas/cello.ily +@end example + +El makefile tendrá los objetivos de @code{partitura} (la pieza +completa en todo su esplendor), @code{movimientos} (partitura completa +de los movimientos individuales) y @code{particellas} (partes +individuales para los atriles). También existe un objetivo +@code{archivo} que produce un tarball de los archivos fuente, adecuado +para compartirlo a través de la web o por correo electrónico. A +continuación presentamos el makefile para GNU/Linux o MacOS X. Se +debe guardar con el nombre exacto @code{Makefile} el el directorio +superior del proyecto: + +@warning{Cuando se define un objetivo o una regla de patrón, las +líneas siguientes deben comenzar con tabuladores, no con espacios.} + +@example +# nombre principal de los archivos de salida +nombre = sinfonia +# determinar cuántos procesadores existen +CPU_CORES=`cat /proc/cpuinfo | grep -m1 "cpu cores" | sed s/".*: "//` +# La instrucción para ejecutar lilypond +LILY_CMD = lilypond -ddelete-intermediate-files \ + -dno-point-and-click -djob-count=$(CPU_CORES) + +# Los sufijos utilizados en este Makefile. +.SUFFIXES: .ly .ily .pdf .midi + +# Los archivos de entrada y salida se buscan dentro de los directorios relacionados en +# la variable VPATH. Todos esllos son subdirectorios del directorio +# en curso (dado por la variable de GNU make `CURDIR'). +VPATH = \ + $(CURDIR)/Partituras \ + $(CURDIR)/PDF \ + $(CURDIR)/Particellas \ + $(CURDIR)/Notas + +# La regla de patrón para crear archivos PDF y MIDI a partir de un archivo de entrada LY. +# Los archivos de salida .pdf se colocan en el subdirectorio `PDF', y los archivos +# .midi van al subdirectorio `MIDI'. +%.pdf %.midi: %.ly + $(LILY_CMD) $<; \ # esta línea comienza con un salto de tabulación + if test -f "$*.pdf"; then \ + mv "$*.pdf" PDF/; \ + fi; \ + if test -f "$*.midi"; then \ + mv "$*.midi" MIDI/; \ + fi + +notas = \ + cello.ily \ + trompa.ily \ + oboe.ily \ + viola.ily \ + violinUno.ily \ + violinDos.ily + +# Dependencias de los movimientos. +$(nombre)I.pdf: $(nombre)I.ly $(notas) +$(nombre)II.pdf: $(nombre)II.ly $(notas) +$(nombre)III.pdf: $(nombre)III.ly $(notas) +$(nombre)IV.pdf: $(nombre)IV.ly $(notas) + +# Dependencias de la partitura completa. +$(nombre).pdf: $(nombre).ly $(notas) + +# Dependencias de las particellas. +$(nombre)-cello.pdf: $(nombre)-cello.ly cello.ily +$(nombre)-trompa.pdf: $(nombre)-trompa.ly trompa.ily +$(nombre)-oboes.pdf: $(nombre)-oboes.ly oboe.ily +$(nombre)-viola.pdf: $(nombre)-viola.ly viola.ily +$(nombre)-violinUno.pdf: $(nombre)-violinUno.ly violinUno.ily +$(nombre)-violinDos.pdf: $(nombre)-violinDos.ly violinDos.ily + +# Teclee `make partitura' para generer la partitura completa de los cuatro +# movimientos como un archivo único. +.PHONY: partitura +partitura: $(nombre).pdf + +# Teclee `make particellas' para generar todas las particellas. +# Teclee `make fulanito.pdf' para generar la particella del instrumento `fulanito'. +# Ejemplo: `make sinfonia-cello.pdf'. +.PHONY: particellas +particellas: $(nombre)-cello.pdf \ + $(nombre)-violinUno.pdf \ + $(nombre)-violinDos.pdf \ + $(nombre)-viola.pdf \ + $(nombre)-oboes.pdf \ + $(nombre)-trompa.pdf + +# Teclee `make movimientos' para generar los archivos de los +# cuatro movimientos de forma separada. +.PHONY: movimientos +movimientos: $(nombre)I.pdf \ + $(nombre)II.pdf \ + $(nombre)III.pdf \ + $(nombre)IV.pdf + +all: partitura particellas movimientos + +archivo: + tar -cvvf stamitz.tar \ # esta línea comienza con un salto de tabulación + --exclude=*pdf --exclude=*~ \ + --exclude=*midi --exclude=*.tar \ + ../Stamitz/* +@end example + + +Existen ciertas complicaciones en la plataforma Windows. Después de +descargar e instalar el programa GNU Make para Windows, debemos +configurar la ruta adecuada en las variables de entorno del sistema de +forma que el shell del DOS pueda encontrar el programa Make. Para +hacerlo, pulse con el botón derecho sobre "Mi PC", elija +@code{Propiedades} y @code{Avanzadas}. Pulse sobre @code{Variables de +entorno}, y luego en la pestaña @code{Variables del sistema}, +seleccione @code{Ruta}, pulse sobre @code{editar} y añada la ruta al +archivo ejecutable de GNU Make, con lo que quedará algo parecido a lo +siguiente: + +@example +C:\Archivos de programa\GnuWin32\bin +@end example + +El makefile en sí debe modificarse para que maneje distintas +instrucciones del shell y para que pueda tratar con los espacios que +aparecen en el nombre de algunos directorios del sistema +predeterminados. El objetivo @code{archivo} se elimina porque Windows +no tiene la instrucción @code{tar}, y Windows tiene también una +extensión predeterminada distinta para los archivos MIDI. + + +@example +## VERSIÓN PARA WINDOWS +## +nombre = sinfonia +LILY_CMD = lilypond -ddelete-intermediate-files \ + -dno-point-and-click \ + -djob-count=$(NUMBER_OF_PROCESSORS) + +#obtener el nombre 8.3 de CURDIR (rodeo para los espacios en PATH) +workdir = $(shell for /f "tokens=*" %%b in ("$(CURDIR)") \ + do @@echo %%~sb) + +.SUFFIXES: .ly .ily .pdf .mid + +VPATH = \ + $(workdir)/Partituras \ + $(workdir)/PDF \ + $(workdir)/Particellas \ + $(workdir)/Notas + +%.pdf %.mid: %.ly + $(LILY_CMD) $< # esta línea comienza con un salto de tabulación + if exist "$*.pdf" move /Y "$*.pdf" PDF/ # comienzo con tab + if exist "$*.mid" move /Y "$*.mid" MIDI/ # comienzo con tab + +notas = \ + cello.ily \ + cifras.ily \ + trompa.ily \ + oboe.ily \ + trioCuerdas.ily \ + viola.ily \ + violinUno.ily \ + violinDos.ily + +$(nombre)I.pdf: $(nombre)I.ly $(notas) +$(nombre)II.pdf: $(nombre)II.ly $(notas) +$(nombre)III.pdf: $(nombre)III.ly $(notas) +$(nombre)IV.pdf: $(nombre)IV.ly $(notas) + +$(nombre).pdf: $(nombre).ly $(notas) + +$(nombre)-cello.pdf: $(nombre)-cello.ly cello.ily +$(nombre)-trompa.pdf: $(nombre)-trompa.ly trompa.ily +$(nombre)-oboes.pdf: $(nombre)-oboes.ly oboe.ily +$(nombre)-viola.pdf: $(nombre)-viola.ly viola.ily +$(nombre)-violinUno.pdf: $(nombre)-violinUno.ly violinUno.ily +$(nombre)-violinDos.pdf: $(nombre)-violinDos.ly violinDos.ily + +.PHONY: partitura +partitura: $(nombre).pdf + +.PHONY: particellas +particellas: $(nombre)-cello.pdf \ + $(nombre)-violinUno.pdf \ + $(nombre)-violinDos.pdf \ + $(nombre)-viola.pdf \ + $(nombre)-oboes.pdf \ + $(nombre)-trompa.pdf + +.PHONY: movimientos +movimientos: $(nombre)I.pdf \ + $(nombre)II.pdf \ + $(nombre)III.pdf \ + $(nombre)IV.pdf + +all: partitura particellas movimientos +@end example + + +El Makefile siguiente es para un documento de @command{lilypond-book} +hecho en LaTeX. Este proyecto tiene un índice, que requiere ejecutar +la instrucción @command{latex} dos veces para actualizar los enlaces. +Todos los archivos de salida se almacenan en el directorio +@code{salida} para los documentos .pdf y en el directorio +@code{salidahtml} para la salida en formato html. + +@example +SHELL=/bin/sh +NOMBRE=miproyecto +DIR_SALIDA=salida +DIR_WEB=salidahtml +VISOR=acroread +NAVEGADOR=firefox +LILYBOOK_PDF=lilypond-book --output=$(DIR_SALIDA) --pdf $(NOMBRE).lytex +LILYBOOK_HTML=lilypond-book --output=$(DIR_WEB) $(NOMBRE).lytex +PDF=cd $(DIR_SALIDA) && pdflatex $(NOMBRE) +HTML=cd $(DIR_WEB) && latex2html $(NOMBRE) +INDICE=cd $(DIR_SALIDA) && makeindex $(NOMBRE) +VISTA_PREVIA=$(VISOR) $(DIR_SALIDA)/$(NOMBRE).pdf & + +all: pdf web guardar + +pdf: + $(LILYBOOK_PDF) # comienza con un tab + $(PDF) # comienza con un tab + $(INDICE) # comienza con un tab + $(PDF) # comienza con un tab + $(VISTA_PREVIA) # comienza con un tab + +web: + $(LILYBOOK_HTML) # comienza con un tab + $(HTML) # comienza con un tab + cp -R $(DIR_WEB)/$(NOMBRE)/ ./ # comienza con un tab + $(NAVEGADOR) $(NOMBRE)/$(NOMBRE).html & # comienza con un tab + +guardar: pdf + cp $(DIR_SALIDA)/$(NOMBRE).pdf $(NOMBRE).pdf # comienza con un tab + +clean: + rm -rf $(DIR_SALIDA) # comienza con un tab + +web-clean: + rm -rf $(DIR_WEB) # comienza con un tab + +archivo: + tar -cvvf miproyecto.tar \ # comienza con un tab + --exclude=salida/* \ + --exclude=salidahtml/* \ + --exclude=miproyecto/* \ + --exclude=*midi \ + --exclude=*pdf \ + --exclude=*~ \ + ../MiProyecto/* +@end example + +HACER: conseguir que funcione en Windows + +El makefile anterior no funciona en Windows. Una alternativa para los +usuarios de Windows sería crear un archivo de lotes sencillo que +contenga las instrucciones de montaje. Esto no rastrea las +dependencias en la manera en que lo hace un makefile, pero al menos +reduce el proceso de construcción a una sola instrucción. Guarde el +código siguiente como @command{montaje.bat} o @command{montaje.cmd}. +El archivo de lotes se puede ejecutar en la línea de comandos del DOS +o simplemente haciendo doble click sobre su icono. + +@example +lilypond-book --output=salida --pdf miproyecto.lytex +cd salida +pdflatex miproyecto +makeindex miproyecto +pdflatex miproyecto +cd .. +copy salida\miproyecto.pdf MiProyecto.pdf +@end example + + +@seealso +Manual de utilización del programa: +@rprogram{Setup for MacOS X}, +@rprogram{Command-line usage}, +@rprogram{LilyPond-book}