@node Post patch for comments
@subsection Post patch for comments
-For any change other than a minor change, a patch set should be
-posted on @uref{http://codereview.appspot.com/, Rietveld} for comment.
-This requires the use of an external package, git-cl, and an email
-account on Google.
-
-git-cl is installed by:
-
-@example
-git clone git://neugierig.org/git-cl.git
-@end example
-
-Then, add the git-cl directory to your PATH, or create a
-symbolic link to the git-cl and upload.py in one of your
-PATH directories (like usr/bin). git-cl is then
-configured by entering the command
-
-@example
-git cl config
-@end example
-
-@noindent
-in the LilyPond git directory and answering the questions that
-are asked. If you do not understand the question answer with just
-a newline (CR).
-
-The patch set is posted to Rietveld as follows. Ensure your changes
-are committed in a separate branch, which should differ from the
-reference branch to be used by just the changes to be uploaded.
-If the reference branch is to be origin/master, ensure this is
-up-to-date. If necessary, use git rebase to rebase the branch
-containing the changes to the head of origin/master. Finally,
-check out branch with the changes and enter the command:
-
-@example
-git cl upload <reference SHA1 ID>
-@end example
-
-@noindent
-where <reference SHA1 ID> is the SHA1 ID of the commit to be used
-as a reference source for the patch. Generally, this will be the
-SHA1 ID of origin/master, and in that case the command
-
-@example
-git cl upload origin/master
-@end example
-
-@noindent
-can be used.
-
-After prompting for your Google email address and password, the
-patch set will be posted to Rietveld.
-
-You should then announce the patch by sending
-an email to lilypond-devel, with a subject line
-starting with PATCH:, asking for comments on the patch.
-Alternately, you may Publish + Mail a (bogus) comment, in order
-to send an email to lilypond-devel.
-
-As revisions are made in response to comments, successive patch sets
-for the same issue can be uploaded by reissuing the git-cl command
-with the modified branch checked out.
-
-Sometimes in response to comments on revisions, the best way to
-work may require creation of a new branch in git. In order to
-associate the new branch with an existing Rietveld issue,
-the following command can be used:
-
-@example
-git cl issue issue-number
-@end example
-
-@noindent
-where @code{issue-number} is the number of the existing Rietveld
-issue.
-
+See @ref{Uploading a patch for review}.
@node Push patch
* Making commits::
* Commit messages::
* Making patches::
+* Uploading a patch for review::
@end menu
@node Making patches
@unnumberedsubsubsec Making patches
-
If you want to share your changes with other contributors and
developers, you need to generate @emph{patches} from your commits.
+We prefer it if you follow the instructions in
+@ref{Uploading a patch for review}. However, we present an
+alternate method here.
+
You should always run @command{git@tie{}pull@tie{}-r} (translators
should leave off the @code{-r}) before doing this to ensure that
your patches are as current as possible.
reviewed, the developers may push one or more of them to the main
repository or discuss them with you.
-@seealso
-If your patch includes a significant amount of code, you may want
-to see @ref{Adding or modifying features}, especially @emph{Post
-patch for comments}.
+@node Uploading a patch for review
+@unnumberedsubsubsec Uploading a patch for review
+
+Any non-trivial change should be uploaded to our @qq{Rietveld}
+code review website:
+
+@example
+@uref{http://codereview.appspot.com/}
+@end example
+
+@subsubheading Initial setup
+
+This requires the use of an external package, git-cl, and an email
+account on Google.
+
+@command{git-cl} is installed by:
+
+@example
+git clone git://neugierig.org/git-cl.git
+@end example
+
+Then, add the @file{git-cl} directory to your PATH, or create a
+symbolic link to the @command{git-cl} and @command{upload.py} in
+one of your PATH directories (like @file{usr/bin}). Then
+configure the program by running:
+
+@example
+git cl config
+@end example
+
+@noindent
+in the LilyPond git directory and answering the questions that
+are asked. If you do not understand the question answer with just
+a newline (CR).
+
+@subsubheading Uploading patch set
+
+There are two methods, depending on your git setup.
+
+@itemize
+@item
+@strong{Separate branch}:
+
+Ensure your changes are committed in a separate branch, which
+should differ from the reference branch to be used by just the
+changes to be uploaded. If the reference branch is to be
+origin/master, ensure this is up-to-date. If necessary, use git
+rebase to rebase the branch containing the changes to the head of
+origin/master. Finally, check out branch with the changes and
+enter the command:
+
+@example
+git cl upload <reference SHA1 ID>
+@end example
+
+@noindent
+where <reference SHA1 ID> is the SHA1 ID of the commit to be used
+as a reference source for the patch. Generally, this will be the
+SHA1 ID of origin/master, and in that case the command:
+
+@example
+git cl upload origin/master
+@end example
+
+@noindent
+can be used.
+
+@item
+@strong{Master branch}:
+
+If you added your patch to @code{master}, then make sure that you
+are up-to-date (by running @code{git pull -r}), and then run:
+
+@example
+git cl upload origin/master
+@end example
+
+If you have git push ability, make sure that you @emph{remove}
+your patch (with @command{git rebase} or @command{git reset})
+before pushing other stuff.
+
+@end itemize
+
+After prompting for your Google email address and password, the
+patch set will be posted to Rietveld.
+
+@subsubheading Announcing your patch set
+
+You should then announce the patch by sending an email to
+@code{lilypond-devel}, with a subject line starting with PATCH:,
+asking for comments on the patch. Alternately, you may Publish +
+Mail a (bogus) comment, in order to send an email to
+lilypond-devel.
+
+@subsubheading Revisions
+
+As revisions are made in response to comments, successive patch sets
+for the same issue can be uploaded by reissuing the git-cl command
+with the modified branch checked out.
+
+Sometimes in response to comments on revisions, the best way to
+work may require creation of a new branch in git. In order to
+associate the new branch with an existing Rietveld issue,
+the following command can be used:
+
+@example
+git cl issue issue-number
+@end example
+
+@noindent
+where @code{issue-number} is the number of the existing Rietveld
+issue.
+
+@subsubheading Resetting git cl
+
+If @command{git cl} becomes confused, you can @qq{reset} it by
+running:
+
+@example
+git cl issue 0
+@end example
@node Advanced Git procedures
@lilypond[verbatim, ragged-right, quote]
\include "predefined-guitar-fretboards.ly"
-\storePredefinedDiagram \chordmode { c:maj9 }
+\storePredefinedDiagram #default-fret-table \chordmode { c:maj9 }
#guitar-tuning
#"x;3-2;o;o;o;o;"
@lilypond[verbatim, ragged-right, quote]
\include "predefined-guitar-fretboards.ly"
-\storePredefinedDiagram \chordmode { c'' }
+\storePredefinedDiagram #default-fret-table \chordmode { c'' }
#guitar-tuning
#(offset-fret 2 (chord-shape 'bes guitar-tuning))
% add some new chords based on the power chord shape
-\storePredefinedDiagram \chordmode { f'' }
+\storePredefinedDiagram #default-fret-table \chordmode { f'' }
#guitar-tuning
#(chord-shape 'powerf guitar-tuning)
-\storePredefinedDiagram \chordmode { g'' }
+\storePredefinedDiagram #default-fret-table \chordmode { g'' }
#guitar-tuning
#(offset-fret 2 (chord-shape 'powerf guitar-tuning))
@lilypond[quote,ragged-right,verbatim]
-\storePredefinedDiagram <c e g c' e'>
+\storePredefinedDiagram #default-fret-table <c e g c' e'>
#guitar-tuning
#"x;3-1-(;5-2;5-3;5-4;3-1-1);"
<<
@lilypond[verbatim, ragged-right, quote]
\include "predefined-guitar-fretboards.ly"
-\storePredefinedDiagram \chordmode { c:maj9 }
+\storePredefinedDiagram #default-fret-table \chordmode { c:maj9 }
#guitar-tuning
#"x;3-2;o;o;o;o;"
@lilypond[verbatim, ragged-right, quote]
\include "predefined-guitar-fretboards.ly"
-\storePredefinedDiagram \chordmode { c'' }
+\storePredefinedDiagram #default-fret-table \chordmode { c'' }
#guitar-tuning
#(offset-fret 2 (chord-shape 'bes guitar-tuning))
% add some new chords based on the power chord shape
-\storePredefinedDiagram \chordmode { f'' }
+\storePredefinedDiagram #default-fret-table \chordmode { f'' }
#guitar-tuning
#(chord-shape 'powerf guitar-tuning)
-\storePredefinedDiagram \chordmode { g'' }
+\storePredefinedDiagram #default-fret-table \chordmode { g'' }
#guitar-tuning
#(offset-fret 2 (chord-shape 'powerf guitar-tuning))
@lilypond[quote,ragged-right,verbatim]
-\storePredefinedDiagram <c e g c' e'>
+\storePredefinedDiagram #default-fret-table <c e g c' e'>
#guitar-tuning
#"x;3-1-(;5-2;5-3;5-4;3-1-1);"
<<
@c -*- coding: utf-8; mode: texinfo; -*-
@ignore
- Translation of GIT committish: 847f8da9ce0eb39bdcd199a554363373f0d003ae
+ Translation of GIT committish: 21d1bd8bd4915502ff2148077220cbd0d55bbac3
When revising a translation, copy the HEAD committish of the
version that you are working on. For details, see the Contributors'
@c used for news about the upcoming release; see CG 10.2
@newsItem
-@subsubheading ¡Lanzado LilyPond 2.13.31! @emph{24 de agosto de 2010}
+@subsubheading Segunda versión de pruebas Alfa de 2.14: ¡Lanzado LilyPond 2.13.35! @emph{29 de septiembre de 2010}
-Nos complace anunciar el lanzamiento de LilyPond 2.13.31. Esta
-versión contiene el conjunto habitual de correcciones de fallos. Sin
-embargo, aún quedan algunos problemas críticos, por lo que esta
-versión está orientada solamente a los desarrolladores.
+Ha salido LilyPond 2.13.35; ésta es la segunda versión alfa de la
+inminente versión estable 2.14. Se invita a los usuarios a que hagan
+experimentos con esta versión. Las funcionalidades nuevas desde
+2.12.3 están relacionadas en el manual de @qq{Cambios} dentro de la
+sección @ref{Desarrollo} de estas páginas.
+
+Aún existen tres regresiones conocidas contra 2.12.3:
+@uref{http://code.google.com/p/lilypond/issues/detail?id=1173,
+Problema número 1173 - No se pueden alinear las MetronomeMarks sobre
+una nota si existe un silencio multicompás en otra voz}, y dos fallos
+de espaciado:
+@uref{http://code.google.com/p/lilypond/issues/detail?id=1240,
+Problema 1240} y
+@uref{http://code.google.com/p/lilypond/issues/detail?id=1252,
+Problema 1252} pero esperamos encontrar más. Si se decide a probar
+2.13.35, no se sorprenda al encontrar problemas; tan sólo envíenos
+@ref{Informes de fallos} educados.
@newsEnd
+
@newsItem
@subsubheading Versión de pruebas Alfa de 2.14: ¡Lanzado LilyPond 2.13.34! @emph{21 de septiembre de 2010}
Aún existe una regresión conocida contra 2.12.3:
@uref{http://code.google.com/p/lilypond/issues/detail?id=1173,
-Porblema número 1173 No se pueden alinear las MetronomeMarks sobre una
+Problema número 1173 - No se pueden alinear las MetronomeMarks sobre una
nota si existe un silencio multicompás en otra voz}, pero esperamos
encontrar más. Si se decide a probar 2.13.34, no se sorprenda al
encontrar problemas; tan sólo envíenos @ref{Informes de fallos}
@newsItem
-@newsItem
-@subsubheading El Informe LilyPond, número 18. @emph{11 de mayo de 2010}
-@subsubheading LilyPond Report #20. @emph{Sep 2, 2010}
+@subsubheading El Informe LilyPond, número 20. @emph{2 de septiembre de 2010}
¡Vuelve el @emph{Informe LilyPond}, con sus dos editores: @qq{gruñón}
y @qq{blandito}! Esta edición contiene la revisión de un editor de
@lilypond[verbatim, ragged-right, quote]
\include "predefined-guitar-fretboards.ly"
-\storePredefinedDiagram \chordmode {c:9}
+\storePredefinedDiagram #default-fret-table \chordmode {c:9}
#guitar-tuning
#"x;3-2;2-1;3-3;3-4;x;"
@lilypond[verbatim, ragged-right, quote]
\include "predefined-guitar-fretboards.ly"
-\storePredefinedDiagram \chordmode {c'}
+\storePredefinedDiagram #default-fret-table \chordmode {c'}
#guitar-tuning
#(offset-fret 2 (chord-shape 'bes guitar-tuning))
% add some new chords based on the power chord shape
-\storePredefinedDiagram \chordmode {f'}
+\storePredefinedDiagram #default-fret-table \chordmode {f'}
#guitar-tuning
#(chord-shape 'powerf guitar-tuning)
-\storePredefinedDiagram \chordmode {g'}
+\storePredefinedDiagram #default-fret-table \chordmode {g'}
#guitar-tuning
#(offset-fret 2 (chord-shape 'powerf guitar-tuning))
@lilypond[quote,ragged-right,verbatim]
-\storePredefinedDiagram <c e g c' e'>
+\storePredefinedDiagram #default-fret-table <c e g c' e'>
#guitar-tuning
#"x;3-1-(;5-2;5-3;5-4;3-1-1);"
<<
\consists "Timing_translator"
\consists "Default_bar_line_engraver"
} {
- \time 2/4
- c4 c c c c c
+ \time 2/4
+ c4 c c c c c
}
>>
\layout {
@lilypond[verbatim, ragged-right, quote]
\include "predefined-guitar-fretboards.ly"
-\storePredefinedDiagram \chordmode { c:maj9 }
+\storePredefinedDiagram #default-fret-table \chordmode { c:maj9 }
#guitar-tuning
#"x;3-2;o;o;o;o;"
@lilypond[verbatim, ragged-right, quote]
\include "predefined-guitar-fretboards.ly"
-\storePredefinedDiagram \chordmode { c'' }
+\storePredefinedDiagram #default-fret-table \chordmode { c'' }
#guitar-tuning
#(offset-fret 2 (chord-shape 'bes guitar-tuning))
% add some new chords based on the power chord shape
-\storePredefinedDiagram \chordmode { f'' }
+\storePredefinedDiagram #default-fret-table \chordmode { f'' }
#guitar-tuning
#(chord-shape 'powerf guitar-tuning)
-\storePredefinedDiagram \chordmode { g'' }
+\storePredefinedDiagram #default-fret-table \chordmode { g'' }
#guitar-tuning
#(offset-fret 2 (chord-shape 'powerf guitar-tuning))
@lilypond[quote,ragged-right,verbatim]
-\storePredefinedDiagram <c e g c' e'>
+\storePredefinedDiagram #default-fret-table <c e g c' e'>
#guitar-tuning
#"x;3-1-(;5-2;5-3;5-4;3-1-1);"
<<
Spacer rests are available only in note mode and chord mode. In
other situations, for example, when entering lyrics, the
command @code{\skip} is used to skip a musical moment.
-@code{\skip} requires an explicit duration.
+@code{\skip} requires an explicit duration, but this is ignored if
+the lyrics derive their durations from the notes in an associated
+melody through @code{\addlyrics} or @code{\lyricsto}.
@lilypond[quote,verbatim,relative=2]
<<
s1 * 6 \break
s1 * 5 \break
}
- \new Voice {
- \repeat unfold 2 { c'4 c'4 c'4 c'4 }
- \repeat unfold 3 { c'4 c'4 c'4 c'4 }
- \repeat unfold 6 { c'4 c'4 c'4 c'4 }
- \repeat unfold 5 { c'4 c'4 c'4 c'4 }
- }
->>
+ \new Voice {
+ \repeat unfold 2 { c'4 c'4 c'4 c'4 }
+ \repeat unfold 3 { c'4 c'4 c'4 c'4 }
+ \repeat unfold 6 { c'4 c'4 c'4 c'4 }
+ \repeat unfold 5 { c'4 c'4 c'4 c'4 }
+ }
+ >>
}
@end lilypond
@code{NonMusicalPaperColumnGrob}, as explained in @ref{Vertical spacing}.
@lilypond[quote,verbatim]
-\new Score {
+\score {
\new Staff <<
- \new Voice {
-
- \overrideProperty "Score.NonMusicalPaperColumn"
+ \new Voice {
+ \overrideProperty "Score.NonMusicalPaperColumn"
#'line-break-system-details #'((Y-offset . 0))
- s1 * 2 \break
+ s1 * 2 \break
- \overrideProperty "Score.NonMusicalPaperColumn"
+ \overrideProperty "Score.NonMusicalPaperColumn"
#'line-break-system-details #'((Y-offset . 35))
- s1 * 3 \break
+ s1 * 3 \break
- \overrideProperty "Score.NonMusicalPaperColumn"
+ \overrideProperty "Score.NonMusicalPaperColumn"
#'line-break-system-details #'((Y-offset . 70))
- s1 * 6 \break
+ s1 * 6 \break
- \overrideProperty "Score.NonMusicalPaperColumn"
+ \overrideProperty "Score.NonMusicalPaperColumn"
#'line-break-system-details #'((Y-offset . 105))
- s1 * 5 \break
- }
- \new Voice {
- \repeat unfold 2 { c'4 c'4 c'4 c'4 }
- \repeat unfold 3 { c'4 c'4 c'4 c'4 }
- \repeat unfold 6 { c'4 c'4 c'4 c'4 }
- \repeat unfold 5 { c'4 c'4 c'4 c'4 }
- }
+ s1 * 5 \break
+ }
+ \new Voice {
+ \repeat unfold 2 { c'4 c'4 c'4 c'4 }
+ \repeat unfold 3 { c'4 c'4 c'4 c'4 }
+ \repeat unfold 6 { c'4 c'4 c'4 c'4 }
+ \repeat unfold 5 { c'4 c'4 c'4 c'4 }
+ }
>>
}
@end lilypond
@lilypond[quote,ragged-right]
{
c'4 e''4 e'4 b'4 |
- b'4 e''4 b'4 e''4|
+ b'4 e''4 b'4 e''4 |
\override Staff.NoteSpacing #'stem-spacing-correction = #1.5
\override Staff.StaffSpacing #'stem-spacing-correction = #1.5
c'4 e''4 e'4 b'4 |
- b'4 e''4 b'4 e''4|
+ b'4 e''4 b'4 e''4 |
}
@end lilypond
\context {
\Score
\override SpacingSpanner
- #'base-shortest-duration = #(ly:make-moment 1 16)
+ #'base-shortest-duration = #(ly:make-moment 1 16)
}
}
}
@code{Score.SpacingSpanner #'uniform-stretching}. This
property can only be changed at the beginning of a score,
-@lilypond[quote,ragged-right,relative=2,fragment,verbatim]
-\new Score \with {
- \override SpacingSpanner #'uniform-stretching = ##t
-} <<
- \new Staff{
- \times 4/5 {
- c8 c8 c8 c8 c8
+@lilypond[quote,ragged-right,verbatim]
+\score {
+ <<
+ \new Staff {
+ \times 4/5 {
+ c8 c8 c8 c8 c8
+ }
+ c8 c8 c8 c8
}
- c8 c8 c8 c8
- }
- \new Staff{
- c8 c8 c8 c8
- \times 4/5 {
- c8 c8 c8 c8 c8
+ \new Staff {
+ c8 c8 c8 c8
+ \times 4/5 {
+ c8 c8 c8 c8 c8
+ }
+ }
+ >>
+ \layout {
+ \context {
+ \Score
+ \override SpacingSpanner #'uniform-stretching = ##t
}
}
->>
+}
@end lilypond
When @code{strict-note-spacing} is set, notes are spaced without
spacing with ragged-right turned on.
@lilypond[quote,verbatim,ragged-right]
-\new Score <<
- \new RhythmicStaff {
- c'2
- c'16 c'16 c'16 c'16
- \times 4/5 {
- c'16 c'16 c'16 c'16 c'16
+\score {
+ <<
+ \new RhythmicStaff {
+ c'2
+ c'16 c'16 c'16 c'16
+ \times 4/5 {
+ c'16 c'16 c'16 c'16 c'16
+ }
}
- }
->>
+ >>
+}
@end lilypond
Notice that the half note which begins the measure takes up far less
setting.
@lilypond[quote,verbatim,ragged-right]
-\new Score \with {
- proportionalNotationDuration = #(ly:make-moment 1 20)
-} <<
- \new RhythmicStaff {
- c'2
- c'16 c'16 c'16 c'16
- \times 4/5 {
- c'16 c'16 c'16 c'16 c'16
+\score {
+ <<
+ \new RhythmicStaff {
+ c'2
+ c'16 c'16 c'16 c'16
+ \times 4/5 {
+ c'16 c'16 c'16 c'16 c'16
+ }
+ }
+ >>
+ \layout {
+ \context {
+ \Score
+ proportionalNotationDuration = #(ly:make-moment 1 20)
}
}
->>
+}
@end lilypond
The half note at the beginning of the measure and the faster notes in
space. We could place a measured timeline or graphic above or below
this example.
-The @code{proportionalNotationDuration} setting is a context setting that
-lives in @code{Score}. Recall that context settings appear in one of
-three locations in our input file -- in a @code{\with} block, in a
-@code{\context} block, or directly in music entry
-preceded by the @code{\set} command. As with all
-context settings, users can pick which of the three different
-locations they would like to set @code{proportionalNotationDuration}.
+The @code{proportionalNotationDuration} setting is a context setting
+that lives in @code{Score}. Remember that context settings can appear
+in one of three locations within our input file -- in a @code{\with}
+block, in a @code{\context} block, or directly in music entry preceded
+by the @code{\set} command. As with all context settings, users can
+pick which of the three different locations they would like to
+set @code{proportionalNotationDuration} in to.
The @code{proportionalNotationDuration} setting takes a single argument,
-which is the reference duration against which all music will be
-spaced. The LilyPond Scheme function make-moment takes two arguments
+which is the reference duration against that all music will be spaced.
+The LilyPond Scheme function @code{make-moment} takes two arguments
-- a numerator and denominator which together express some fraction of
-a whole note. The call @code{#(ly:make-moment 1 20)} therefore produces a
-reference duration of a twentieth note. The values
+a whole note. The call @code{#(ly:make-moment 1 20)} therefore produces
+a reference duration of a twentieth note. Values such as
@code{#(ly:make-moment 1 16)}, @code{#(ly:make-moment 1 8)}, and
@code{#(ly:make-moment 3 97)} are all possible as well.
How do we select the right reference duration to pass to
-@code{proportionalNotationDuration}? Usually by a process of trial and error,
-beginning with a duration close to the fastest (or smallest) duration
-in the piece. Smaller reference durations space music loosely; larger
-reference durations space music tightly.
+@code{proportionalNotationDuration}? Usually by a process of trial
+and error, beginning with a duration close to the fastest (or smallest)
+duration in the piece. Smaller reference durations space music loosely;
+larger reference durations space music tightly.
@lilypond[quote,verbatim,ragged-right]
-\new Score \with {
- proportionalNotationDuration = #(ly:make-moment 1 8)
-} <<
- \new RhythmicStaff {
- c'2
- c'16 c'16 c'16 c'16
- \times 4/5 {
- c'16 c'16 c'16 c'16 c'16
+\score {
+ <<
+ \new RhythmicStaff {
+ c'2
+ c'16 c'16 c'16 c'16
+ \times 4/5 {
+ c'16 c'16 c'16 c'16 c'16
+ }
+ }
+ >>
+ \layout {
+ \context {
+ \Score
+ proportionalNotationDuration = #(ly:make-moment 1 8)
}
}
->>
+}
-\new Score \with {
- proportionalNotationDuration = #(ly:make-moment 1 16)
-} <<
- \new RhythmicStaff {
- c'2
- c'16 c'16 c'16 c'16
- \times 4/5 {
- c'16 c'16 c'16 c'16 c'16
+\score {
+ <<
+ \new RhythmicStaff {
+ c'2
+ c'16 c'16 c'16 c'16
+ \times 4/5 {
+ c'16 c'16 c'16 c'16 c'16
+ }
+ }
+ >>
+ \layout {
+ \context {
+ \Score
+ proportionalNotationDuration = #(ly:make-moment 1 16)
}
}
->>
+}
-\new Score \with {
- proportionalNotationDuration = #(ly:make-moment 1 32)
-} <<
- \new RhythmicStaff {
- c'2
- c'16 c'16 c'16 c'16
- \times 4/5 {
- c'16 c'16 c'16 c'16 c'16
+\score {
+ <<
+ \new RhythmicStaff {
+ c'2
+ c'16 c'16 c'16 c'16
+ \times 4/5 {
+ c'16 c'16 c'16 c'16 c'16
+ }
+ }
+ >>
+ \layout {
+ \context {
+ \Score
+ proportionalNotationDuration = #(ly:make-moment 1 32)
}
}
->>
+}
@end lilypond
Note that too large a reference duration -- such as the eighth note,
above -- spaces music too tightly and can cause note head collisions.
-Note also that proportional notation in general takes up more
-horizontal space that does classical spacing. Proportional spacing
-provides rhythmic clarity at the expense of horizontal space.
+Also that proportional notation in general takes up more horizontal
+space than classical spacing. Proportional spacing provides rhythmic
+clarity at the expense of horizontal space.
Next we examine how to optimally space overlapping tuplets.
}
@end lilypond
-The spacing is bad because the evenly notes of the bottom staff do not
-stretch uniformly. Classical engraving includes very few complex
+The spacing is bad because the evenly spaced notes of the bottom staff
+do not stretch uniformly. Classical engravings include very few complex
triplets and so classical engraving rules can generate this type of
-result. Setting @code{proportionalNotationDuration} remedies this
-situation considerably.
+result. Setting @code{proportionalNotationDuration} fixes this.
@lilypond[quote,verbatim,ragged-right]
-\new Score \with {
- proportionalNotationDuration = #(ly:make-moment 1 20)
-} <<
- \new RhythmicStaff {
- c'2
- c'16 c'16 c'16 c'16
- \times 4/5 {
- c'16 c'16 c'16 c'16 c'16
+\score {
+ <<
+ \new RhythmicStaff {
+ c'2
+ c'16 c'16 c'16 c'16
+ \times 4/5 {
+ c'16 c'16 c'16 c'16 c'16
+ }
}
- }
- \new RhythmicStaff {
- \times 8/9 {
- c'8 c'8 c'8 c'8 c'8 c'8 c'8 c'8 c'8
+ \new RhythmicStaff {
+ \times 8/9 {
+ c'8 c'8 c'8 c'8 c'8 c'8 c'8 c'8 c'8
+ }
+ }
+ >>
+ \layout {
+ \context {
+ \Score
+ proportionalNotationDuration = #(ly:make-moment 1 20)
}
}
->>
+}
@end lilypond
But if we look very carefully we can see that notes of the second half
-of the 9-tuplet space ever so slightly more widely than do the notes
+of the 9-tuplet space ever so slightly more widely than the notes
of the first half of the 9-tuplet. To ensure uniform stretching, we
turn on @code{uniform-stretching}, which is a property of
@code{SpacingSpanner}.
@lilypond[quote,verbatim,ragged-right]
-\new Score \with {
- proportionalNotationDuration = #(ly:make-moment 1 20)
- \override SpacingSpanner #'uniform-stretching = ##t
-} <<
- \new RhythmicStaff {
- c'2
- c'16 c'16 c'16 c'16
- \times 4/5 {
- c'16 c'16 c'16 c'16 c'16
+\score {
+ <<
+ \new RhythmicStaff {
+ c'2
+ c'16 c'16 c'16 c'16
+ \times 4/5 {
+ c'16 c'16 c'16 c'16 c'16
+ }
}
- }
- \new RhythmicStaff {
- \times 8/9 {
- c'8 c'8 c'8 c'8 c'8 c'8 c'8 c'8 c'8
+ \new RhythmicStaff {
+ \times 8/9 {
+ c'8 c'8 c'8 c'8 c'8 c'8 c'8 c'8 c'8
+ }
+ }
+ >>
+ \layout {
+ \context {
+ \Score
+ proportionalNotationDuration = #(ly:make-moment 1 20)
+ \override SpacingSpanner #'uniform-stretching = ##t
}
}
->>
+}
@end lilypond
Our two-staff example now spaces exactly, our rhythmic
Making a lyric line run slower than the melody can be achieved by
inserting @code{\skip}s into the lyrics. For every @code{\skip},
-the text will be delayed another note. The @code{\skip} command
+the text will be delayed by another note. The @code{\skip} command
must be followed by a valid duration, but this is ignored when
-@code{\skip} is used in lyrics.
+@code{\skip} is used in lyrics which derive their durations from the
+notes in an associated melody through @code{\addlyrics} or
+@code{\lyricsto}.
@lilypond[verbatim,ragged-right,quote]
\relative c' { c c g' }
left-aligned.
@warning{The @code{@bs{}skip} command must be followed by a number,
-but this number is ignored in lyric mode. Each @code{@bs{}skip}
-skips a single note of any value, irrespective of the value of the
-following number.}
+but this number is ignored in lyrics which derive their durations
+from the notes in an associated melody through @code{\addlyrics} or
+@code{\lyricsto}. Each @code{@bs{}skip} skips a single note of any
+value, irrespective of the value of the following number.}
@lilypond[verbatim,quote]
\score {
%% Do not edit this file; it is automatically
%% generated from LSR http://lsr.dsi.unimi.it
%% This file is in the public domain.
-\version "2.13.31"
+\version "2.13.36"
\header {
lsrtags = "fretted-strings"
dMajSeven = { <a\4 c\1 d\3 fis\2> }
gMajor = { <b\4 b\1 d\3 g\2> }
-\storePredefinedDiagram \dSix
+\storePredefinedDiagram #default-fret-table \dSix
#cuatroTuning
#"o;o;o;o;"
-\storePredefinedDiagram \dMajor
+\storePredefinedDiagram #default-fret-table \dMajor
#cuatroTuning
#"o;o;o;3-3;"
-\storePredefinedDiagram \aMajSeven
+\storePredefinedDiagram #default-fret-table \aMajSeven
#cuatroTuning
#"o;2-2;1-1;2-3;"
-\storePredefinedDiagram \dMajSeven
+\storePredefinedDiagram #default-fret-table \dMajSeven
#cuatroTuning
#"o;o;o;1-1;"
-\storePredefinedDiagram \gMajor
+\storePredefinedDiagram #default-fret-table \gMajor
#cuatroTuning
#"2-2;o;1-1;o;"
@c used for news about the upcoming release; see CG 10.2
+
@newsItem
-@subsubheading Alpha test two of 2.14 -- LilyPond 2.13.36 released! @emph{Sep 29, 2010}
+@subsubheading The LilyPond Report #21. @emph{Oct 3, 2010}
+
+The @emph{LilyPond Report} is back, with its two
+@qq{grumpy-and-fluffy} editors! This issue mainly deals with
+microtonal notation in LilyPond, but does also include a how-to
+about running LilyPond from an USB key, not to forget the regular
+release news, the bug report of the Report, and some news from
+the frog pond!
+
+Come
+@uref{http://news.lilynet.net/The-LilyPond-Report-21, read
+LilyPond Report 21} now; comments and contributions are
+warmly encouraged!
+
+@newsEnd
-LilyPond 2.13.36 is out; this is the second alpha test of the
+
+@newsItem
+@subsubheading Alpha test two of 2.14 -- LilyPond 2.13.35 released! @emph{Sep 29, 2010}
+
+LilyPond 2.13.35 is out; this is the second alpha test of the
upcoming 2.14 stable release. Users are invited to experiment
with this version. New features since 2.12.3 are listed in the
@qq{Changes} manual on the website section about
@uref{http://code.google.com/p/lilypond/issues/detail?id=1240,
Issue 1240} and
@uref{http://code.google.com/p/lilypond/issues/detail?id=1252,
-Issue 1252}. If you decide to test 2.13.34, do not be surprised
+Issue 1252}. If you decide to test 2.13.35, do not be surprised
to discover problems; just send us polite @ref{Bug reports}.
@newsEnd
@newsEnd
-@newsItem
-@subsubheading LilyPond 2.13.32 released! @emph{Sep 3, 2010}
-
-We are happy to announce the release of LilyPond 2.13.32. This
-release contains the usual number of bugfixes. However, a number
-of critical issues still remain, so this release is intended for
-developers only.
-
-@newsEnd
-
-
-@newsItem
-@subsubheading LilyPond Report #20. @emph{Sep 2, 2010}
-
-The @emph{LilyPond Report} is back, with its two
-@qq{grumpy-and-fluffy} editors! This issue contains a review of an
-online notation editor using lilypond, along with the regular
-release news, snippet of the report, news from the frog pond, and
-the bug report of the report!
-
-Come
-@uref{http://news.lilynet.net/The-LilyPond-Report-20, read
-LilyPond Report 20} now; comments and contributions are
-warmly encouraged!
-@newsEnd
-
-
* don't duplicate entries from news-front.itexi
@end ignore
+
+
+@newsItem
+@subsubheading LilyPond 2.13.32 released! @emph{Sep 3, 2010}
+
+We are happy to announce the release of LilyPond 2.13.32. This
+release contains the usual number of bugfixes. However, a number
+of critical issues still remain, so this release is intended for
+developers only.
+
+@newsEnd
+
+
+@newsItem
+@subsubheading LilyPond Report #20. @emph{Sep 2, 2010}
+
+The @emph{LilyPond Report} is back, with its two
+@qq{grumpy-and-fluffy} editors! This issue contains a review of an
+online notation editor using lilypond, along with the regular
+release news, snippet of the report, news from the frog pond, and
+the bug report of the report!
+
+Come
+@uref{http://news.lilynet.net/The-LilyPond-Report-20, read
+LilyPond Report 20} now; comments and contributions are
+warmly encouraged!
+@newsEnd
+
+
@newsItem
@subsubheading LilyPond 2.13.31 released! @emph{Aug 24, 2010}
PATCH_LEVEL=36
MY_PATCH_LEVEL=
VERSION_STABLE=2.12.3
-VERSION_DEVEL=2.13.36
+VERSION_DEVEL=2.13.35
void set_full ();
void unite_disjoint (Interval_t<T> h, T padding, Direction d);
+ Interval_t<T> union_disjoint (Interval_t<T> h, T padding, Direction d) const;
bool is_empty () const
{
unite (h);
}
+template<class T>
+Interval_t<T>
+Interval_t<T>::union_disjoint (Interval_t<T> h, T padding, Direction d) const
+{
+ Interval_t<T> iv = *this;
+ iv.unite_disjoint (h, padding, d);
+ return iv;
+}
+
template<class T>
void
Interval_t<T>::intersect (Interval_t<T> h)
--- /dev/null
+\version "2.13.35"
+
+\header {
+ texidoc = "The height-estimation routine doesn't get confused
+by multiple outside-staff grobs in the same measure."
+}
+
+#(set-default-paper-size "a7")
+
+\book {
+ \repeat unfold 4 { \repeat unfold 4 {g'''4^"Text"} \break}
+}
--- /dev/null
+\version "2.13.36"
+
+\header {
+ texidoc = "Use @code{define-event-class}, scheme engraver methods,
+and grob creation methods to create a fully functional text spanner
+in scheme."
+}
+
+#(define-event-class 'scheme-text-span-event
+ '(scheme-text-span-event
+ span-event
+ music-event
+ StreamEvent))
+
+#(define (add-grob-definition grob-name grob-entry)
+ (let* ((meta-entry (assoc-get 'meta grob-entry))
+ (class (assoc-get 'class meta-entry))
+ (ifaces-entry (assoc-get 'interfaces meta-entry)))
+ (set-object-property! grob-name 'translation-type? list?)
+ (set-object-property! grob-name 'is-grob? #t)
+ (set! ifaces-entry (append (case class
+ ((Item) '(item-interface))
+ ((Spanner) '(spanner-interface))
+ ((Paper_column) '((item-interface
+ paper-column-interface)))
+ ((System) '((system-interface
+ spanner-interface)))
+ (else '(unknown-interface)))
+ ifaces-entry))
+ (set! ifaces-entry (uniq-list (sort ifaces-entry symbol<?)))
+ (set! ifaces-entry (cons 'grob-interface ifaces-entry))
+ (set! meta-entry (assoc-set! meta-entry 'name grob-name))
+ (set! meta-entry (assoc-set! meta-entry 'interfaces
+ ifaces-entry))
+ (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
+ (set! all-grob-descriptions
+ (cons (cons grob-name grob-entry)
+ all-grob-descriptions))))
+
+#(add-grob-definition
+ 'SchemeTextSpanner
+ `(
+ (bound-details . ((left . ((Y . 0)
+ (padding . 0.25)
+ (attach-dir . ,LEFT)
+ ))
+ (left-broken . ((end-on-note . #t)))
+ (right . ((Y . 0)
+ (padding . 0.25)
+ ))
+ ))
+ (dash-fraction . 0.2)
+ (dash-period . 3.0)
+ (direction . ,UP)
+ (font-shape . italic)
+ (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
+ (outside-staff-priority . 350)
+ (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
+ (staff-padding . 0.8)
+ (stencil . ,ly:line-spanner::print)
+ (style . dashed-line)
+
+ (meta . ((class . Spanner)
+ (interfaces . (font-interface
+ line-interface
+ line-spanner-interface
+ side-position-interface))))))
+
+#(define scheme-event-spanner-types
+ '(
+ (SchemeTextSpanEvent
+ . ((description . "Used to signal where scheme text spanner brackets
+start and stop.")
+ (types . (general-music scheme-text-span-event span-event event))
+ ))
+ ))
+
+#(set!
+ scheme-event-spanner-types
+ (map (lambda (x)
+ (set-object-property! (car x)
+ 'music-description
+ (cdr (assq 'description (cdr x))))
+ (let ((lst (cdr x)))
+ (set! lst (assoc-set! lst 'name (car x)))
+ (set! lst (assq-remove! lst 'description))
+ (hashq-set! music-name-to-property-table (car x) lst)
+ (cons (car x) lst)))
+ scheme-event-spanner-types))
+
+#(set! music-descriptions
+ (append scheme-event-spanner-types music-descriptions))
+
+#(set! music-descriptions
+ (sort music-descriptions alist<?))
+
+#(define (add-bound-item spanner item)
+ (if (null? (ly:spanner-bound spanner LEFT))
+ (ly:spanner-set-bound! spanner LEFT item)
+ (ly:spanner-set-bound! spanner RIGHT item)))
+
+#(define (axis-offset-symbol axis)
+ (if (eq? axis X) 'X-offset 'Y-offset))
+
+#(define (set-axis! grob axis)
+ (if (not (number? (ly:grob-property grob 'side-axis)))
+ (begin
+ (set! (ly:grob-property grob 'side-axis) axis)
+ (ly:grob-chain-callback
+ grob
+ (if (eq? axis X)
+ ly:side-position-interface::x-aligned-side
+ ly:side-position-interface::y-aligned-side)
+ (axis-offset-symbol axis)))))
+
+schemeTextSpannerEngraver =
+#(lambda (context)
+ (let ((span '())
+ (finished '())
+ (current-event '())
+ (event-drul '(() . ())))
+ (list (cons 'listeners
+ (list (cons 'scheme-text-span-event
+ (lambda (engraver event)
+ (if (= START (ly:event-property event 'span-direction))
+ (set-car! event-drul event)
+ (set-cdr! event-drul event))))))
+ (cons 'acknowledgers
+ (list (cons 'note-column-interface
+ (lambda (engraver grob source-engraver)
+ (if (ly:spanner? span)
+ (begin
+ (ly:pointer-group-interface::add-grob span 'note-columns grob)
+ (add-bound-item span grob)))
+ (if (ly:spanner? finished)
+ (begin
+ (ly:pointer-group-interface::add-grob finished 'note-columns grob)
+ (add-bound-item finished grob)))))))
+ (cons 'process-music
+ (lambda (trans)
+ (if (ly:stream-event? (cdr event-drul))
+ (if (null? span)
+ (ly:warning "You're trying to end a scheme text spanner but you haven't started one.")
+ (begin (set! finished span)
+ (ly:engraver-announce-end-grob trans finished current-event)
+ (set! span '())
+ (set! current-event '())
+ (set-cdr! event-drul '()))))
+ (if (ly:stream-event? (car event-drul))
+ (begin (set! current-event (car event-drul))
+ (set! span (ly:engraver-make-grob trans 'SchemeTextSpanner current-event))
+ (set-axis! span Y)
+ (set-car! event-drul '())))))
+ (cons 'stop-translation-timestep
+ (lambda (trans)
+ (if (and (ly:spanner? span)
+ (null? (ly:spanner-bound span LEFT)))
+ (set! (ly:spanner-bound span LEFT)
+ (ly:context-property context 'currentMusicalColumn)))
+ (if (ly:spanner? finished)
+ (begin
+ (if (null? (ly:spanner-bound finished RIGHT))
+ (set! (ly:spanner-bound finished RIGHT)
+ (ly:context-property context 'currentMusicalColumn)))
+ (set! finished '())
+ (set! event-drul '(() . ()))))))
+ (cons 'finalize
+ (lambda (trans)
+ (if (ly:spanner? finished)
+ (begin
+ (if (null? (ly:spanner-bound finished RIGHT))
+ (set! (ly:spanner-bound finished RIGHT)
+ (ly:context-property context 'currentMusicalColumn)))
+ (set! finished '())))
+ (if (ly:spanner? span)
+ (begin
+ (ly:warning "I think there's a dangling scheme text spanner :-(")
+ (ly:grob-suicide! span)
+ (set! span '()))))))))
+
+schemeTextSpannerStart =
+#(make-span-event 'SchemeTextSpanEvent START)
+
+schemeTextSpannerEnd =
+#(make-span-event 'SchemeTextSpanEvent STOP)
+
+\layout {
+ \context {
+ \Global
+ \grobdescriptions #all-grob-descriptions
+ }
+ \context {
+ \Voice
+ \consists \schemeTextSpannerEngraver
+ }
+}
+
+\relative c' {
+ a4 b\schemeTextSpannerStart c d |
+ \repeat unfold 20 { a4 b c d | }
+ a4 b c\schemeTextSpannerEnd d |
+ \override SchemeTextSpanner #'to-barline = ##t
+ a4\schemeTextSpannerStart b d c |
+ \repeat unfold 20 { a4 b c d | }
+ a1\schemeTextSpannerEnd |
+}
return ext;
}
-
// adjacent-pure-heights is a pair of vectors, each of which has one element
// for every measure in the score. The first vector stores, for each measure,
// the combined height of the elements that are present only when the bar
// is at the beginning of a line. The second vector stores, for each measure,
// the combined height of the elements that are present only when the bar
// is not at the beginning of a line.
-
MAKE_SCHEME_CALLBACK (Axis_group_interface, adjacent_pure_heights, 1)
SCM
Axis_group_interface::adjacent_pure_heights (SCM smob)
vector<Interval> begin_line_heights;
vector<Interval> mid_line_heights;
+ vector<Interval> begin_line_staff_heights;
+ vector<Interval> mid_line_staff_heights;
begin_line_heights.resize (ranks.size () - 1);
mid_line_heights.resize (ranks.size () - 1);
bool outside_staff = scm_is_number (g->get_property ("outside-staff-priority"));
Real padding = robust_scm2double (g->get_property ("outside-staff-padding"), 0.5);
+ // When we encounter the first outside-staff grob, make a copy
+ // of the current heights to use as an estimate for the staff heights.
+ // Note that the outside-staff approximation that we use here doesn't
+ // consider any collisions that might occur between outside-staff grobs,
+ // but only the fact that outside-staff grobs may need to be raised above
+ // the staff.
+ if (outside_staff && begin_line_staff_heights.empty ())
+ {
+ begin_line_staff_heights = begin_line_heights;
+ mid_line_staff_heights = mid_line_heights;
+ }
+
// TODO: consider a pure version of get_grob_direction?
Direction d = to_dir (g->get_property_data ("direction"));
d = (d == CENTER) ? UP : d;
if (rank_span[LEFT] <= start)
{
if (outside_staff)
- begin_line_heights[j].unite_disjoint (dims, padding, d);
+ begin_line_heights[j].unite (
+ begin_line_staff_heights[j].union_disjoint (dims, padding, d));
else
begin_line_heights[j].unite (dims);
}
if (rank_span[RIGHT] > start)
{
if (outside_staff)
- mid_line_heights[j].unite_disjoint (dims, padding, d);
+ mid_line_heights[j].unite (
+ mid_line_staff_heights[j].union_disjoint (dims, padding, d));
else
mid_line_heights[j].unite (dims);
}
(cdr rel)))
event-classes)
+(define-public (define-event-class leaf heritage)
+ (cond
+ ((not (eq? leaf (car heritage)))
+ (ly:warning (_ "All classes must be the last in their matrilineal line.")))
+ ((not (equal? (cdr heritage)
+ (list-head (hashq-ref ancestor-lookup (cadr heritage) '())
+ (length (cdr heritage)))))
+ (ly:warning (_ "All classes must have a well-defined pedigree in the existing class hierarchy.")))
+ (else (hashq-set! ancestor-lookup
+ leaf
+ (cons leaf
+ (hashq-ref ancestor-lookup
+ (cadr heritage)
+ '()))))))
+
;; TODO: Allow entering more complex classes, by taking unions.
(define-public (ly:make-event-class leaf)
(hashq-ref ancestor-lookup leaf))
exit 1
fi
-git grep --name-only $1 | xargs sed -i -e s/$1/$2/g
+echo "Warning -- if this script is run after a branch is rebased,"
+echo " unintended changes will occur. It would be best to revert"
+echo " the rebase commit before running."
+git grep --name-only $1 | xargs sed -i -e s/$1/$2/g