]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' into translation
authorJean-Charles Malahieude <lilyfan@orange.fr>
Sat, 20 Jul 2013 12:50:48 +0000 (14:50 +0200)
committerJean-Charles Malahieude <lilyfan@orange.fr>
Sat, 20 Jul 2013 12:50:48 +0000 (14:50 +0200)
42 files changed:
Documentation/css/lilypond-website.css
Documentation/ja/notation/repeats.itely
Documentation/notation/fretted-strings.itely
Documentation/notation/input.itely
Documentation/notation/repeats.itely
Documentation/notation/text.itely
Documentation/notation/vocal.itely
Documentation/snippets/accordion-discant-symbols.ly
Documentation/snippets/new/accordion-discant-symbols.ly [new file with mode: 0644]
Documentation/web/community.itexi
Documentation/web/news-front.itexi
Documentation/web/news.itexi
Documentation/web/server/robots.txt
VERSION
elisp/lilypond-mode.el
input/regression/scheme-text-spanner.ly
input/regression/system-extents.ly
input/regression/tuplet-no-stems.ly
lily/context-scheme.cc
lily/context.cc
lily/engraver.cc
lily/footnote-engraver.cc
lily/global-context.cc
lily/include/context.hh
lily/include/music.hh
lily/include/skyline.hh
lily/lexer.ll
lily/lily-guile.cc
lily/music.cc
lily/part-combine-iterator.cc
lily/rhythmic-music-iterator.cc
lily/skyline.cc
ly/engraver-init.ly
ly/performer-init.ly
make/doc-i18n-root-vars.make
make/website.make
mf/feta-accordion.mf
po/lilypond.pot
scm/define-context-properties.scm
scm/define-event-classes.scm
scm/define-grobs.scm
scm/document-music.scm

index 9daf395dc6e6d978979b851dab0cbc001c23376c..820cd5c5bfea663ecd82d71b286766452da85df2 100644 (file)
@@ -431,10 +431,10 @@ div#quickSummary {
 }
 
 div.separator {
-  background: transparent url(../pictures/squiggle.jpg) no-repeat 40% 60%;
+  background: transparent url(../pictures/squiggle.jpg) no-repeat 50% 50%;
   height: 36px;
-  clear: both;
   padding: 10px;
+  margin: 0 13em 0 0;
 }
 
 div#news {
@@ -443,6 +443,7 @@ div#news {
 }
 
 div.news-item {
+  padding: 1em 0;
 }
 
 .news-item .subsubheading {
@@ -903,6 +904,7 @@ div.color4 h3 {
   padding : 0em;
   border-left: 2px;
   margin: 0em;
+  width: 67%;
 }
 
 .normal-table table td {
index 1e549353b0a5827284180077c07460e3e1a7ce58..9df79cd8f14d4919eb1f2270d36338f99d2c6ead 100644 (file)
@@ -167,8 +167,8 @@ c1
 
 @cindex repeat with upbeat (上拍を持つ繰り返し)
 @cindex upbeat in a repeat (繰り返しの中にある上拍)
-@cindex anacrucis in a repeat (繰り返しの中にある弱拍)
-@cindex repeat with anacrucis (弱拍を持つ繰り返し)
+@cindex anacrusis in a repeat (繰り返しの中にある弱拍)
+@cindex repeat with anacrusis (弱拍を持つ繰り返し)
 @cindex repeat with pickup (ピックアップを持つ繰り返し)
 @cindex pickup in a repeat (繰り返しの中にあるピックアップ)
 @funindex \partial
index e415158c1e9d65f1ebac46e1782b542fe322ddd8..1bb80351977b0d311bcfd4fbe9343b53cc553189 100644 (file)
@@ -1858,15 +1858,20 @@ correct fret numbers for the fifth string:
 @c due to crazy intervals of banjo music, absolute pitch is recommended
 
 @lilypond[quote,ragged-right,verbatim]
-\new TabStaff <<
-  \set TabStaff.tablatureFormat = #fret-number-tablature-format-banjo
-  \set TabStaff.stringTunings = #banjo-open-g-tuning
-  {
-    \stemDown
-    g8 d' g'\5 a b g e d' |
-    g4 d''8\5 b' a'\2 g'\5 e'\2 d' |
-    g4
+music = {
+  g8 d' g'\5 a b g e d' |
+  g4 d''8\5 b' a'\2 g'\5 e'\2 d' |
+  g4
+}
+
+<<
+  \new Staff \with { \omit StringNumber }
+  { \clef "treble_8"  \music }
+  \new TabStaff \with {
+    tablatureFormat = #fret-number-tablature-format-banjo
+    stringTunings = #banjo-open-g-tuning
   }
+  { \music }
 >>
 @end lilypond
 
index 4381f68af39cbcddee5ecb05fc4d7199b96c1abb..0929c21801df0d3caf744113b534036309fcec74 100644 (file)
@@ -243,15 +243,15 @@ name which may clash, so
 @example
 \book @{
   \score @{ @dots{} @}
-  \layout @{ @dots{} @}
+  \paper @{ @dots{} @}
 @}
 \book @{
   \score @{ @dots{} @}
-  \layout @{ @dots{} @}
+  \paper @{ @dots{} @}
 @}
 \book @{
   \score @{ @dots{} @}
-  \layout @{ @dots{} @}
+  \paper @{ @dots{} @}
 @}
 @end example
 
index 5d63184b1881cfe5f9fc8b0356c2e526cb512fbe..ad555652fb5add6687d7b0a4236236c864eb2db9 100644 (file)
@@ -121,7 +121,7 @@ A single repeat with one alternate ending:
 c1
 @end lilypond
 
-A single repeat with more than one alternate ending:
+Multiple repeats with one alternate ending:
 
 @lilypond[verbatim,quote,relative=2]
 \repeat volta 4 { c4 d e f | }
@@ -156,8 +156,8 @@ expected number of endings.}
 
 @cindex repeat with upbeat
 @cindex upbeat in a repeat
-@cindex anacrucis in a repeat
-@cindex repeat with anacrucis
+@cindex anacrusis in a repeat
+@cindex repeat with anacrusis
 @cindex repeat with pickup
 @cindex pickup in a repeat
 @funindex \partial
index 89c82c7d217f4b4cc936ed19681c25c0b6c921f5..98fb8b0191aef28a0c26aecd9fddc037d2c8e6bf 100644 (file)
@@ -1402,6 +1402,14 @@ Three families of text fonts are made available: the @emph{roman}
 @emph{sans} font and the monospaced @emph{typewriter} font -- these
 last two families are determined by the Pango installation.
 
+@warning{There are no default fonts associated with the @emph{sans}
+and @emph{typewriter} font-families.  An input file that specifies
+either of these can lead to different output on different computers.
+To ensure consistent output among multiple platforms, fonts must be
+specified by name, and those fonts must be available on any system
+that processes the file.  See @ref{Single entry fonts} and
+@ref{Entire document fonts}.}
+
 Each family may include different shapes and series.  The following
 example demonstrates the ability to select alternate families, shapes,
 series and sizes.  The value supplied to @code{font-size} is the
index f1317f169a45b6401abe674664ff7973b4e0b847..81155c956cccbac63412d92e3518e323e9879a4a 100644 (file)
@@ -448,6 +448,7 @@ More stanzas can be added by adding more
 @end lilypond
 
 The command @code{\addlyrics} cannot handle polyphonic settings.
+Also, it cannot be used to associate lyrics to a @code{TabVoice}.
 For these cases one should use @code{\lyricsto}.
 
 @subheading Using associatedVoice
index c7b4da7a679ae30632b3598a68278c44ed048a0c..ee4a326b2f88d81c3efcf0cf6fb29b98d612de2f 100644 (file)
@@ -1,9 +1,10 @@
-%% DO NOT EDIT this file manually; it is automatically
-%% generated from LSR http://lsr.dsi.unimi.it
-%% Make any changes in LSR itself, or in Documentation/snippets/new/ ,
-%% and then run scripts/auxiliar/makelsr.py
-%%
-%% This file is in the public domain.
+% DO NOT EDIT this file manually; it is automatically
+% generated from Documentation/snippets/new
+% Make any changes in Documentation/snippets/new/
+% and then run scripts/auxiliar/makelsr.py
+%
+% This file is in the public domain.
+%% Note: this file works from version 2.16.0
 \version "2.16.0"
 
 \header {
 
   texidoc = "
 Accordion discant-specific symbols are added using @code{\\markup}. The
-vertical placement of the symbols can be tweaked by changing the
-@code{\\raise} arguments.
-
-
-
+placement of the symbols can be tweaked by changing the
+@code{\\translate-scaled} arguments.  @code{\\translate-scaled} is
+used here rather than @code{\\translate} in order to let the
+positioning of the symbol parts adapt to changes of @code{font-size}.
 "
   doctitle = "Accordion-discant symbols"
 } % begin verbatim
@@ -34,7 +34,7 @@ dot = \markup {
 accBasson = ^\markup {
   \combine
   \discant
-  \raise #0.5 \dot
+  \translate-scaled #'(0 . 0.5) \dot
 }
 
 % een korig 8 en 16 voets register
@@ -42,18 +42,18 @@ accBandon = ^\markup {
   \combine
     \discant
     \combine
-      \raise #0.5 \dot
-      \raise #1.5 \dot
+      \translate-scaled #'(0 . 0.5) \dot
+      \translate-scaled #'(0 . 1.5) \dot
 }
 
 accVCello = ^\markup {
   \combine
     \discant
     \combine
-      \raise #0.5 \dot
+      \translate-scaled #'(0 . 0.5) \dot
       \combine
-        \raise #1.5 \dot
-        \translate #'(1 . 0) \raise #1.5 \dot
+        \translate-scaled #'(0 . 1.5) \dot
+        \translate-scaled #'(1 . 1.5) \dot
 }
 
 % 4-8-16 voets register
@@ -61,22 +61,22 @@ accHarmon = ^\markup {
   \combine
     \discant
     \combine
-      \raise #0.5 \dot
+      \translate-scaled #'(0 . 0.5) \dot
       \combine
-        \raise #1.5 \dot
-        \raise #2.5 \dot
+        \translate-scaled #'(0 . 1.5) \dot
+        \translate-scaled #'(0 . 2.5) \dot
 }
 
 accTrombon = ^\markup {
   \combine
     \discant
     \combine
-      \raise #0.5 \dot
+      \translate-scaled #'(0 . 0.5) \dot
       \combine
-        \raise #1.5 \dot
+        \translate-scaled #'(0 . 1.5) \dot
         \combine
-          \translate #'(1 . 0) \raise #1.5 \dot
-          \translate #'(-1 . 0) \raise #1.5 \dot
+          \translate-scaled #'(1 . 1.5) \dot
+          \translate-scaled #'(-1 . 1.5) \dot
 }
 
 % eenkorig 4 en 16 voets register
@@ -84,82 +84,82 @@ accOrgan = ^\markup {
   \combine
     \discant
     \combine
-      \raise #0.5 \dot
-      \raise #2.5 \dot
+      \translate-scaled #'(0 . 0.5) \dot
+      \translate-scaled #'(0 . 2.5) \dot
 }
 
 accMaster = ^\markup {
   \combine
     \discant
     \combine
-      \raise #0.5 \dot
+      \translate-scaled #'(0 . 0.5) \dot
       \combine
-        \raise #1.5 \dot
+        \translate-scaled #'(0 . 1.5) \dot
         \combine
-          \translate #'(1 . 0) \raise #1.5 \dot
+          \translate-scaled #'(1 . 1.5) \dot
           \combine
-            \translate #'(-1 . 0) \raise #1.5 \dot
-            \raise #2.5 \dot
+            \translate-scaled #'(-1 . 1.5) \dot
+            \translate-scaled #'(0 . 2.5) \dot
 }
 
 accAccord = ^\markup {
   \combine
     \discant
     \combine
-      \raise #1.5 \dot
+      \translate-scaled #'(0 . 1.5) \dot
       \combine
-        \translate #'(1 . 0) \raise #1.5 \dot
+        \translate-scaled #'(1 . 1.5) \dot
         \combine
-          \translate #'(-1 . 0) \raise #1.5 \dot
-          \raise #2.5 \dot
+          \translate-scaled #'(-1 . 1.5) \dot
+          \translate-scaled #'(0 . 2.5) \dot
 }
 
 accMusette = ^\markup {
   \combine
     \discant
     \combine
-      \raise #1.5 \dot
+      \translate-scaled #'(0 . 1.5) \dot
       \combine
-        \translate #'(1 . 0) \raise #1.5 \dot
-        \translate #'(-1 . 0) \raise #1.5 \dot
+        \translate-scaled #'(1 . 1.5) \dot
+        \translate-scaled #'(-1 . 1.5) \dot
 }
 
 accCeleste = ^\markup {
   \combine
     \discant
     \combine
-      \raise #1.5 \dot
-      \translate #'(-1 . 0) \raise #1.5 \dot
+      \translate-scaled #'(0 . 1.5) \dot
+      \translate-scaled #'(-1 . 1.5) \dot
 }
 
 accOboe = ^\markup {
   \combine
     \discant
     \combine
-      \raise #1.5 \dot
-      \raise #2.5 \dot
+      \translate-scaled #'(0 . 1.5) \dot
+      \translate-scaled #'(0 . 2.5) \dot
 }
 
 accClarin = ^\markup {
   \combine
     \discant
-    \raise #1.5 \dot
+    \translate-scaled #'(0 . 1.5) \dot
 }
 
 accPiccolo = ^\markup {
     \combine
        \discant
-       \raise #2.5 \dot
+       \translate-scaled #'(0 . 2.5) \dot
 }
 
 accViolin = ^\markup {
   \combine
     \discant
     \combine
-      \raise #1.5 \dot
+      \translate-scaled #'(0 . 1.5) \dot
       \combine
-        \translate #'(1 . 0) \raise #1.5 \dot
-        \raise #2.5 \dot
+        \translate-scaled #'(1 . 1.5) \dot
+        \translate-scaled #'(0 . 2.5) \dot
 }
 
 \relative c'' {
diff --git a/Documentation/snippets/new/accordion-discant-symbols.ly b/Documentation/snippets/new/accordion-discant-symbols.ly
new file mode 100644 (file)
index 0000000..cc0efc1
--- /dev/null
@@ -0,0 +1,174 @@
+\version "2.16.0"
+
+\header {
+  lsrtags = "keyboards, specific-notation, symbols-and-glyphs, workaround"
+
+  texidoc = "
+Accordion discant-specific symbols are added using @code{\\markup}. The
+placement of the symbols can be tweaked by changing the
+@code{\\translate-scaled} arguments.  @code{\\translate-scaled} is
+used here rather than @code{\\translate} in order to let the
+positioning of the symbol parts adapt to changes of @code{font-size}.
+"
+  doctitle = "Accordion-discant symbols"
+}
+
+discant = \markup {
+  \musicglyph #"accordion.discant"
+}
+dot = \markup {
+  \musicglyph #"accordion.dot"
+}
+
+\layout { ragged-right = ##t }
+
+% 16 voets register
+accBasson = ^\markup {
+  \combine
+  \discant
+  \translate-scaled #'(0 . 0.5) \dot
+}
+
+% een korig 8 en 16 voets register
+accBandon = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 0.5) \dot
+      \translate-scaled #'(0 . 1.5) \dot
+}
+
+accVCello = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 0.5) \dot
+      \combine
+        \translate-scaled #'(0 . 1.5) \dot
+        \translate-scaled #'(1 . 1.5) \dot
+}
+
+% 4-8-16 voets register
+accHarmon = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 0.5) \dot
+      \combine
+        \translate-scaled #'(0 . 1.5) \dot
+        \translate-scaled #'(0 . 2.5) \dot
+}
+
+accTrombon = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 0.5) \dot
+      \combine
+        \translate-scaled #'(0 . 1.5) \dot
+        \combine
+          \translate-scaled #'(1 . 1.5) \dot
+          \translate-scaled #'(-1 . 1.5) \dot
+}
+
+% eenkorig 4 en 16 voets register
+accOrgan = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 0.5) \dot
+      \translate-scaled #'(0 . 2.5) \dot
+}
+
+accMaster = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 0.5) \dot
+      \combine
+        \translate-scaled #'(0 . 1.5) \dot
+        \combine
+          \translate-scaled #'(1 . 1.5) \dot
+          \combine
+            \translate-scaled #'(-1 . 1.5) \dot
+            \translate-scaled #'(0 . 2.5) \dot
+}
+
+accAccord = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 1.5) \dot
+      \combine
+        \translate-scaled #'(1 . 1.5) \dot
+        \combine
+          \translate-scaled #'(-1 . 1.5) \dot
+          \translate-scaled #'(0 . 2.5) \dot
+}
+
+accMusette = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 1.5) \dot
+      \combine
+        \translate-scaled #'(1 . 1.5) \dot
+        \translate-scaled #'(-1 . 1.5) \dot
+}
+
+accCeleste = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 1.5) \dot
+      \translate-scaled #'(-1 . 1.5) \dot
+}
+
+accOboe = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 1.5) \dot
+      \translate-scaled #'(0 . 2.5) \dot
+}
+
+accClarin = ^\markup {
+  \combine
+    \discant
+    \translate-scaled #'(0 . 1.5) \dot
+}
+
+accPiccolo = ^\markup {
+    \combine
+       \discant
+       \translate-scaled #'(0 . 2.5) \dot
+}
+
+accViolin = ^\markup {
+  \combine
+    \discant
+    \combine
+      \translate-scaled #'(0 . 1.5) \dot
+      \combine
+        \translate-scaled #'(1 . 1.5) \dot
+        \translate-scaled #'(0 . 2.5) \dot
+}
+
+\relative c'' {
+  c4 d\accBasson e f
+  c4 d\accBandon e f
+  c4 d\accVCello e f
+  c4 d\accHarmon e f
+  c4 d\accTrombon e f
+  \break
+  c4 d\accOrgan e f
+  c4 d\accMaster e f
+  c4 d\accAccord e f
+  c4 d\accMusette e f
+  c4 d\accCeleste e f
+  \break
+  c4 d\accOboe e f
+  c4 d\accClarin e f
+  c4 d\accPiccolo e f
+  c4 d\accViolin e f
+}
index b87062c7ba7c5edf0eeeab40e10fbfcec285da86..54723d77f59f016826fa53d0647ae03b28d5466a 100644 (file)
@@ -785,6 +785,7 @@ manuals can be found at @url{http://lilypond.org}}
 @divClass{normal-table}
 @multitable @columnfractions .3 .3 .3
 @headitem Introduction
+
 @item
 @docLinkSplit{Learning,learning,@manualDevelLearningSplit}
 @tab
@@ -805,7 +806,9 @@ manuals can be found at @url{http://lilypond.org}}
 @docLinkBig{Essay,essay,@manualDevelEssayBig}
 @tab
 @docLinkPdf{Essay,essay,@manualDevelEssayPdf}
+@end multitable
 
+@multitable @columnfractions .3 .3 .3
 @headitem Regular
 
 @item
@@ -828,7 +831,9 @@ manuals can be found at @url{http://lilypond.org}}
 @docLinkBig{Snippets,snippets,@manualDevelSnippetsBig}
 @tab
 @docLinkPdf{Snippets,snippets,@manualDevelSnippetsPdf}
+@end multitable
 
+@multitable @columnfractions .3 .3 .3
 @headitem Infrequent
 
 @item
@@ -858,15 +863,17 @@ manuals can be found at @url{http://lilypond.org}}
 @docLinkBig{Internals,internals,@manualDevelInternalsBig}
 @tab
 @docLinkPdf{Internals,internals,@manualDevelInternalsPdf}
+@end multitable
 
 @ifset web_version
+@multitable @columnfractions .3
 @headitem Downloadable
 
 @item
 @doctarballDevel
+@end multitable
 @end ifset
 
-@end multitable
 
 @divEnd
 @divEnd
index 855044379a38f07c7074de6670682e815b640aaf..0e3e5fd2d893a8fe7f3c1514a2c9d653b3f7a7e1 100644 (file)
@@ -9,14 +9,17 @@
 @c used for news about the upcoming release; see CG 10.2
 
 @newsItem
-@subsubheading LilyPond 2.17.21 released!  @emph{June 30, 2013}
+@subsubheading LilyPond 2.17.22 released!  @emph{July 14, 2013}
 
-We are happy to announce the release of LilyPond 2.17.21.  This
+We are happy to announce the release of LilyPond 2.17.22.  This
 release contains the usual number of bugfixes and enhancements, and contains
 some work in progress.  You will have access to the very latest features, but
 some may be incomplete, and you may encounter bugs and crashes.  If you require
 a stable version of Lilypond, we recommend using the 2.16 version.
 
+This update cures the issue with the Windows version crashing with a problem
+with positioning text.
+
 @newsEnd
 
 @newsItem
index f6c84f158152f92c417458fa51cab340e81309cc..5edd46f5ac4af97ed993b943a82b3793fa27028b 100644 (file)
@@ -26,6 +26,17 @@ NOTE:
   * don't duplicate entries from news-front.itexi
 @end ignore
 
+@newsItem
+@subsubheading LilyPond 2.17.21 released!  @emph{June 30, 2013}
+
+We are happy to announce the release of LilyPond 2.17.21.  This
+release contains the usual number of bugfixes and enhancements, and contains
+some work in progress.  You will have access to the very latest features, but
+some may be incomplete, and you may encounter bugs and crashes.  If you require
+a stable version of Lilypond, we recommend using the 2.16 version.
+
+@newsEnd
+
 @newsItem
 @subsubheading LilyPond 2.17.20 released!  @emph{June 9, 2013}
 
index edc172823316c5f8fa5723d0f2af38922abbde3c..ccc8ed800dd36032733f74e5ba6d2dad63e61f73 100644 (file)
@@ -1,4 +1,5 @@
 # avoid 404s -- so that we can take action if any occur in /stats
+# Comment from Phil 9 July 2013 to allow tracking file through build
 
 User-agent: *
 Disallow: /doc/v1.6/
diff --git a/VERSION b/VERSION
index 599e731cf5c7671ed35819bd581d07f840f5ecb0..ecbf6bbdf58391fa6c9d7cce07d46293ad7a3bc0 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,7 +1,7 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=2
 MINOR_VERSION=17
-PATCH_LEVEL=22
+PATCH_LEVEL=23
 MY_PATCH_LEVEL=
 VERSION_STABLE=2.16.2
-VERSION_DEVEL=2.17.21
+VERSION_DEVEL=2.17.22
index d9dcc7be472ae295dd4f9d843e8e506d4a9319e9..be05016071bb46c67686a80c83c8d2a63aad0868 100644 (file)
@@ -624,14 +624,15 @@ Must be the car of an entry in `LilyPond-command-alist'."
               (l (split-file-name file))
               (dir (car l))
               (base (cadr l)))
-         (LilyPond-command-expand
-          (concat (substring string 0 b)
-                  (shell-quote-argument (concat dir base))
-                  (let ((entry (assoc (substring string b e)
-                                      LilyPond-expand-alist)))
-                    (if entry (cdr entry) ""))
-                  (substring string e))
-          file))
+         (concat (substring string 0 b)
+                 (shell-quote-argument (concat dir base))
+                 (LilyPond-command-expand
+                  (concat
+                   (let ((entry (assoc (substring string b e)
+                                       LilyPond-expand-alist)))
+                     (if entry (cdr entry) ""))
+                   (substring string e))
+                  file)))
       string)))
 
 (defun LilyPond-shell-process (name buffer command)
index 6a26177850485c28644c927dbc2275638c4b600c..309fdd6926cbe9a0463f88b9646fa0528aa3a8fe 100644 (file)
@@ -6,27 +6,7 @@ and grob creation methods to create a fully functional text spanner
 in scheme."
 }
 
-#(define my-grob-descriptions '())
-
-#(define my-event-classes (ly:make-context-mod))
-
-defineEventClass =
-#(define-void-function (parser location class parent)
-   (symbol? symbol?)
-   (ly:add-context-mod
-    my-event-classes
-    `(apply
-      ,(lambda (context class parent)
-        (ly:context-set-property!
-         context
-         'EventClasses
-         (event-class-cons
-          class
-          parent
-          (ly:context-property context 'EventClasses '()))))
-      ,class ,parent)))
-
-\defineEventClass #'scheme-text-span-event #'span-event
+#(define-event-class 'scheme-text-span-event 'span-event)
 
 #(define (add-grob-definition grob-name grob-entry)
    (let* ((meta-entry   (assoc-get 'meta grob-entry))
@@ -49,9 +29,9 @@ defineEventClass =
      (set! meta-entry (assoc-set! meta-entry 'interfaces
                                   ifaces-entry))
      (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
-     (set! my-grob-descriptions
+     (set! all-grob-descriptions
            (cons (cons grob-name grob-entry)
-                 my-grob-descriptions))))
+                 all-grob-descriptions))))
 
 #(add-grob-definition
   'SchemeTextSpanner
@@ -197,8 +177,7 @@ schemeTextSpannerEnd =
 \layout {
   \context {
     \Global
-    \grobdescriptions #my-grob-descriptions
-    #my-event-classes
+    \grobdescriptions #all-grob-descriptions
   }
   \context {
     \Voice
index eb7e0ef62ef82f230f017ae7cb20822ac1a972bd..df9cdd96da7859e36777209a471eea3beb5eea30 100644 (file)
@@ -16,7 +16,6 @@
 
 \new Voice
 {
-    \unset Staff.minimumVerticalExtent
     \override Score.RehearsalMark.font-size = #20
     
     \slurDown c4 ( g4  c''4)
index c1c35d881772d7c9d40358d2fb3e73c298bbb679..8898eec6d3c726a2bd12256b801a9e20cd65fe52 100644 (file)
@@ -8,13 +8,13 @@
 \layout{
  \context{
    \TabStaff
-   \override TimeSignature.stencil = ##f
+   \omit TimeSignature
  }
  \context{
    \TabVoice
    \remove "Beam_engraver"
    \remove "Stem_engraver"
-   \override TupletBracket.number-visibility = ##f
+   \omit TupletNumber
  }
 }
 
index 64f8dd8e15a0fdb3fbf9d2f8fd1821188395c231..f58a793ed4ef805fcbcf4cd47435e88de47edf82 100644 (file)
@@ -211,15 +211,3 @@ LY_DEFINE (ly_context_events_below, "ly:context-events-below",
   Context *ctx = unsmob_context (context);
   return ctx->events_below ()->self_scm ();
 }
-
-LY_DEFINE (ly_make_event_class, "ly:make-event-class",
-           2, 0, 0, (SCM context, SCM type),
-           "Make an event class (a list of types) from the given @var{type}"
-           " within the global context containing @var{context}.")
-{
-  LY_ASSERT_SMOB (Context, context, 1);
-  LY_ASSERT_TYPE (ly_is_symbol, type, 2);
-
-  Context *ctx = unsmob_context (context);
-  return ctx->make_event_class (type);
-}
index 3da638fe557922cdee4817b22d98e937f6ba38a5..583b2eac89b7705762fb32968e310c6fb7e202ac 100644 (file)
@@ -92,7 +92,6 @@ Context::Context ()
   definition_mods_ = SCM_EOL;
   event_source_ = 0;
   events_below_ = 0;
-  ancestor_lookup_ = SCM_UNDEFINED;
 
   smobify_self ();
 
@@ -257,8 +256,8 @@ Context::set_property_from_event (SCM sev)
       }
           
       bool ok = true;
-      if (val != SCM_EOL)
-        ok = type_check_assignment (sym, val, ly_symbol2scm ("translation-type?"));
+      ok = type_check_assignment (sym, val, ly_symbol2scm ("translation-type?"));
+
       if (ok)
         set_property (sym, val);
     }
@@ -479,7 +478,9 @@ be called from any other place than the send_stream_event macro.
 void
 Context::internal_send_stream_event (SCM type, Input *origin, SCM props[])
 {
-  Stream_event *e = new Stream_event (make_event_class (type), origin);
+  Stream_event *e = new Stream_event
+    (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), type),
+     origin);
   for (int i = 0; props[i]; i += 2)
     {
       e->set_property (props[i], props[i + 1]);
@@ -619,14 +620,6 @@ Context::get_score_context () const
     return 0;
 }
 
-SCM
-Context::make_event_class (SCM event_type)
-{
-  if (SCM_UNBNDP (ancestor_lookup_))
-    ancestor_lookup_ = get_global_context ()->ancestor_lookup_;
-  return scm_hashq_ref (ancestor_lookup_, event_type, SCM_EOL);
-}
-
 Output_def *
 Context::get_output_def () const
 {
@@ -696,8 +689,6 @@ Context::mark_smob (SCM sm)
   if (me->events_below_)
     scm_gc_mark (me->events_below_->self_scm ());
 
-  scm_gc_mark (me->ancestor_lookup_);
-
   return me->properties_scm_;
 }
 
index db1303d63ce3b918f95e5d9f254c589a84bf89ea..b8bf1234c04d625fe36c635c38aa3bad1a24c85b 100644 (file)
@@ -53,7 +53,7 @@ Engraver::make_grob_info (Grob *e, SCM cause)
   /* TODO: Remove Music code when it's no longer needed */
   if (Music *m = unsmob_music (cause))
     {
-      cause = m->to_event (context ())->unprotect ();
+      cause = m->to_event ()->unprotect ();
     }
   if (e->get_property ("cause") == SCM_EOL
       && (unsmob_stream_event (cause) || unsmob_grob (cause)))
index 39e18cd57c897db66fb029fdd4bf7d4f5e375664..20ee7c149fba5eb80f000c94f95b3a6e5f2ab565 100644 (file)
@@ -88,7 +88,7 @@ Footnote_engraver::acknowledge_grob (Grob_info info)
           return;
         }
 
-      footnotify (info.grob (), mus->to_event (context ())->unprotect ());
+      footnotify (info.grob (), mus->to_event ()->unprotect ());
 
       // This grob has exhausted its footnote
       info.grob ()->set_property ("footnote-music", SCM_EOL);
index 8f22b943effe787d69033023ce8196d99486cafb..49bfff6e19248326c4347662fd6249559dea617d 100644 (file)
@@ -52,12 +52,6 @@ Global_context::Global_context (Output_def *o)
   else
     globaldef->apply_default_property_operations (this);
 
-  SCM p = get_property ("EventClasses");
-
-  ancestor_lookup_ = scm_make_hash_table (scm_length (p));
-  for (; scm_is_pair (p); p = scm_cdr (p))
-    scm_hashq_set_x (ancestor_lookup_, scm_caar (p), scm_car (p));
-
   default_child_ = ly_symbol2scm ("Score");
   accepts_list_ = scm_list_1 (default_child_);
 }
index 794f275287e1f9fcbe404d22c44dfc731c782e6d..14c348f6e4a91c658f30ec36d1570a5b93609ed2 100644 (file)
@@ -118,13 +118,6 @@ public:
   virtual Moment now_mom () const;
   virtual Context *get_default_interpreter (string context_id = "");
 
-  // It would make some sense to have the following just available in
-  // a global context.  It would be decidedly tricky, however, to have
-  // it initialized before the constructor of its Context base class
-  // was able to trigger garbage collection.
-  SCM ancestor_lookup_;
-  SCM make_event_class (SCM);
-
   bool is_alias (SCM) const;
   void add_alias (SCM);
   void add_context (Context *trans);
index b0f48371048a50bc6f4a3d953d89fc20828a88da..83cc5ff4c3148a4add8d1c7b165bc46a0bfe8829 100644 (file)
@@ -24,7 +24,6 @@
 #include "moment.hh"
 #include "pitch.hh"
 #include "prob.hh"
-#include "context.hh"
 
 #define is_mus_type(x) internal_is_music_type (ly_symbol2scm (x))
 
@@ -40,7 +39,7 @@ public:
 
   bool internal_is_music_type (SCM) const;
 
-  Stream_event *to_event (Context *) const;
+  Stream_event *to_event () const;
 
   DECLARE_SCHEME_CALLBACK (relative_callback, (SCM, SCM));
   Pitch to_relative_octave (Pitch);
index 23aaba30bfe9f61f028ecb12c8681019ebfac6fd..9a5473ddd50e708edcee23b7b6468dfafbef03c6 100644 (file)
@@ -34,7 +34,7 @@ struct Building
 {
   Real start_;
   Real end_;
-  Real start_height_;
+  Real y_intercept_;
   Real slope_;
 
   void precompute (Real start, Real start_height, Real end_height, Real end);
@@ -46,6 +46,7 @@ struct Building
   Real intersection_x (Building const &other) const;
   void leading_part (Real chop);
   bool conceals (Building const &other, Real x) const;
+  Real shift_to_intersect (Real x, Real y) const;
 };
 
 class Skyline
index 0df70e20082f50bb4a6f131b00d6f55382f9b6af..c1a6e4b0f43665380e51fca28eec4d19895725ab 100644 (file)
@@ -722,7 +722,7 @@ BOM_UTF8    \357\273\277
                yyterminate ();
 }
 
-<maininput>. {
+<maininput>{ANY_CHAR} {
        while (include_stack_.size () > main_input_level_
               && close_input ())
                ;
index 27909a6bc2a43bccca2bcce48fdb029099f3eb6d..5e3b1c0f697ed6bcdda79e01ee761849163028b2 100644 (file)
@@ -399,16 +399,6 @@ print_scm_val (SCM val)
 bool
 type_check_assignment (SCM sym, SCM val, SCM type_symbol)
 {
-  bool ok = true;
-
-  /*
-    Always succeeds.
-
-
-    TODO: should remove #f from allowed vals?
-  */
-  if (val == SCM_EOL || val == SCM_BOOL_F)
-    return ok;
 
   // If undefined, some internal function caused it...should never happen.
   assert (val != SCM_UNDEFINED);
@@ -429,26 +419,34 @@ type_check_assignment (SCM sym, SCM val, SCM type_symbol)
         scm_throw (ly_symbol2scm ("ly-file-failed"), scm_list_3 (ly_symbol2scm ("typecheck"),
                                                                  sym, val));
 
-      warning (_ ("doing assignment anyway"));
+      warning (_ ("skipping assignment"));
+      return false;
     }
-  else
+
+  /*
+    Always succeeds.
+
+
+    TODO: should remove #f from allowed vals?
+  */
+  if (val == SCM_EOL || val == SCM_BOOL_F)
+    return true;
+
+  if (val != SCM_EOL
+      && ly_is_procedure (type)
+      && scm_call_1 (type, val) == SCM_BOOL_F)
     {
-      if (val != SCM_EOL
-          && ly_is_procedure (type)
-          && scm_call_1 (type, val) == SCM_BOOL_F)
-        {
-          ok = false;
-          SCM typefunc = ly_lily_module_constant ("type-name");
-          SCM type_name = scm_call_1 (typefunc, type);
-
-          warning (_f ("type check for `%s' failed; value `%s' must be of type `%s'",
-                       ly_symbol2string (sym).c_str (),
-                       print_scm_val (val),
-                       ly_scm2string (type_name).c_str ()));
-          progress_indication ("\n");
-        }
+      SCM typefunc = ly_lily_module_constant ("type-name");
+      SCM type_name = scm_call_1 (typefunc, type);
+      
+      warning (_f ("type check for `%s' failed; value `%s' must be of type `%s'",
+                   ly_symbol2string (sym).c_str (),
+                   print_scm_val (val),
+                   ly_scm2string (type_name).c_str ()));
+      progress_indication ("\n");
+      return false;
     }
-  return ok;
+  return true;
 }
 
 /* some SCM abbrevs
index be1fb2ed131cb0451ab4e373db8e46d52dd9982a..eea6a9ca818a58552a5d4cdda7a159754696d186 100644 (file)
@@ -275,7 +275,7 @@ Music::origin () const
   ES TODO: This method should probably be reworked or junked.
 */
 Stream_event *
-Music::to_event (Context *c) const
+Music::to_event () const
 {
   SCM class_name = ly_camel_case_2_lisp_identifier (get_property ("name"));
 
@@ -283,8 +283,9 @@ Music::to_event (Context *c) const
   if (!internal_is_music_type (class_name))
     programming_error ("Not a music type");
 
-  Stream_event *e = new Stream_event (c->make_event_class (class_name),
-                                      mutable_property_alist_);
+  Stream_event *e = new Stream_event
+    (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), class_name),
+     mutable_property_alist_);
   Moment length = get_length ();
   if (length.to_bool ())
     e->set_property ("length", length.smobbed_copy ());
@@ -297,7 +298,7 @@ Music::to_event (Context *c) const
       for (; scm_is_pair (art_mus); art_mus = scm_cdr (art_mus))
         {
           Music *m = unsmob_music (scm_car (art_mus));
-          art_ev = scm_cons (m->to_event (c)->unprotect (), art_ev);
+          art_ev = scm_cons (m->to_event ()->unprotect (), art_ev);
         }
       e->set_property ("articulations", scm_reverse_x (art_ev, SCM_EOL));
     }
@@ -314,7 +315,7 @@ Music::to_event (Context *c) const
 void
 Music::send_to_context (Context *c)
 {
-  Stream_event *ev = to_event (c);
+  Stream_event *ev = to_event ();
   c->event_source ()->broadcast (ev);
   ev->unprotect ();
 }
index c0c9acc89306268535dca2c3a13b2fc56e0b4d54..69c7857b7eeec1ff7098baff288f5ccf080c0fbb 100644 (file)
@@ -224,8 +224,8 @@ Part_combine_iterator::kill_mmrest (int in)
   if (!mmrest_event_)
     {
       mmrest_event_ = new Stream_event
-      (handles_[in].get_context ()->make_event_class
-       (ly_symbol2scm ("multi-measure-rest-event")));
+        (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"),
+                     ly_symbol2scm ("multi-measure-rest-event")));
       mmrest_event_->set_property ("duration", SCM_EOL);
       mmrest_event_->unprotect ();
     }
@@ -256,15 +256,16 @@ Part_combine_iterator::unisono (bool silent)
       if (playing_state_ != UNISONO
           && newstate == UNISONO)
         {
-          Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_)
-                         ->get_outlet ();
           if (!unisono_event_)
             {
               unisono_event_ = new Stream_event
-              (out->make_event_class (ly_symbol2scm ("unisono-event")));
+                (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"),
+                             ly_symbol2scm ("unisono-event")));
               unisono_event_->unprotect ();
             }
 
+          Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_)
+                         ->get_outlet ();
           out->event_source ()->broadcast (unisono_event_);
           playing_state_ = UNISONO;
         }
@@ -290,8 +291,8 @@ Part_combine_iterator::solo1 ()
           if (!solo_one_event_)
             {
               solo_one_event_ = new Stream_event
-              (first_iter_->get_outlet ()->make_event_class
-               (ly_symbol2scm ("solo-one-event")));
+                (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"),
+                             ly_symbol2scm ("solo-one-event")));
               solo_one_event_->unprotect ();
             }
 
@@ -317,8 +318,8 @@ Part_combine_iterator::solo2 ()
           if (!solo_two_event_)
             {
               solo_two_event_ = new Stream_event
-              (second_iter_->get_outlet ()->make_event_class
-               (ly_symbol2scm ("solo-two-event")));
+                (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"),
+                             ly_symbol2scm ("solo-two-event")));
               solo_two_event_->unprotect ();
             }
 
index c1edba9702eb5476335adeb867db71a7a2e4de5c..64daa8ea5b615be924c82bf08cf37d9d5619c315 100644 (file)
@@ -47,7 +47,7 @@ Rhythmic_music_iterator::process (Moment m)
       descend_to_bottom_context ();
 
       Context *c = get_outlet ();
-      Stream_event *ev = get_music ()->to_event (c);
+      Stream_event *ev = get_music ()->to_event ();
       SCM arts = ev->get_property ("articulations");
 
       if (scm_is_pair (arts))
index 624334ab7964f695ee0233a3e3832f753589fb38..5073e69e14b3eaccb805a712e8979be7d9b8856f 100644 (file)
@@ -121,42 +121,30 @@ Building::precompute (Real start, Real start_height, Real end_height, Real end)
   assert (!isinf (slope_) && !isnan (slope_));
 
   if (isinf (start))
-    assert (start_height == end_height);
-
-  start_height_ = start_height;
+    {
+      assert (start_height == end_height);
+      y_intercept_ = start_height;
+    }
+  else
+    y_intercept_ = start_height - slope_ * start;
 }
 
-// Because of the way slope is calculated as a ratio of usually small
-// differences, its precision is not sufficient for extrapolating
-// significantly from the original interval.  For that reason, we
-// don't store the y0 value that would allow more precalculation by using
-// y = x * slope + y0 
-// rather than
-// y = (x - xstart) * slope + ystart
-
 inline Real
 Building::height (Real x) const
 {
-  return (isinf (x) || isinf (start_)) ? start_height_
-    : slope_ * (x - start_) + start_height_;
+  return isinf (x) ? y_intercept_ : slope_ * x + y_intercept_;
 }
 
 void
 Building::print () const
 {
-  printf ("%f (x - x0) + %f from %f to %f\n", slope_, start_height_, start_, end_);
+  printf ("%f x + %f from %f to %f\n", slope_, y_intercept_, start_, end_);
 }
 
 inline Real
 Building::intersection_x (Building const &other) const
 {
-  Real ret = start_
-    - (other.start_height_ - start_height_
-       - other.slope_ * (other.start_ - start_))
-    /(other.slope_ - slope_);
-  /* A numerically symmetric version would be
-     x = (x1+x0)/2 - (y1-y0 - (s1+s0)(x1-x0)/2)/(s1-s0)
-   */
+  Real ret = (y_intercept_ - other.y_intercept_) / (other.slope_ - slope_);
   return isnan (ret) ? -infinity_f : ret;
 }
 
@@ -167,6 +155,19 @@ Building::leading_part (Real chop)
   end_ = chop;
 }
 
+// Returns a shift s such that (x + s, y) intersects the roof of
+// this building.  If no such shift exists, returns infinity_f.
+Real
+Building::shift_to_intersect (Real x, Real y) const
+{
+  // Solve for s: y = (x + s)*m + b
+  Real ret = (y - y_intercept_ - slope_ * x) / slope_;
+
+  if (ret >= start_ && ret <= end_ && !isinf (ret))
+    return ret;
+  return infinity_f;
+}
+
 static Real
 first_intersection (Building const &b, list<Building> *const s, Real start_x)
 {
@@ -176,7 +177,7 @@ first_intersection (Building const &b, list<Building> *const s, Real start_x)
 
       // conceals and intersection_x involve multiplication and
       // division. Avoid that, if we can.
-      if (c.start_height_ == -infinity_f)
+      if (c.y_intercept_ == -infinity_f)
         {
           if (c.end_ > b.end_)
             return b.end_;
@@ -199,12 +200,16 @@ first_intersection (Building const &b, list<Building> *const s, Real start_x)
   return b.end_;
 }
 
-// conceals returns true if *this is strictly above other at x
-
 bool
 Building::conceals (Building const &other, Real x) const
 {
-  return height (x) > other.height (x);
+  if (slope_ == other.slope_)
+    return y_intercept_ > other.y_intercept_;
+
+  /* their slopes were not equal, so there is an intersection point */
+  Real i = intersection_x (other);
+  return (i <= x && slope_ > other.slope_)
+         || (i > x && slope_ < other.slope_);
 }
 
 // Remove redundant empty buildings from the skyline.
@@ -218,7 +223,7 @@ Skyline::normalize ()
 
   for (i = buildings_.begin (); i != buildings_.end (); i++)
     {
-      if (last_empty && i->start_height_ == -infinity_f)
+      if (last_empty && i->y_intercept_ == -infinity_f)
         {
           list<Building>::iterator last = i;
           last--;
@@ -226,7 +231,7 @@ Skyline::normalize ()
           buildings_.erase (i);
           i = last;
         }
-      last_empty = (i->start_height_ == -infinity_f);
+      last_empty = (i->y_intercept_ == -infinity_f);
     }
 
   assert (buildings_.front ().start_ == -infinity_f);
@@ -245,10 +250,10 @@ Skyline::deholify ()
 
   for (right = buildings_.begin (); right != buildings_.end (); right++)
     {
-      if (center != buildings_.begin () && center->start_height_ == -infinity_f)
+      if (center != buildings_.begin () && center->y_intercept_ == -infinity_f)
         {
           Real p1 = left->height (left->end_);
-          Real p2 = right->start_height_;
+          Real p2 = right->height (right->start_);
           *center = Building (center->start_, p1, p2, center->end_);
 
           left = center;
@@ -280,7 +285,7 @@ Skyline::internal_merge_skyline (list<Building> *s1, list<Building> *s2,
       // Optimization: if the other skyline is empty at this point,
       // we can avoid testing some intersections. Just grab as many
       // buildings from s1 as we can, and shove them onto the output.
-      if (c.start_height_ == -infinity_f
+      if (c.y_intercept_ == -infinity_f
           && c.end_ >= b.end_)
         {
           list<Building>::iterator i = s1->begin ();
@@ -288,7 +293,6 @@ Skyline::internal_merge_skyline (list<Building> *s1, list<Building> *s2,
           while (i != s1->end () && i->end_ <= c.end_)
             i++;
 
-          s1->front ().start_height_ = s1->front ().height (x);
           s1->front ().start_ = x;
           result->splice (result->end (), *s1, s1->begin (), i);
           x = result->back ().end_;
@@ -299,7 +303,6 @@ Skyline::internal_merge_skyline (list<Building> *s1, list<Building> *s2,
       Real end = first_intersection (b, s2, x);
       if (s2->empty ())
         {
-          b.start_height_ = b.height (last_end);
           b.start_ = last_end;
           result->push_back (b);
           break;
@@ -308,7 +311,6 @@ Skyline::internal_merge_skyline (list<Building> *s1, list<Building> *s2,
       if (end >= x)
         {
           b.leading_part (end);
-          b.start_height_ = b.height (last_end);
           b.start_ = last_end;
           last_end = b.end_;
           result->push_back (b);
@@ -356,7 +358,7 @@ non_overlapping_skyline (list<Building> *const buildings)
   while (i != buildings->end ())
     {
       Real x1 = i->start_;
-      Real y1 = i->start_height_;
+      Real y1 = i->height (i->start_);
       Real x2 = i->end_;
       Real y2 = i->height (i->end_);
 
@@ -399,7 +401,7 @@ public:
   bool operator () (Building const &b1, Building const &b2)
   {
     return b1.start_ < b2.start_
-           || (b1.start_ == b2.start_ && b1.start_height_ > b2.start_height_);
+           || (b1.start_ == b2.start_ && b1.height (b1.start_) > b2.height (b1.start_));
   }
 };
 
@@ -609,7 +611,7 @@ Skyline::raise (Real r)
 {
   list<Building>::iterator end = buildings_.end ();
   for (list<Building>::iterator i = buildings_.begin (); i != end; i++)
-    i->start_height_ += sky_ * r;
+    i->y_intercept_ += sky_ * r;
 }
 
 void
@@ -620,6 +622,7 @@ Skyline::shift (Real s)
     {
       i->start_ += s;
       i->end_ += s;
+      i->y_intercept_ -= s * i->slope_;
     }
 }
 
@@ -664,7 +667,7 @@ Skyline::padded (Real horizon_padding) const
     {
       if (i->start_ > -infinity_f)
         {
-          Real height = i->start_height_;
+          Real height = i->height (i->start_);
           if (height > -infinity_f)
             {
               // Add the sloped building that pads the left side of the current building.
@@ -768,7 +771,7 @@ Skyline::max_height () const
   list<Building>::const_iterator i;
   for (i = buildings_.begin (); i != buildings_.end (); ++i)
     {
-      ret = max (ret, i->start_height_);
+      ret = max (ret, i->height (i->start_));
       ret = max (ret, i->height (i->end_));
     }
 
@@ -786,7 +789,7 @@ Skyline::left () const
 {
   for (list<Building>::const_iterator i (buildings_.begin ());
        i != buildings_.end (); i++)
-    if (i->start_height_ > -infinity_f)
+    if (i->y_intercept_ > -infinity_f)
       return i->start_;
 
   return infinity_f;
@@ -797,7 +800,7 @@ Skyline::right () const
 {
   for (list<Building>::const_reverse_iterator i (buildings_.rbegin ());
        i != buildings_.rend (); ++i)
-    if (i->start_height_ > -infinity_f)
+    if (i->y_intercept_ > -infinity_f)
       return i->end_;
 
   return -infinity_f;
@@ -815,7 +818,7 @@ void
 Skyline::set_minimum_height (Real h)
 {
   Skyline s (sky_);
-  s.buildings_.front ().start_height_ = h * sky_;
+  s.buildings_.front ().y_intercept_ = h * sky_;
   merge (s);
 }
 
@@ -846,7 +849,7 @@ Skyline::is_empty () const
   if (!buildings_.size ())
     return true;
   Building b = buildings_.front ();
-  return b.end_ == infinity_f && b.start_height_ == -infinity_f;
+  return b.end_ == infinity_f && b.y_intercept_ == -infinity_f;
 }
 
 void
index 2541163a7651de2c352be99c544f147351b4a66b..99647c75d03182f2ab159a44d4a86c9264d50149 100644 (file)
@@ -26,7 +26,6 @@
   \defaultchild "Score"
   \description "Hard coded entry point for LilyPond.  Cannot be tuned."
   \grobdescriptions #all-grob-descriptions
-  EventClasses = #all-event-classes
 }
 
 \context {
index a108212eae4a800bc32eb8de2af269085d74b057..8e3ef0e7ef10ffa3ac1a0538b92bb69bf2fd431a 100644 (file)
@@ -37,7 +37,6 @@
   \accepts Score
   \defaultchild Score
   \description "Hard coded entry point for LilyPond.  Cannot be tuned."
-  EventClasses = #all-event-classes
 }
 
 \context {
index 2b2242427b99f3174dae747d06a1c32d7c6ecaa9..e279c6d88d13a562c3d20b58d42cfe91a9dc43ad 100644 (file)
@@ -4,7 +4,7 @@ LANGS = $(shell $(PYTHON) $(top-src-dir)/python/langdefs.py)
 
 TELY_FILES := $(call src-wildcard,*.tely)
 TEXI_FILES := $(call src-wildcard,*.texi)
-MASTER_TEXI_FILES := $(TEXI_FILES) $(TELY_FILES:%.tely=$(outdir)/%.texi)
+MASTER_TEXI_FILES := $(TEXI_FILES:%=$(outdir)/%) $(TELY_FILES:%.tely=$(outdir)/%.texi)
 
 TEXINFO_MANUALS =\
  $(TELY_FILES:%.tely=%)\
index ad11f04379fc1937646e82df063417a92fb566c7..bf3b2ad865d747ef26375efc3f96e272fa7499a3 100644 (file)
@@ -252,12 +252,12 @@ $(OUT)/web.%.xref-map: $(top-src-dir)/Documentation/%/web.texi
        $(DO_TEXI_DEP) $(EXTRACT_TEXI_FILENAMES) --split=node $<
 
 # Build the English website
-$(OUT)/index.html: $(top-src-dir)/Documentation/web.texi $(xref-files)
+$(OUT)/index.html: $(top-src-dir)/Documentation/web.texi $(version-files) $(xref-files)
        $(DO_TEXI_DEP) $(TEXI2HTML) $<
 
 # Build translated websites
 $(eval $(foreach l,$(WEB_LANGS),\
-$(eval $(OUT)/$(l)/index.html: $(top-src-dir)/Documentation/$(l)/web.texi $(xref-files); \
+$(eval $(OUT)/$(l)/index.html: $(top-src-dir)/Documentation/$(l)/web.texi $(version-files) $(xref-files); \
        $$(DO_TEXI_DEP) $$(TEXI2HTML) --lang="$(l)" $$<; ) \
 ))
 
index 354e0f3e91df756b2de4f16823af564a6f50cdf0..dd0df9b1fcb6b8ea5f80fd3adbf0d7f02a6ae7b6 100644 (file)
@@ -40,7 +40,12 @@ fet_beginchar ("accordion register discant", "discant")
 
        set_char_box (r# + accreg_linethickness# / 2,
                      r# + accreg_linethickness# / 2,
-                     0, 2 r# + 0.7 accreg_linethickness#);
+                     0.35 accreg_linethickness# / 2,
+                     2 r# + 0.35 accreg_linethickness# / 2);
+
+       local_copy (transform)(currenttransform);
+       currenttransform :=
+          currenttransform shifted (0, -vround (0.35 accreg_linethickness));
 
        lh = vround (2/3 r);
        lt = vround (0.7 accreg_linethickness);
@@ -123,7 +128,12 @@ fet_beginchar ("accordion register freebass", "freebass")
 
        set_char_box (r# + accreg_linethickness# / 2,
                      r# + accreg_linethickness# / 2,
-                     0, 2 r# + 0.7 accreg_linethickness#);
+                     0.35 accreg_linethickness#,
+                     2 r# + 0.35 accreg_linethickness#);
+
+       local_copy (transform)(currenttransform);
+       currenttransform :=
+         currenttransform shifted (0, -vround (0.35 accreg_linethickness));
 
        lh = vround r;
        lt = vround (0.7 accreg_linethickness);
@@ -181,7 +191,12 @@ fet_beginchar ("accordion register stdbass", "stdbass")
 
        set_char_box (r# + accreg_linethickness# / 2,
                      r# + accreg_linethickness# / 2,
-                     0, 2 r# + 0.7 accreg_linethickness#);
+                     0.35 accreg_linethickness#,
+                     2 r# + 0.35 accreg_linethickness#);
+
+       local_copy (transform)(currenttransform);
+       currenttransform :=
+          currenttransform shifted (0, -vround (0.35 accreg_linethickness));
 
        lh = vround (1/2 r);
        lt = vround (0.7 accreg_linethickness);
@@ -253,7 +268,12 @@ fet_beginchar ("accordion register bayanbass", "bayanbass")
 
        set_char_box (accreg_lh# + accreg_linethickness# / 2,
                      accreg_lh# + accreg_linethickness# / 2,
-                     0, 3 accreg_lh# + accreg_linethickness#);
+                     0.5 accreg_linethickness#,
+                     3 accreg_lh# + 0.5 accreg_linethickness#);
+
+       local_copy (transform)(currenttransform);
+       currenttransform :=
+          currenttransform shifted (0, -vround (0.5 accreg_linethickness));
 
        h := 3 lh + lt;
 
index ab1d46b28bf028ddc6a783d284f0cebc1126e59b..fe7cf424e0f8e248bb864e83a50037f5ead095bb 100644 (file)
@@ -6,10 +6,10 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: lilypond 2.17.21\n"
+"Project-Id-Version: lilypond 2.17.22\n"
 "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu."
 "lilypond.bugs\n"
-"POT-Creation-Date: 2013-06-30 16:32+0100\n"
+"POT-Creation-Date: 2013-07-14 10:51+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1702,12 +1702,12 @@ msgstr ""
 msgid "removing this vertical group"
 msgstr ""
 
-#: axis-group-interface.cc:706
+#: axis-group-interface.cc:704
 #, c-format
 msgid "\"%s\" is not a valid outside-staff-placement-directive"
 msgstr ""
 
-#: axis-group-interface.cc:777
+#: axis-group-interface.cc:774
 msgid "an outside-staff object should have a direction, defaulting to up"
 msgstr ""
 
@@ -1805,17 +1805,17 @@ msgstr ""
 msgid "need symbol arguments for \\override and \\revert"
 msgstr ""
 
-#: context.cc:150
+#: context.cc:149
 #, c-format
 msgid "cannot find or create new `%s'"
 msgstr ""
 
-#: context.cc:229
+#: context.cc:228
 #, c-format
 msgid "cannot find or create `%s' called `%s'"
 msgstr ""
 
-#: context.cc:426
+#: context.cc:425
 #, c-format
 msgid "cannot find or create: `%s'"
 msgstr ""
@@ -3303,24 +3303,24 @@ msgstr ""
 msgid "`~a' failed (~a)\n"
 msgstr ""
 
-#: backend-library.scm:90
+#: backend-library.scm:93
 #, scheme-format
 msgid "Converting to `~a'...\n"
 msgstr ""
 
 #. Do not try to guess the name of the png file,
 #. GS produces PNG files like BASE-page%d.png.
-#: backend-library.scm:99
+#: backend-library.scm:102
 #, scheme-format
 msgid "Converting to ~a..."
 msgstr ""
 
-#: backend-library.scm:137
+#: backend-library.scm:140
 #, scheme-format
 msgid "Writing header field `~a' to `~a'..."
 msgstr ""
 
-#: backend-library.scm:187
+#: backend-library.scm:190
 #, scheme-format
 msgid "missing stencil expression `~S'"
 msgstr ""
@@ -3371,6 +3371,16 @@ msgstr ""
 msgid "unknown parent class `~a'"
 msgstr ""
 
+#: define-event-classes.scm:107
+#, scheme-format
+msgid "Cannot redefine event class `~S'"
+msgstr ""
+
+#: define-event-classes.scm:109
+#, scheme-format
+msgid "Undefined parent event class `~S'"
+msgstr ""
+
 #: define-markup-commands.scm:985
 msgid "no systems found in \\score markup, does it have a \\layout block?"
 msgstr ""
index 180675e2f8a4a616b91f9bd1a757bddee7f5a20c..1cbd9fb8b276a74577f53a6b9361d020577f2738 100644 (file)
@@ -641,7 +641,6 @@ are described in @file{scm/bar-line.scm}.")
      (apply translator-property-description x))
 
    `(
-     (EventClasses ,cheap-list? "The initial list of event classes.")
 
      (associatedVoiceContext ,ly:context? "The context object of the
 @code{Voice} that has the melody for this @code{Lyrics}.")
index fb790a591fd562d0fd4b85199a6daad9698f0fbe..dd6405a73e657984b842e4f7b384dc4051e45292 100644 (file)
                 (acons elt lineage alist))
               classlist class))))
 
+(define all-event-classes
+  (fold (lambda (elt classlist)
+          (event-class-cons (cdr elt) (car elt) classlist))
+        '() event-classes))
+
+;; Maps event-class to a list of ancestors (inclusive)
+(define ancestor-lookup (make-hash-table (length all-event-classes)))
+
+(define (ancestor-lookup-initialize)
+  (hash-clear! ancestor-lookup)
+  (for-each (lambda (ent) (hashq-set! ancestor-lookup (car ent) ent))
+            all-event-classes))
+
+(ancestor-lookup-initialize)
+(call-after-session ancestor-lookup-initialize)
+
 ;; Each class will be defined as
 ;; (class parent grandparent .. )
 ;; so that (eq? (cdr class) parent) holds.
 
+(define-public (define-event-class class parent)
+  "Defines a new event @code{class} derived from @code{parent}, a
+previously defined event class."
+  (let ((parentclass (ly:make-event-class parent)))
+    (cond
+     ((ly:make-event-class class)
+      (ly:error (_ "Cannot redefine event class `~S'") class))
+     ((not parentclass)
+      (ly:error (_ "Undefined parent event class `~S'" parentclass)))
+     (else
+      (hashq-set! ancestor-lookup
+                  class
+                  (cons class parentclass))))
+    *unspecified*))
+
+;; TODO: Allow entering more complex classes, by taking unions.
+(define-public (ly:make-event-class leaf)
+  (hashq-ref ancestor-lookup leaf))
+
 (define-public (ly:in-event-class? ev cl)
   "Does event @var{ev} belong to event class @var{cl}?"
   (memq cl (ly:event-property ev 'class)))
 
-(define-public all-event-classes
-  (fold (lambda (elt classlist)
-          (event-class-cons (cdr elt) (car elt) classlist))
-        '() event-classes))
-
 ;; does this exist in guile already?
 (define (map-tree f t)
   (cond
index ee71f903c71ff164acb85566e84b5512398c7bff..e2b9e6acd71ae30503899413a3b3c923fd45b478 100644 (file)
@@ -25,7 +25,7 @@
 ;; TODO: junk the meta field in favor of something more compact?
 
 
-(define-public all-grob-descriptions
+(define-session-public all-grob-descriptions
   `(
     (Accidental
      . (
index 92c2b5248705177f9d09072a182dae97a465b4cf..ef31ec1f6aa3c809deaf8515dbf0271b7b30966c 100644 (file)
@@ -16,8 +16,6 @@
 ;;;; You should have received a copy of the GNU General Public License
 ;;;; along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
-(define doc-context (ly:make-global-context $defaultlayout))
-
 (define (music-props-doc)
   (make <texi-node>
     #:name "Music properties"
@@ -33,7 +31,7 @@
 (define music-types->names (make-hash-table 61))
 (filter-map (lambda (entry)
               (let* ((class (ly:camel-case->lisp-identifier (car entry)))
-                     (classes (ly:make-event-class doc-context class)))
+                     (classes (ly:make-event-class class)))
                 (if classes
                     (map
                      (lambda (cl)
@@ -90,7 +88,7 @@
   (let* ((namesym  (car obj))
          (props (cdr obj))
          (class (ly:camel-case->lisp-identifier namesym))
-         (classes (ly:make-event-class doc-context class))
+         (classes (ly:make-event-class class))
          (accept-list (if classes
                           (human-listify
                            (map ref-ify