]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' into lilypond/translation
authorFrancisco Vila <francisco.vila@hispalinux.es>
Mon, 4 Oct 2010 07:49:13 +0000 (09:49 +0200)
committerFrancisco Vila <francisco.vila@hispalinux.es>
Mon, 4 Oct 2010 07:49:13 +0000 (09:49 +0200)
22 files changed:
Documentation/contributor/programming-work.itexi
Documentation/contributor/source-code.itexi
Documentation/de/notation/fretted-strings.itely
Documentation/es/notation/fretted-strings.itely
Documentation/es/web/news-front.itexi
Documentation/fr/notation/fretted-strings.itely
Documentation/notation/changing-defaults.itely
Documentation/notation/fretted-strings.itely
Documentation/notation/rhythms.itely
Documentation/notation/spacing.itely
Documentation/notation/vocal.itely
Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly
Documentation/web/news-front.itexi
Documentation/web/news.itexi
VERSION
flower/include/interval.hh
flower/include/interval.tcc
input/regression/page-breaking-outside-staff-estimation2.ly [new file with mode: 0644]
input/regression/scheme-text-spanner.ly [new file with mode: 0644]
lily/axis-group-interface.cc
scm/define-event-classes.scm
scripts/auxiliar/update-patch-version.sh

index 47c87132ef4dbb656413f9aa7c3bdf888f134c68..672533ecb89f20f56beddb91382f013ba398d055 100644 (file)
@@ -1386,81 +1386,7 @@ layout, MIDI, performance or error reporting.
 @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
index 2a1893f0b29e4b79dd953b1a5762121dd18cb700..6764baa1d1b96f0a12fba1a369dfc0a4d431b73f 100644 (file)
@@ -773,6 +773,7 @@ meister wants to merge @code{lilypond/translation} into
 * Making commits::
 * Commit messages::
 * Making patches::
+* Uploading a patch for review::
 @end menu
 
 
@@ -926,9 +927,12 @@ for examples.
 @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.
@@ -960,11 +964,128 @@ the patch files attached.  Translators should send patches to
 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
index 122f4cdaf83445ac33e988b368ae543824855af2..3ab89da4ed01f7b08a44a01cccc9e67d64c5c465 100644 (file)
@@ -1135,7 +1135,7 @@ kann entweder eine @code{fret-diagram-terse}-Definition oder eine
 @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;"
 
@@ -1162,7 +1162,7 @@ die für transponierende Bunddiagramme eingesetzt wird.
 @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))
 
@@ -1210,10 +1210,10 @@ oder als @code{fret-diagram-verbose}-Liste erstellt werden.
 
 % 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))
 
@@ -1315,7 +1315,7 @@ werden.
 
 @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);"
 <<
index f1ed8b588b876991987d170b818349525533a2b6..50f76c98ffaebc45409826b80069a5e70e804586 100644 (file)
@@ -1141,7 +1141,7 @@ fret-diagram-verbose.
 @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;"
 
@@ -1168,7 +1168,7 @@ la predeterminada se utilizan para los trasteros transpositores.
 @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))
 
@@ -1214,10 +1214,10 @@ fret-diagram-verbose.
 
 % 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))
 
@@ -1318,7 +1318,7 @@ con instrucciones predefinidas:
 
 @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);"
 <<
index 74bc1b903c025573036128ae66e905ae95ee5434..0c58a7b27c05302c41ed251a2a4a970b02799151 100644 (file)
@@ -1,6 +1,6 @@
 @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}
 
@@ -38,7 +52,7 @@ sección @ref{Desarrollo} de estas páginas.
 
 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}
@@ -70,9 +84,7 @@ versión está orientada solamente a los desarrolladores.
 
 
 @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
index 88e0f440045a45c0ff18e3b17ef2719d71b41587..8ea515b63d74be4109343269c3b9ac1102c357ad 100644 (file)
@@ -1044,7 +1044,7 @@ aussi bien de type @var{terse} que @var{verbose}.
 @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;"
 
@@ -1069,7 +1069,7 @@ intervalle de deux octaves, le premier servant à la transposition.
 @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))
 
@@ -1116,10 +1116,10 @@ définies grâce aux interfaces @code{fret-diagram-terse} ou
 
 % 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))
 
@@ -1218,7 +1218,7 @@ prédéfinies@tie{}:
 
 @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);"
 <<
index 24a1c4bffebb587bcd57bfe51f0b09ef3821cf03..4171c5b1e8692334a852c5c350283eb6111f2e89 100644 (file)
@@ -659,8 +659,8 @@ time signature.
     \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 {
index fdc61caa237bac07beb4ad311fb9ffbc20f727f1..bfd0e30873f8fb63734426279e03649d2aab3b16 100644 (file)
@@ -1106,7 +1106,7 @@ marking list.
 @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;"
 
@@ -1132,7 +1132,7 @@ default octave are used for transposing fretboards.
 @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))
 
@@ -1177,10 +1177,10 @@ marking lists.
 
 % 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))
 
@@ -1278,7 +1278,7 @@ commands:
 
 @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);"
 <<
index 5ff676c0b7436ab62ae6a40f083b0f359169df41..e0321d305883f04350737058b7755a038335ef0e 100644 (file)
@@ -703,7 +703,9 @@ s2 c
 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]
 <<
index 4a1a4576eb21a6146d8e1ea48a27a15b8d08f4bd..e943901e5433b411d61f4580424dd9532d4861e1 100644 (file)
@@ -1333,13 +1333,13 @@ breaking layout information.
       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
 
@@ -1348,32 +1348,31 @@ This pattern becomes especially helpful when overriding
 @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
@@ -2062,11 +2061,11 @@ once with exaggerated corrections:
 @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
 
@@ -2163,7 +2162,7 @@ than @code{1 16}.
     \context {
       \Score
       \override SpacingSpanner
-                #'base-shortest-duration = #(ly:make-moment 1 16)
+        #'base-shortest-duration = #(ly:make-moment 1 16)
     }
   }
 }
@@ -2178,23 +2177,29 @@ such symbols and force uniform equal-duration spacing, use
 @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
@@ -2294,15 +2299,17 @@ We start with the following one-measure example, which uses classical
 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
@@ -2321,17 +2328,23 @@ turn proportional notation on with the proportionalNotationDuration
 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
@@ -2339,72 +2352,90 @@ the second half of the measure now occupy equal amounts of horizontal
 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.
 
@@ -2431,55 +2462,66 @@ tuplet.
 }
 @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
index 216eed8ee5c633a14616e8a2982aaeb493512f22..e4cd8ad828d1904f491684b974fee82482c87ecd 100644 (file)
@@ -532,9 +532,11 @@ inserted by hand.
 
 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' }
@@ -796,9 +798,10 @@ indicates a melisma and will cause the preceding syllable to be
 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 {
index 9029b0f398f2b0ba57f7468798361f744fbe6f9e..49da3633a30765451e64030ef865127d82c1e7f2 100644 (file)
@@ -1,7 +1,7 @@
 %% 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"
@@ -94,19 +94,19 @@ aMajSeven = { <a\4 cis\1 e\3 g\2> }
 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;"
 
index ba68f30d005831f7a520ee352540e167a2e60bf4..8e6b0510fccbd9baa2e357c4382c98ad345d9b34 100644 (file)
@@ -8,10 +8,29 @@
 
 @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
@@ -25,7 +44,7 @@ bugs:
 @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
@@ -61,31 +80,4 @@ developers only.
 @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
-
-
 
index 52688295ffe064f9addd7b6c98f64be4e109a7a3..ad881d728ee366f5b80394e16702fb6c326d1a67 100644 (file)
@@ -26,6 +26,35 @@ NOTE:
   * 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}
 
diff --git a/VERSION b/VERSION
index 0f92d632f50828e20ad23b40ce7f8e5266fdbb05..b653b3b51b731b125c55da1d29539cdf1f6a054e 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -4,4 +4,4 @@ MINOR_VERSION=13
 PATCH_LEVEL=36
 MY_PATCH_LEVEL=
 VERSION_STABLE=2.12.3
-VERSION_DEVEL=2.13.36
+VERSION_DEVEL=2.13.35
index 4a08e278137a10be63df24f957943f389e265327..512200f6cf035b70f6f97a83318c469b2a0c04ac 100644 (file)
@@ -73,6 +73,7 @@ struct Interval_t : public Drul_array<T>
   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
   {
index 7a1440a31986b55a6bff52cd7df734f0665da8b0..35dd8ebb29013f348905f84726833ebcf02b52c3 100644 (file)
@@ -123,6 +123,15 @@ Interval_t<T>::unite_disjoint (Interval_t<T> h, T padding, Direction d)
   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)
diff --git a/input/regression/page-breaking-outside-staff-estimation2.ly b/input/regression/page-breaking-outside-staff-estimation2.ly
new file mode 100644 (file)
index 0000000..6a33ca7
--- /dev/null
@@ -0,0 +1,12 @@
+\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}
+}
diff --git a/input/regression/scheme-text-spanner.ly b/input/regression/scheme-text-spanner.ly
new file mode 100644 (file)
index 0000000..f89dcc2
--- /dev/null
@@ -0,0 +1,206 @@
+\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 |
+}
index 1ec518feff52bd95ed7ac0a7d5e86590539291d0..85d2d3658889ffc806d823984d7c29d2c8c1b61a 100644 (file)
@@ -143,14 +143,12 @@ Axis_group_interface::combine_pure_heights (Grob *me, SCM measure_extents, int s
   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)
@@ -165,6 +163,8 @@ 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);
 
@@ -178,6 +178,18 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
       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;
@@ -205,14 +217,16 @@ Axis_group_interface::adjacent_pure_heights (SCM smob)
                  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);
                    }
index e1f3b4aa33b3122aff4d30b256c079c83bc6b8fc..f631bcddc0b9f8365eb3d8bf8688e10f810fccf2 100644 (file)
     (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))
index ac30788f81b526a86540affff4915b544ddcb535..22286274dba30751c22822c0d226f3de670b734f 100755 (executable)
@@ -17,5 +17,8 @@ then
   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