]> git.donarmstrong.com Git - lilypond.git/commitdiff
release: 1.1.65 release/1.1.65
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 22 Jul 1999 09:59:01 +0000 (11:59 +0200)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 22 Jul 1999 09:59:01 +0000 (11:59 +0200)
53 files changed:
Documentation/man/lilypond.yo
Documentation/man/out/lilypond.1
Documentation/tex/lilypond-regtest.doc
Documentation/tex/reference-manual.yo
NEWS
TODO
VERSION
debian/out/control
input/bugs/core.ly [new file with mode: 0644]
input/denneboom.ly
input/star-spangled-banner.ly
input/test/abbreviation-beam.sly [new file with mode: 0644]
input/test/force-hshift.fly [new file with mode: 0644]
input/test/hara-kiri-switch.ly [new file with mode: 0644]
input/test/lyric-combine.ly
lily/abbreviation-beam-engraver.cc
lily/abbreviation-beam.cc
lily/auto-beam-engraver.cc
lily/beam.cc
lily/change-iterator.cc
lily/collision-engraver.cc
lily/collision.cc
lily/include/abbreviation-beam-engraver.hh
lily/include/ly-symbols.hh
lily/include/lyric-combine-music-iterator.hh
lily/include/musical-request.hh
lily/include/my-lily-lexer.hh
lily/include/my-lily-parser.hh
lily/include/slur-engraver.hh
lily/key-engraver.cc
lily/lexer.ll
lily/lyric-combine-music-iterator.cc
lily/musical-request.cc
lily/my-lily-lexer.cc
lily/my-lily-parser.cc
lily/parser.yy
lily/repeat-engraver.cc
lily/repeated-music.cc
lily/rhythmic-column-engraver.cc
lily/simultaneous-music-iterator.cc
lily/slur-engraver.cc
ly/declarations.ly
ly/dynamic.ly [deleted file]
ly/engraver.ly
ly/params.ly
ly/property.ly
ly/spanners.ly [new file with mode: 0644]
ly/textscripts.ly [new file with mode: 0644]
make/out/lilypond.lsm
make/out/lilypond.spec
mutopia/Coriolan/viola-1.ly
mutopia/Coriolan/viola-2.ly
scripts/convert-mudela.py

index c26ca52f0f2782babf7f095d7346d7e444ca5606..ed4c14180cc4e3a0b14a90aeee955dc9f09fb5c2 100644 (file)
@@ -24,6 +24,9 @@ includefile(../BLURB.in)
 
 manpageoptions()
 description(
+dit(-f,--format=)
+       Output format for sheet music. Choices are tex (for TeX
+       output), ps (for PostScript) and scm (for GUILE)
 dit(-I,--include=)
     add file(FILE) to the search path for input files.
 dit(-m,--midi)
index 82839b59b5e56e3b5b384dd3a824a08d576be63f..94a25ff3d55b0d3c8db3880bb6aeb87dec4c366a 100644 (file)
@@ -9,11 +9,15 @@ LilyPond \- the GNU Music Typesetter
 .PP 
 .SH "DESCRIPTION" 
 .PP 
-LilyPond is the GNU Project music typesetter\&. It transforms a musical
-description file into beautiful sheet music\&.
+LilyPond is a music typesetter\&.  It produces beautiful sheet music
+using a high level description file as input\&.  LilyPond is part of 
+the GNU Project\&.
 .PP 
 .PP 
 .SH "OPTIONS" 
+.IP "-f,--format=" 
+Output format for sheet music\&. Choices are tex (for TeX
+output), ps (for PostScript) and scm (for GUILE)
 .IP "-I,--include=" 
 add \fBFILE\fP to the search path for input files\&.
 .IP "-m,--midi" 
index b2c728229357cd1c169030cbd0b3c23f534dde27..8286332d3d8c01a3ca19125bfe74d47bc6a04823 100644 (file)
@@ -49,6 +49,13 @@ tremolo must be parallel to the beam.  If the stem is invisible
 
 \mudelafile{stem-tremolo.ly}
 
+Abbreviation beams (official naming?) are a kind of repeat symbol.
+To avoid confusion, abbreviation beams do not touch the stems, but 
+leave a gap.  Abbreviation beams on half notes are not ambiguous,
+and should touch the stems.
+
+\mudelafile{abbreviation-beam.sly}
+
 Beams, stems and noteheads often have communication troubles, since
 the two systems for y dimensions (1 unit = staffspace, 1 unit = 1
 point) are mixed.
@@ -157,12 +164,13 @@ Folded.  This doesn't make sense without alternatives, but it works.
 \section{Lyrics}
 
 Lyrics can be set to a melody automatically.  Excess lyrics will be
-dumped.  Lyrics will not be set over rests.  You can have melismata by
-setting a property melismaBusy.  If you want a different order than
-first Music, then Lyrics, you must precook a chord of staffs/lyrics
-and label those.  Of course \verb+\rhythm+ ignores any other rhythms
-in the piece.  Hyphens and extenders do not assume anything about
-lyric lengths, so they continue to work.
+dumped.  Lyrics will not be set over rests.  You can have melismata
+either by setting a property melismaBusy, or by setting
+automaticMelismas (which will set melismas during slurs).  If you want a
+different order than first Music, then Lyrics, you must precook a
+chord of staffs/lyrics and label those.  Of course \verb+\rhythm+
+ignores any other rhythms in the piece.  Hyphens and extenders do not
+assume anything about lyric lengths, so they continue to work.
 
 \mudelafile{lyric-combine.ly}
 
index 34e88a3dea6f34af4289b6a20883d93aeab121fb..836bd1f2f862de4956fc6217c52c6463f1882bdc 100644 (file)
@@ -16,9 +16,6 @@ COMMENT(
      for rests.fly)
 
 TODO:
-   thread
-   paper size?
-   paper variables
    the explanation of how lyrics mode parses words seems ridiculous.  
       Is there a simple way to explain this, or is the behavior
       too complicated for a reasonable explanation?
@@ -49,14 +46,6 @@ article(Mudela 1.0.21 / LilyPond 1.1.49 Reference Manual)
       (Adrian Mariano, Han-Wen Nienhuys and Jan Nieuwenhuizen)
       (nop()PIPETHROUGH(date "+%B %d, %Y")()()nop())
 
-COMMENT(
-
-* The [ ] look weird
-
-* paragraphs have too much space.
-
-)
-
 
 latexcommand(\def\interexample{})
 latexcommand(\def\preexample{\par})
@@ -72,20 +61,16 @@ whenhtml(
 includefile(html-disclaimer.yo-urg)
 )
 
-bf(This document is not up to date).  All rendered examples of course
-are current, but the rest probably isn't.  Adjusting the tutorial was
-considered more important than writing the reference manual.  We
-apologize for the inconvenience.  For a complete and up-to-date
-definition, see file(lily/parser.yy), file(lily/lexer.ll), and the
-init files.
 
-This document describes the the GNU LilyPond input format, which is an
-effective language for defining music.  We call this language (rather
+This document describes the the GNU LilyPond input format, which is a
+language for defining music.  We call this language (rather
 arrogantly) The Musical Definition Language or Mudela, for
 short.footnote(If anybody comes up with a better name, we'd gladly
-  take this. Gourlay already uses Musical Description Language,
-  G-Sharp Score Definition Language.  ISO standard 10743 defines a
-  Standard Music Description Language.  We're not being original here.)
+take this. Gourlay already uses Musical Description Language, G-Sharp
+Score Definition Language.  ISO standard 10743 defines a Standard
+Music Description Language.  We're not being original here.)
+
+This document was revised for LilyPond 1.2. 
 
 The first aim of Mudela is to define a piece of music, being complete
 from both from a musical typesetting, as from a musical performing
@@ -99,13 +84,14 @@ with the LilyPond sources for reasons and design considerations.
 
 sect(Running LilyPond)
 
-When invoked with a filename that has no extension, LilyPond will try adding
-a file(.fly) extension first, and a file(.ly) extension second.  
-If the filename ends with 
-file(.fly),  LilyPond processes  the file as music using
-file(init.fly).  In this case, LilyPond does something
-like:
-verb(\score {
+
+When invoked with a filename that has no extension, LilyPond will try
+adding a file(.ly) extension first, then a file(.sly) and then a
+file(.ly) extension second.  If the filename ends with file(.fly),
+LilyPond processes the file as music using file(init.fly).  In this
+case, LilyPond does something like: COMMENT(
+
+)verb(\score {
   \notes\relative c {
     \input "yourfile.fly"
   }
@@ -118,19 +104,29 @@ file(init.)var(ext) and process this file.  The file
 file(init.)var(ext) must contain the code(\maininput) keyword or LilyPond
 will not read the user specified file.
 
-When LilyPond processes file(filename.ly) it will produce file(filename.tex) as
-output.  If file(filename.ly) contains a second code(\paper) keyword, then
-LilyPond will produce file(filename-1.tex) as well.  Subsequent code(\paper)
-keywords will produces sequentially numbered file names.  Several files can be
-specified; they will each be processed independently.
+When LilyPond processes file(filename.ly) it will produce
+file(filename.tex) as output.  If file(filename.ly) contains a second
+code(\paper) keyword, then LilyPond will produce file(filename-1.tex)
+as well.  Subsequent code(\paper) keywords will produces sequentially
+numbered file names.  Several files can be specified; they will each
+be processed independently.footnote(Not entirely true: the status of
+GUILE is kept).
+
+
 
 sect(Syntax)
 
+
+
 subsect(Basic Mudela)
 
+Mudela is a declarative input format: in a file you can declare items
+with identifiers, and instruct LilyPond to typeset music 
+
+
 A Mudela file consists of keywords with arguments and identifier
 assignments separated by spaces, tabs or newlines.  Semicolons are
-used by some keywords and are inconsistantly required in other
+used by some keywords and are inconsistently required in other
 circumstances.  A one line comment is introduced by a code(%)
 character.  Block comments are started by code(%{) and ended by
 code(%}).  They cannot be nested.
@@ -289,7 +285,10 @@ notename of code(word).  If no notename is found, then code(word) is
 treated as a string.  If you mistype a notename, the parser will most
 likely complain that you should be in code(\lyrics) mode to do lyrics. 
 
-dit(Chord mode) Chord mode is instroduced by the keyword code(\chords).
+Since the dot has special meaning in  Note  mode, it is not possible
+to enter real numbers in this mode.
+
+dit(Chord mode) Chord mode is introduced by the keyword code(\chords).
 Very similar to Note mode.  
 COMMENT(I'm not sure how it differs)
 
@@ -325,10 +324,9 @@ extends until the next white space character.  Such words can contain numbers
 (even in Note mode), or other forbidden characters.  The dollar sign can be
 used to create and access identifiers that could not otherwise be used.  
 
-COMMENT(
 These modes are of a lexical nature. Normal and Note mode largely
 resemble each other, save the possibility of entering Reals, 
-meaning of code(_) and the resolution of words
+the meaning of code(_) and the resolution of words.  
 
 What's this about reals?  When can you enter them or not enter them?)
 
@@ -418,6 +416,24 @@ mudela(fragment,verbatim,center)(
 c'\breve gis'\longa
 )
 
+You can alter the length of duration by writing code(*)var(fraction) after a
+it.  This shorthand is convenient for long rests.   The shape of notes
+and normal restse will be unchanged.  When used in this whole-measure
+rest code(R) will fill measures with rest symbols.  
+COMMENT(
+
+)mudela(fragment,verbatim,center)(
+r1 r1*3 R1*3
+)
+If you set the code(Score.skipBars) property, then only one measure will be
+printed; with code(R), a number indicating the length of the rest will be
+displayed.  
+mudela(fragment,verbatim,center)(
+\property Score.skipBars=1
+r1 r1*3 R1*3
+)
+
+
 In order to get triplets and other tuplets, you must use the
 code(\times) keyword which multiplies the duration by a fraction.  The
 syntax is code(\times) var(fraction) var(music).  The length of all of
@@ -432,32 +448,9 @@ This happens because the Tuplet-engraver is in Voice and no Voice has
 been created yet.  You must explicitly specify the Voice context in
 this situation 
 mudela(fragment,verbatim,center)( 
-\context Voice { \times 2/3 {c'4 d' e'}} 
-)
-
-A shorthand for code(\times) is to write code(*)var(fraction) after a
-duration.  This shorthand will not label triplets correctly, but
-it is convenient for long rests.  
-For long rests with durations equal to an integer number of whole notes,
-LilyPond produces output that indicates the duration of the rest.  If you use
-code(r) then one rest symbol will be printed and several measures left blank.
-If you use code(R) then all of the measure will be filled with whole rests.
-mudela(fragment,verbatim,center)(
-r1 r1*3 R1*3
-)
-If you set the code(Score.skipBars) property, then only one measure will be
-printed; with code(R), a number indicating the length of the rest will be
-displayed.  
-mudela(fragment,verbatim,center)(
-\property Score.skipBars=1
-r1 r1*3 R1*3
-)
-Even though the code(\times) command is not explicit, it is still
-necessary to specify a code(Voice) context if the music begins with
-rests lengthened using code(*).  
-Otherwise, the following will result:
-mudela(fragment,verbatim,center)(
-R1*3 c'1 d'
+\context Voice { \times 2/3 {c'4 d' e'}
+        % [..]
+}
 )
 
 
@@ -520,8 +513,7 @@ Ties are indicated using the tilde symbol
 code(~) by analogy with TeX()'s tie which connects words.  
 Note that if you try to tie together chords which have no common
 pitches, then a warning message will appear and no tie will be created.
-(Note that ties between different pitches can be enabled using the
-property Voice.oldTieBehavior.)
+
 
 mudela(fragment,verbatim,center)(
 e' ~ e' <c' e' g'> ~ <c' e' g'>
@@ -582,9 +574,11 @@ TeX() above or below notes by using a string instead of an identifier:
 All of these note ornaments appear in the printed output but have no
 effect on the MIDI rendering of the music.
 
-To save typing,  a few common symbols  can  be  abbreviated  with
-single characters:
-mudela()(
+To save typing, fingering instructions (digits 0 to 9 are supported)
+and a few common symbols can be abbreviated with single characters:
+COMMENT(
+
+)mudela()(
 \score{ \notes {
         \property Voice.textStyle = typewriter
         c''4-._"c-." s4
@@ -592,8 +586,14 @@ mudela()(
         c''4-+_"c-+" s4
         c''4-|_"c-|" s4
         c''4->_"c->"  s4
-        c''4-^_"c-\\^{ }"  s4 }
-        \paper { linewidth = 12.\cm; }})
+        c''4-^_"c-\\^{ }"  s4
+       c''4-1
+       c''4-2  
+       c''4-3
+       c''4-4  
+       }
+%        \paper { linewidth = 12.\cm; }
+})
 
 Dynamic marks are specified by using an identifier after a note without a dash:
 code(c4 \ff).  Note that this syntax is inconsistent with the syntax for other
@@ -618,36 +618,17 @@ c'' \< \! c''   d'' \decr e'' \rced
 < f''1 {s4 \< \! s4 \> \! s2 } >)
 )
 
-
-COMMENT(Broken!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
-
 Tremolo marks can be printed by a note by adding code(:)[var(length)]
 after the note.  The length must be at least 8.  A var(length) value
 of 8 gives one line across the note stem.  
 If the length is omitted,
 then the last value is used, or the value of the code(Abbrev)
-property if there was no last value.  To place tremolo marks in
-between two notes, begin with code([:)var(length) and end with code(]).
-The tremolo marks will appear instead of beams.  Putting more than two
-notes in such a construction will produce odd effects. 
-
-[TREMOLO BEAMS TEMPORARILY OUT OF ORDER]
-
-COMMENT(mudela (fragment,verbatim,center)(
-c'2:8 c':32 [:16 e'1 g'] [:8 e'4 f']
-))
+property if there was no last value.  
 
-COMMENT(
-Is the last paragraph correct?  Is it called "tremolo"?  Why is
-"abbreviation" used?  (What is the unabreviated form?)
-
-COMMENT(
-mudela (fragment,verbatim,center)(
-c'4:32 [:16 c'8 d'8]
+mudela(fragment,verbatim,center)(
+c'2:8 c':32 c'
 ))
 
-)
-
 
 sect(Other Ways to Enter Pitches)
 
@@ -687,24 +668,25 @@ mudela(fragment,verbatim,center)(
                 b c,, d b }
 )
 
-When the preceeding item is a chord, the first note of the chord is used to
+When the preceding item is a chord, the first note of the chord is used to
 determine the first note of the next chord.  But other notes within the second
-chord are determined by looking at the immediately preceeding note.  
+chord are determined by looking at the immediately preceding note.  
 
 mudela(fragment,verbatim,center)(
 \relative c' { c <c e g> 
     <c' e g> <c, e' g> }
 ) 
 
-The code(\relative) keyword can only appear in music, so there must be a
-surrounding code(\notes) keyword which does not appear in the fragments shown
-above.  Also note that if the music passed to a code(\relative) keyword 
-contains a code(\transpose) keyword, the tranposed music will not be
-processed in relative mode.  An additional code(\relative) must be placed
-inside the code(\transpose).  If code(\relative) will be used several
-times, or if it will be used in the same music with code(\transpose),
-then you may get bizarre effects.  This can be fixed by using an
-explicit code(Staff) context.   
+The pitch after the code(\relative) is a notename. To parse the pitch
+as a notename, you have to be in note mode, so there must be a
+surrounding code(\notes) keyword (which is not shown here).  Also
+note that if the music passed to a code(\relative) keyword contains a
+code(\transpose) keyword, the tranposed music will not be processed in
+relative mode.  An additional code(\relative) must be placed inside
+the code(\transpose).  If code(\relative) will be used several times,
+or if it will be used in the same music with code(\transpose), then
+you may get bizarre effects.  This can be fixed by using an explicit
+code(Staff) context.
 
 
 subsect(Tranposition of Pitches)
@@ -742,7 +724,7 @@ sect(Chords)
 
 Chords can be entered either by name or by listing the notes in angle brackets.
 Chords can be displayed either as notes or by name.  To enter chords by name,
-either place them inside the code(\chords) keyword.
+place them inside the code(\chords) keyword.
 Chord names have the form
 var(tonic)[var(duration)][code(-)var(modifier)][code(^)var(subtractions)][code(/)var(inversion)]
 The var(tonic) should be the tonic note of the chord, and the var(duration) is
@@ -753,7 +735,7 @@ code(-) to indicate raising or lowering by half a step.  A chord additions has
 two effects:  it adds the specified interval and all lower odd numbered
 intervals to the chord, and it may lower or raise the specified interval.
 Intervals must be separated by a dot (code(.)).
-Repeating a code(-) character will remove a half step from the preceeding
+Repeating a code(-) character will remove a half step from the preceding
 interval.  
 mudela(fragment,verbatim,center)(
 \transpose c''{ 
@@ -843,17 +825,11 @@ mudela(verbatim)(\score{
   <  \notes \transpose c'' {c d e c | c d e c | e f g'2 | 
                               e'4 f g'2 \bar "|."; }
      \context Lyrics \lyrics { 
-              DOEXPAND(Fr\)`e-4 re Ja- que DOEXPAND(Fr\)`e- re Ja- que
+              Fre-4 re Ja- que Frere- re Ja- que
               Dor- mez vous?2 Dor-4 mez vous?2  }
   >
 })
 
-COMMENT(
-URG
-                        Fr\`e-4 re Ja- que
-                        Fr\`e- re Ja- que
-Why does this warrant an URG?
-)
 
 When one word is attached to many notes, you may 
 want a  continuous line after the lyric to show  this.   To achieve
@@ -870,21 +846,45 @@ mudela(verbatim)(\score{
      foo1 __  bar2. __ _4 baz1 __ }
 > })
      
-If you want to have hyphens centred between syllables (rather than attached
+If you want to have hyphens centered between syllables (rather than attached
 to the end of the first syllable) you can use the special code(--) lyric as
 separate word between syllables. This will result in a hyphen whose length
-varies depending on the space between syllables, and centred between the
+varies depending on the space between syllables, and centered between the
 syllables. For example: 
 mudela(verbatim)(\score{
   <  \notes \transpose c'' {c d e c | c d e c | e f g'2 | 
                               e'4 f g'2 \bar "|."; }
      \context Lyrics \lyrics { 
-              DOEXPAND(Fr\)`e4 -- re Ja -- que DOEXPAND(Fr\)`e -- re Ja -- que
+              Fre4 -- re Ja -- que Fre -- re Ja -- que
               Dor -- mez vous?2 Dor4 -- mez vous?2  }
   >
 })
-
+COMMENT(should use dutch lyrics.  No accent hassles.)
  
+sect(Automatic lyric durations)
+
+Often, lyrics are accompanied by a melody, and the rhythm of the
+melody is the same as the rhythm of the text.  In this case, you can
+overlay the durations of the notes on the text, using code(\addlyrics)
+COMMENT(
+
+)mudela(verbatim,fragment)(
+       \addlyrics
+               \transpose c'' { c4 d8. e16 f2 }
+               \context Lyrics \lyrics { do4 re mi fa }
+)
+
+You should use a single rhythm melody, and single rhythm lyrics (a
+constant duration is the obvious choice).  If you do not, you will get
+undesired effects when using multiple stanzas: COMMENT(
+
+)mudela(verbatim,fragment)(
+       \addlyrics
+               \transpose c'' { c4 d8. e16 f2 }
+               \context Lyrics \lyrics < { do4 re mi fa }
+                                         { do8 re mi fa } >
+)
+
 
 
 sect(Time)  
@@ -910,7 +910,8 @@ starting measure lasting two eighth notes.
 In order to help with error checking, you can insert bar markers in
 your music by typing code(|).  Whenever LilyPond encounters a code(|)
 that doesn't fall at a measure boundary, she prints a warning message.
-
+The beginning of the measure will also be relocated, so you can also
+use this to shorten measures. 
 
 COMMENT(
 sect(Composition: forming bigger structures)
@@ -981,35 +982,53 @@ END OF COMMENT  )
 
 sect(Repeats)
 
-In order to specify repeats, use the code(\repeat) keyword.  By
-default, repeats are printed with repeat symbols.  
+In order to specify repeats, use the code(\repeat) keyword.  Since
+repeats look differently when played and when printed, there are a few
+different variants of repeats.
+
+description(
+dit(unfolded) repeated music is fully written (played) out.  Useful
+for  MIDI output.
+dit(semi)  "semifolded". This is the normal notation: repeats are not
+written out, but alternative endings (voltas), are printed, one after
+the other.
+dit(folded) alternative endings are written stacked, which is useful
+for lyrics.
+)  
+
+The syntax for repeats is code(\repeat )var(variant)var(
+repeatcount)\var(repeatbody).  If you have alternative endings, you
+may add code(\alternative {)var(alternative1) var(alternative2)
+var(alternative3) .. code(}), where each var(alternative) is of type Music.
+
+Notation semifolded repeats are used like this:
 mudela(fragment,verbatim,center)(
 c'1
 \repeat semi 2 { c'4 d' e' f' }
 \repeat semi 2 { f' e' d' c' })
-In order to specify alternate endings, use the code(\alternative)
-keyword.  
+
+With alternative endings:
 mudela(fragment,verbatim,center)(
 c'1
 \repeat semi 2 {c'4 d' e' f'} 
 \alternative { {d'2 d'} {f' f} })
-The code(semi) specifies that normal repeats will be printed.  If
-code(fold) is used instead then the alternatives will be stacked:
+
+Folded repeats look like this:footnote(Folded repeats offer little
+more over simultaneous music.  However, it is to be expected that more
+functionality --especially for the MIDI backend-- will be implemented) 
+
+
 mudela(fragment,verbatim,center)(
 c'1
 \repeat fold 2 {c'4 d' e' f'} 
 \alternative { {d'2 d'} {f' f} })
-When the repeats involve partial measures, it will be necessary to use
-code(\partial) keywords in a somewhat unexpected way 
-to indicate some measure lengths.
+
 mudela(fragment,verbatim)(
 \context Staff { \relative c'{
-  \repeat semi 2 { \partial 4; e | c2 d2 | e2 f2 | }
-  \alternative { { g4 g g } {\partial 1; a a a a | b1 } }
+  \partial 4; \repeat semi 2 {  e | c2 d2 | e2 f2 | }
+  \alternative { { g4 g g } {  \partial 4; a a a a  b1 } }
 }})
-Repeats can be unfolded by setting the property Staff.unfoldRepeats.
-Note also that if your music begins with code(\repeat), you must place
-it in an explicit code(Staff) context or you will get bizarre results. 
+Repeats can be unfolded by setting the property code(Staff.unfoldRepeats).
 
 If you don't give enough alternatives for all of the repeats, then the
 first alternative is assumed to be repeated enough to equal to
@@ -1021,6 +1040,10 @@ mudela(fragment,verbatim)(
                  {\partial 1; a a a a | b1 } }
 }})
 
+note: The syntax of repeats is not entirely crystallised. You can expect
+more variants,  better MIDI integration, better time handling.
+
+
 
 
 sect(Ambiguities)
@@ -1077,15 +1100,6 @@ get the message ``parse error'' from LilyPond.
 
 description(
 
-dit(code(\absdynamic) code({) var(code) code(})) Internal keyword for
-printing dynamic marks such as $f$ under music.  The parameter
-var(code) is unsigned and specifies the dynamic mark to print.
-Normally you should use the more user friendly abbreviations defined
-in the init file file(dynamic.ly).
-
-FIXME: Changed to code(\textscript) var(text) var(style).  Defines
-a text-request.
-
 dit(code(\accepts) var(string)code(;)) This keyword can appear only within a
 code(\translator) block.  It specifies what contexts are allowed with the
 context that is being defined.  See Section ref(translators).  
@@ -1093,7 +1107,8 @@ context that is being defined.  See Section ref(translators).
 dit(code(\alternative) code({) var(music1) var(music2) ... code(}))
 Specifies alternative endings.  Must come after a code(\repeat) keyword.  
 
-dit(code(\bar) var(bartype)code(;)) Prints a special bar symbol, or at
+dit(code(\bar) var(bartype)code(;)) Music expression that requests
+LilyPond to prints a special bar symbol, or at
 measure boundaries, replaces the regular bar symbol with a special
 symbol.  The argument var(bartype) is a string which specifies the
 kind of bar to print.  Options are code(":|"), code("|:"),
@@ -1104,13 +1119,16 @@ If var(bartype) is set to code("empty") then nothing is printed, but a
 line break is allowed at that spot.  Note that the printing of special bars
 has no effect on the MIDI output.
 
-dit(code(\cadenza) var(togglevalue)code(;)) Toggles the automatic generation
-of bar lines.  If var(togglevalue) is 0 then bar line generation is
-turned off.   If var(togglevalue) is  1  then a bar is  immediately
-printed and bar generation is turned on.
+Note that you are encouraged to use code(\repeat) for repetitions
+
+
+dit(code(\cadenza) var(togglevalue)code(;)) Music expression that
+toggles the automatic generation of bar lines.  If var(togglevalue) is
+0 then bar line generation is turned off.  If var(togglevalue) is 1
+then a bar is immediately printed and bar generation is turned on.
 
-dit(code(\clef) var(clefname)code(;)) Allowed only in music.  
-Sets the current clef.  The argument is
+dit(code(\clef) var(clefname)code(;)) Music expression that
+sets the current clef.  The argument is
 a string which specifies the name of the clef.  Several clef names are
 supported.  If code(_8) or code(^8) is added to the end of a clef
 name then the clef lowered or raised an octave will be generated.  
@@ -1143,28 +1161,31 @@ mudela(center)(
 The treble  clef  can also  be obtained using  the  names code(G) or
 code(violin).  The bass clef is also available by code(\clef  F). 
 
-dit(code(\chord) var(chordlist)) Parse var(chordlist) in chords mode.
+dit(code(\chord) var(musicexpr)) Music expression that switches to
+chord mode for parsing var(chordmusic).
 
 dit(code(\chordmodifiers) var(modifierlist)) Specify the text chord
 modifiers that may appear after chord names.  These are specified in
 the file file(chord-modifiers.ly).  
 
-dit(code(\cm)) Specify a dimension in centimeters. 
+dit(code(\cm)) Specify a dimension in centimeters.  Should come after
+a floating point constant.
 
 dit(code(\consists) var(string)code(;)) This keyword can appear only within a
 code(\translator) block.  It specifies that an engraver or performer named
 var(string) should be added to the translator.  See Section
 ref(translators).
 
-dit(code(\consistsend) var(string)code(;)) Unknown function.  
+dit(code(\consistsend) var(string)code(;)) This keyword can appear
+only within a code(\translator) block. Add an engraver to the context
+being specified.  Some engraver types need to be at the end of the
+list; this insures they are put there.  Usually not needed for end-users.
 
 dit(code(\context) var(contexttype) [code(=) var(contextname)]
-var(music) or code(\context) var(translatortype)code(;)) The first
-variant is used only within music to create an instance of a
-context.  The new context can optionally be given a name.  The
-specified var(music) is processed in the new context. The second
-variant appears within a code(\translator) block and specifies the
-type of translator being created.
+var(musicexpr)) Interpret var(musicexpr) within a context of type
+var(contexttype).  If the context does not exist, it will be created.
+context.  The new context can optionally be given a name.
+This is a Music expression itself.
 
 dit(code(\duration) code({) var(length) var(dotcount) code(})) Specify note
 duration.  The parameter var(length) is the negative logarithm (base
@@ -1175,6 +1196,8 @@ var(dotcount).
 dit(code(\font) var(string)) Internal keyword.  Used within
 code(\paper) to specify the font.
 
+dit(code(\grace) var(musicexpr)) A musicexpression that indicates that
+var(musicexpr) consists of grace notes.
 
 dit(code(\header) code({) var(key1) = var(val1); var(key2) = var(val2); ... code(}))
 Specifies information about the music.  A header should appear at the
@@ -1207,21 +1230,23 @@ dit(code(\keysignature) var(pitchseq)code(;))
 Specify an arbitrary key signature.  The pitches from var(pitch) will
 be printed in the key signature in the order that they appear on the list.
 
-dit(code(\lyrics) var(lyriclist)) Parse var(lyriclist) in lyrics mode.
+dit(code(\lyrics) var(music)) Parse var(music) in lyrics mode.
 
 dit(code(\maininput)) Internal command.  This command is used for creating init
 files like file(init.fly) that read the user file into the middle of another
 file.  It is illegal to use this command in a user file.  
         
-dit(code(\mark) var(unsigned)code(;) or code(\mark) var(string)code(;)) 
-Allowed in music only.  Prints a mark over or under (depending on the
-code(markDirection) property) the staff.
-You must add code(Mark_engraver) to the Score context.
+dit(code(\mark) var(unsigned)code(;) or code(\mark)
+var(string)code(;)) A music expression.  Prints a mark over or under
+(depending on the code(markDirection) property) the staff.  You must
+add code(Mark_engraver) to the either Score or Staff context for this
+to work.
 
-dit(code(\midi) var(statementlist)) Appears in a score block to
-indicate that musical output should be produced and to set output
-parameters.  Can also appear at the top level to set default output
-parameters.  See code(\tempo).
+
+dit(code(\midi) var(statementlist)) An output definition (appears in a
+ code(\score) block) to indicate that musical output should be
+ produced and to set output parameters.  Can also appear at the top
+ level to set default output parameters.  See code(\tempo).
 
 dit(code(\mm)) Specify a dimension in millimeters. 
 
@@ -1242,20 +1267,18 @@ The argument is a list of definitions of  the form
 var(name) = var(pitch),  where var(pitch) is specified with the
 code(\musicalpitch) keyword.  
 
-dit(code(\notes) var(music)) Enter note mode and process the
-specified music
+dit(code(\notes) var(musicexp)) Enter note mode and process the
+specified musicexp.  This is a music expression.
 
-dit(code(\paper) var(statmentlist)) 
-Appears in a score block to indicate that the music should be printed
-or to set output parameters.  Can also appear at the top level to set
-default output parameters for all of the score blocks.  
-The var(statmentlist) contains statements that change features of the
-output.  See Section ref(paper).  
+dit(code(\paper) var(statmentlist)) An output definition, (appears in
+a code(\score) block) to indicate that the music should be printed or
+to set output parameters.  Can also appear at the top level to set
+default output parameters for all of the score blocks.  The
+var(statmentlist) contains statements that change features of the
+output.  See Section ref(paper).
 
-dit(code(\partial) var(duration)code(;)) Specify that the first measure of
-the music lasts only for the specified duration.  Use also to specify
-the duration of the first measure of the argument to
-code(\alternative).  
+dit(code(\partial) var(duration)code(;)) Music expression that makes
+the first measure of the music last for the specified duration.  
 
 dit(code(\penalty) var(int)code(;)) Allowed only in music.
 Discourage or encourage line breaks.  See identifiers code(\break) and
@@ -1269,34 +1292,31 @@ on both sides of the dot.
 
 dit(code(\pt)) Specify a dimension in points. 
 
-dit(code(\relative) var(pitch) var(music)) Processes the specified
-var(music) in relative pitch
-mode.  In this mode, the octave of a pitch is chosen so that the
-pitch is closest to the preceeding pitch.  
-The argument var(pitch) is
-the starting pitch for this comparision.  In the case of chords, the
-first note of a chord is used as the base for the first pitches in the next
-chord.  See Section ref(relative).
+dit(code(\relative) var(pitch) var(music)) Add octave indications such
+that so that the pitch is closest to the preceding pitch.  The
+argument var(pitch) is the starting pitch for this comparison.  In the
+case of chords, the first note of a chord is used as the base for the
+first pitches in the next chord.  See Section ref(relative).
 
 dit(code(\remove) var(string)code(;)) Can appear only in a
 code(\translator) block.  Specifies that a performer or engraver named
 var(string) should be removed.  See Section ref(translators).  
 
 dit(code(\repeat) var(style) var(count) code({) var(music) code(}))
-Repeats the specified
-music var(count) times.  Alternative endings can be specified by adding a
-code(\alternative) keyword after the code(\repeat).  The var(style)
-parameter should be either code(semi), for regular repeats,  or
-code(fold) for repeats displayed vertically. 
+Repeats the specified music var(count) times.  Alternative endings can
+be specified by adding a code(\alternative) keyword after the
+code(\repeat).  The var(style) parameter should be either code(semi),
+for regular repeats, or code(fold) for repeats displayed vertically,
+or code(unfold) for repeats fully written out.
 
-dit(code(\scm) var(scheme)code(;)) Embeds specified Scheme code.  
+dit(code(\scm) var(scheme)code(;)) Evaluates the specified Scheme
+code.  The result is discarded.
 
-dit(code(\scmfile) var(filename)code(;)) Reads Scheme code from the specified
-file.  
+dit(code(\scmfile) var(filename)code(;)) Reads Scheme code from the
+specified file.  The result is discarded.
 
-dit(code(\score) var(statementlist)) Create a Score context.  This
-is the top level notation context.  
-COMMENT(this still needs work)
+dit(code(\score) var(statementlist))  Combine one music expression and
+multiple output definitions
 
 dit(code(\script) var(alias)) Prints a symbol above or below a note.
 The argument is a string which points into the script-alias table
@@ -1307,7 +1327,7 @@ symbols over one note.  Usually the code(\script) keyword is not used
 directly.  Various helpful identifier definitions appear in
 file(script.ly).
 
-dit(code(\shape) code(=) var(indent1) var(width1) var(indent2)
+dit(code(\shape) var(indent1)code(,) var(width1)code(,) var(indent2)code(,)
 var(width2) ... code(;)) Allowed only within code(\paper).  Each pair
 of var(indent) and var(width) values is a dimension specifying how far
 to indent and how wide to make the line.  The indentation and width of
@@ -1315,84 +1335,174 @@ successive lines are specified by the successive pairs of dimensions.
 The last pair of dimensions will define the characeristics of all
 lines beyond those explicitly specified.
 
-COMMENT(First pair of dimensions seems to be skipped.  At least it is
-in the example file denneboom.ly.)
-
-dit(code(\skip) var(duration)code(;)) Skips the amount of time specified by
-var(duration).  A gap will be left for the skipped time with no notes
-printed.  It works in Note Mode or Lyrics Mode (but generates a
-mysterious error in lyrics).
+dit(code(\skip) var(duration)code(;)) Skips the amount of time
+specified by var(duration).  If no other music is played, a gap will
+be left for the skipped time with no notes printed.  It works in Note
+Mode or Lyrics Mode.
 
 dit(code(\spanrequest) var(startstop) var(type)).  Define a spanning request
 var(startstop) is either -1 (code(\start)) or 1 (code(\stop)). The var(type)
 parameter is a string that describes what should be started.  Supported types
 are "crescendo", "decrescendo", "beam", "slur".  This is an internal command.
 Users should use the abbreviations  which are defined in the
-initialization file file(dynamic.ly).
+initialization file file(spanners.ly).
 
 dit(code(\tempo) var(duration) = var(perminute)code(;)) Used within
 code(\midi) or within music to specify the tempo.  For example, 
 `code(\midi { \tempo 4 = 76;})' requests output with 76 quarter notes
-per minute.  Note that if the music contains several tempo commands,
-only the last one is used to set the tempo for the entire MIDI output. 
-COMMENT(Is this true?)
+per minute.
 
-dit(code(\textscript) var(text) var(style)) Print the specified text as a
-script in the specified style.  
+dit(code(\textscript)) var(text) var(style).  Defines a text to be
+printed over or under a note.  var(style) may be one offinger, roman,
+italic, dynamic, large.  Normally you should use the stable and more
+user friendly abbreviations defined in the init file file(textscript.ly).
 
 dit(code(\time) var(numerator)code(/)var(denominator)code(;)) Change the time
 signature.  The default time signature is 4/4.  
 
 dit(code(\times) var(numerator)code(/)var(denominator) var(music))
-Multiply the duration of var(music) by the specified fraction.
-
-dit(code(\translator) var(statements) or code(\translator)
-var(context) = var(name)) The first variant appears only within
-code(\paper) and specifies a translator for
-converting music to notation.  The translator is specified with a
-single code(\context) statement and a series of code(\accepts), and
-code(\consists) statements.  See Section ref(translators). 
-The second variant appears in 
-music.  It specifies that the current the contexts
-contained within the specified context should be shifted to the
-context with the specified name.  
-
-COMMENT( \translator seems like a strange name for the second
-operation, and is the overloading desireable? )
-
-dit(code(\transpose) var(pitch) var(music)) Transposes the specified
-music.  Middle C is tranposed to var(pitch).  This is allowed in music only,
-and if it appears inside code(\relative), then any notes specified for
-transposition should be specified inside another code(\relative).  See Section
-ref(transpose).  
+Music expression that results from multiplying the duration of
+var(music) by the specified fraction.  In the output a brace is
+printed over the music.
+
+dit(code(\translator) var(statements))
+ This keyword is overloaded, it means something different within
+music expressions.
+
+This variant appears only within code(\paper) and specifies a
+translator for converting music to notation.  The translator is
+specified with a single code(\context) statement and a series of
+code(\accepts), and code(\consists) statements.  See Section
+ref(translators).
+
+dit(code(\translator) var(contexttype) = var(name))
+A music expression that the context which is a direct child of the 
+a  context of type var(contexttype) should be shifted to a context of
+type var(contexttype) and  the specified name.  
+
+dit(code(\transpose) var(pitch) var(musicexpr))
+Music expression
+obtained by transposing var(musicexpr).  Middle C is tranposed to
+var(pitch).   If it appears inside
+code(\relative), then any notes specified for transposition should be
+specified inside another code(\relative).  See Section ref(transpose).
 
 dit(code(\type) var(string)code(;)) Use inside code(\translator) to
 specify the type of the translator.  
 
-dit(code(\version) var(string)) Specify the version of Mudela that a
-file was written for.  The argument is the version number, for example
-code("1.0.1").  Note that the Mudela version is different from the
-LilyPond version.
+dit(code(\version) var(string)) Specify the version of LilyPond that a
+file was written for.  The argument is the version number, for qexample
+code("1.0.1").  This is used to detect invalid input, and to aid
+code(convert-mudela), a tool that automatically upgrades input files.
 
 )  
 
 
 sect(Notation Contexts)
 
-Notation contexts provide information that appears in printed music
-but not in the music itself.  A new musical context is created using
-the code(\context) keyword: `code(\context) var(contexttype) [code(=)
-var(contextname)] var(music)'.  The following context types are
-allowed.
+Notation contexts are objects that only exist during a run of
+LilyPond.  During the interpretation phase of LilyPond, the Music
+expression contained in a code(\score) block is interpreted in time
+order.  This is the order in which humans read, play and write music.
 
+A  context is an object that holds the reading state of the expression:
+it contains information like
+itemize(
+it() What notes are playing at this point?
+it() What symbols will be printed at this point?
+it() In what style will they printed?
+it() What is the current key signature, time signature, point within
+the measure, etc.
+)
+
+Contexts are grouped hierarchically: a Voice context is contained in a
+Staff context (because a staff can contain multiple voices at any
+point), a Staff context is contained in a Score, StaffGroup,
+ChoirStaff context (because these can all contain multiple Staffs.)
+
+The Contexts associated with sheet music output are called notation
+contexts, those with associated with sound output are called playing
+contexts.
+
+Context are created either automatically, or manually.
+Initially, the top level music expression is reported to the top level
+context (the Score context). 
+When a atomic music expression (a note, a rest, a code(\bar),
+code(\time) command), a nested set of context is created that can process these
+atomic expressions, so in this example,COMMENT(
+
+)verb(\score { \notes < c4 > })COMMENT(
+
+)the sequential music, code({ c4 }) is interpreted by Score context.
+When the note code(c4) itself is interpreted, a set of contexts is needed
+that will accept notes. The default for this is a Voice context,
+contained in a Staff context.
+
+
+
+You can also create contexts manually, and you probably have to do so
+if you want to typeset complicated multiple voice/multiple staff
+material.  If a code(\context )var(name musicexpr) expression is
+encountered during the interpretation phase, the var(musicexpr)
+argument will be interpreted with a context of type var(name).  If you
+specify a name, the specific context with that name is searched.
+
+If a context of the specified type and name can not be found, a new
+one is created.  For example,
+COMMENT(
+
+)verb(\score { \notes \relative c'' { c4 <d4 \context Staff = "another" e4> f} })COMMENT(
+
+) in this example, the code(c) and code(d) are
+printed on the default staff.  For the code(e), a context Staff called
+code(another) is specified; since that does not exist, a new context is
+created.  Within code(another) a (default) Voice context is created
+for the code(e4).   When all music referring to a context is finished, the
+context is ended as well.  So after the third quarter, the
+code(another) is removed.
+
+Almost all music expressions inherit their interpretation context from
+their parent. In other words, suppose that  the syntax for a music expression is
+code(code(\keyword) var(musicexpr1) var(musicexpr2) dots()).
+When the interpretation of this music expression starts, 
+the context for var(musicexpr1), var(musicexpr2), etc. that of
+the total expression.
+
+Lastly, you may wonder, why doesn't this:
+verb(\score { \notes \relative c'' { c4 d4 e4 }})
+result in this?
+mudela()(\score { \notes \relative c'' { <c4> <d4> <e4> }})
+
+For code(c4) a default Staff (with contained Voice) context is
+created.  After the code(c4), ends no music refers to this default
+staff, so it would be ended, with the result shown.  To prevent this
+inconvenient behavior, the context to which the sequential music
+refers is adjusted during the interpretation.  So after the code(c4)
+ends, the context of the sequential music is also the default Voice
+context.  The code(d4) gets interpreted in the same context as code(c4)
+
+These are the contexts that come presupplied with LilyPond.
 description(
 
+dit(code(Grace)) The context for handling grace notes, it is
+  instantiated automatically when you use code(\grace).  It is a
+  "embedded" miniature of the Score context.  Since this context needs
+  special interaction with the rest of LilyPond, you should not
+  explicitly instantiate it.
+
 dit(code(LyricVoice)) Corresponds to a voice with lyrics.  Handles the printing
 of a single line of lyrics.  
 
-dit(code(Voice)) Corresponds to a voice on a staff.
-  This context handles the conversion of noteheads,
-  dynamic signs, stems, beams, super- and subscripts, slurs, ties and rests.
+dit(code(Thread)) Handles note heads, and is contained in the Voice
+  context.  You have to instantiate these explicitly if you want to
+  adjust the style of individual noteheads.
+
+dit(code(Voice)) Corresponds to a voice on a staff.  This context
+  handles the conversion of dynamic signs, stems, beams, super- and
+  subscripts, slurs, ties and rests.
+
+  You have to instantiate these explicitly if you want to have
+  multiple voices on the same staff.
 
 dit(code(ChordNamesVoice)) A voice with chord names.  Handles printing
 of a line of chord names.  
@@ -1426,8 +1536,7 @@ It can contain code(Staff), code(RhythmicStaff), code(GrandStaff) or code(Lyrics
 dit(code(ChoirStaff)) Identical to code(StaffGroup) except that the
 contained staffs are not connected vertically.  
 
-dit(code(Score)) This is the top level notation context.  It is specified with
-the code(\score) keyword rather than the code(\context) command.  No
+dit(code(Score)) This is the top level notation context.    No
 other context can contain a code(Score) context.  This context handles
 the administration of time signatures.  It also makes sure that items
 such as clefs, time signatures, and key-signatures are aligned across
@@ -1435,27 +1544,46 @@ staffs.  It can contain code(Lyrics), code(Staff),
 code(RhythmicStaff), code(GrandStaff), code(StaffGroup), and
 code(ChoirStaff) contexts.
 
+You can not explicitly instantiate a Score context (since it is not
+contained in any other context.).  It is instantiated automatically
+when an output definition (a code(\score) or code(\paper) block) is
+processed.
 )
 
 The various contexts have properties associated with them.  These
 properties can be changed using the code(\property) command:
 `code(\property) var(context)code(.)var(propname) code(=) var(value)'.
-Properties can also be set within the code(\translator) block
-corresponding to the appropriate context.  In this case, they are
-assigned by `var(propname) code(=) var(value)'.  The settings made with
-code(\property) are processed after settings made in the code(\translator)
-block, so the code(\property) settings will override code(\translator)
-settings.  
-
-The code(\property) keyword will create any property you specify.
-There is no guarantee that a property will actually be used.  If you
-spell a property name wrong, there will be no error message.  In order to find
-out what properties are used, you must search the source code 
-for code(get_property).  
+
+
 Properties that are set in one context are inherited by all of the
 contained contexts.  This means that a property valid for the Voice
 context can be set in the Score context (for example) and thus take
-effect in all Voice contexts.  
+effect in all Voice contexts.
+
+Properties can be preset within the code(\translator) block
+corresponding to the appropriate context.  In this case, the syntax is
+`var(propname) code(=) var(value)'.  This assignment happens before
+interpretation starts, so a code(\property) expression will override
+any pre defined settings.
+
+The code(\property) expression will create any property you specify.
+There is no guarantee that a property will be used.  So if you spell a
+property name wrong, there will be no error message.
+
+The property settings are used during the interpretation phase. They
+are read by the LilyPond modules where interpretation contexts are
+built of.  These modules are called em(translators). Translators for
+notation are called em(engravers) and translators for sound are called
+em(performers).
+
+The precise result of a property is determined by the implementation
+of the translator that reads them.  Therefore, the result of a
+property can vary, since it is implementation and configuration
+dependent.
+
+In order to fully find out what properties are used, you must search
+the source code for calls to code(get_property).  The rest of the
+section is devoted to an (incomplete) overview of available properties.
 
 subsubsubsect(Lyrics properties)
 
@@ -1472,29 +1600,9 @@ or be sure to leave a space on both sides of the dot.
 
 )
 
-subsubsubsect(Voice properties)
-
-description(  
-
-dit(code(stemLeftBeamCount)) Specify the number of beams to draw on
-the left side of the next note.  
-
-dit(code(stemRightBeamCount)) Specify the number of beams to draw on
-the right side of the next note.  
-
-dit(code(beamAuto)) If set to 1 then beams are generated
-automatically.  If set to zero then no beams will be automatically
-generated.  The default value is 1.  
-
-dit(code(beamAutoEnd)) Specifies when automatically generated beams
-can end.  See Section ref(autobeam).
-
-dit(code(beamAutoBegin)) Specifies when automatically generated beams
-can start.  See Section ref(autobeam). 
-
-dit(code(textEmptyDimension)) If set to 1 then text placed above or
-below the staff is assumed to have zero width.  
+subsubsubsect(Thread properties)
 
+description(
 dit(code(noteheadStyle)) Selects type of note head.  Choices are
 code(cross), code(diamond), code(harmonic), code(transparent), and
 code("").  They are shown in that order below.  
@@ -1516,13 +1624,51 @@ mudela(center)(
  \paper{ linewidth = -1.;}
 }
 )
+)
+
+
+subsubsubsect(Voice properties)
+
+description(  
+
+dit(code(stemLeftBeamCount)) Specify the number of beams to draw on
+the left side of the next note.   Overrides automatic beaming.  The
+value is only used once, and then it is erased.
+
+dit(code(stemRightBeamCount)) Specify the number of beams to draw on
+the right side of the next note.   Overrides automatic beaming.  The
+value is only used once, and then it is erased.
+
+dit(code(beamAuto)) If set to 1 then beams are generated
+automatically.  If set to zero then no beams will be automatically
+generated.  The default value is 1.  
+
+dit(code(beamAutoEnd)) Specifies when automatically generated beams
+can end.  See Section ref(autobeam).
+
+dit(code(beamAutoBegin)) Specifies when automatically generated beams
+can start.  See Section ref(autobeam). 
+
+dit(code(textEmptyDimension)) If set to 1 then text placed above or
+below the staff is assumed to have zero width.  
+
+dit(code(beamquantisation)) Set to code(\none) for no quantization.
+Set to code(\normal) to quantize position and slope.  Set to
+code(\traditional) to avoid wedges.  These three settings are
+available via code(\beamposfree), code(\beamposnormal), and
+code(\beampostraditional).
 
+dit(code(beamslopedamping)) Set to code(\none) for undamped beams.
+Set to code(\normal) for damped beams.  Set to code(\infinity) for
+beams with zero slope.  The identifiers code(\beamslopeproportional),
+code(\beamslopedamped), and code(\beamslopezero) each set the
+corresponding value.
 
 dit(code(restStyle)) Change the layout of rests shorter than quarter notes. 
 Currently, the standard layout code(restStyle="") and mensural notation
 code(restStyle="mensural") are available.
 
-dit(code("midiInstrument")) Sets the instrument for MIDI output.  This
+dit(code(midiInstrument)) Sets the instrument for MIDI output.  This
 property name must be quoted because of the embedded underscore.  If
 this property is not set then LilyPond will use the code(instrument)
 property.  This must be set to one of the strings on the list of MIDI
@@ -1533,7 +1679,8 @@ dit(code(transposing)) Tranpose the MIDI output.  Set this property to
 the number of half-steps to transpose by.
 
 dit(code(oldTieBehavior)) Set to 1 in order to get old tie behavior
-where ties would connect unequal pitches.  
+where ties would connect unequal pitches.  This property is
+deprecated, and use is not recommended.
 
 dit(code(verticalDirection)) Determines the direction of stems, subscripts,
 beams, slurs, and ties.  Set to code(\down) to force them down,
@@ -1552,7 +1699,7 @@ dit(code(tieVerticalDirection)) Set to code(\free) for free choice of tie
 direction, set to code(\up) to force ties up, set to code(\down) to
 force ties down.  
 
-dit(code(slurdash)) Set to 0 for normal slurs, 1 for dotted slurs, and
+dit(code(slurDash)) Set to 0 for normal slurs, 1 for dotted slurs, and
 a larger value for dashed slurs.  Identifiers code(\slurnormal) and
 code(\slurdotted) are predefined to set the first two settings.
 
@@ -1562,6 +1709,12 @@ typesetting many voices on one staff.  The identifier code(\shift) is
 defined to enable this.  If there are several voices, every voice must
 have a distinct value of this property or no shifting will occur.
 
+dit(code(forceHorizontalShift)) Force horizontal shift for collision
+resolution.  It overrides automatic collision resolution.
+This will only work if the context also has its stem direction and
+horizontalNoteShift property set. The value is the shift amount
+expressed in code(note_width), as set in the paper section.
+
 dit(code(dynamicDir)) Determines location of dynamic marks.  Set to
 code(\up) to print marks above the staff; set to code(\down) to print
 marks below the staff.
@@ -1632,7 +1785,7 @@ dit(code(barSize)) Specify the height of the bar lines if it should be
 different than the staff height.
 
 dit(code(markHangOnClef)) Set to 1 to cause marks to appear by clefs
-instead of by bar lines.
+instead of by bar lines.  Deprecated, use is not recommended.
 
 dit(code(marginDirection)) Set to code(\left) or code(\right) to
 specify location of marginal scripts.  
@@ -1659,7 +1812,7 @@ dit(code(barAtLineStart)) Set to 1 to produce a bar line after the
 clef at the start of each line (but not at the beginning of the
 music).  
 
-dit(code(voltaVisibility)) Set to 0 to suppress the printing
+dit(code(noVoltaBraces)) Set to true to suppress the printing
 of brackets over alternate endings specified by code(\alternative).
 
 dit(code(voltaSpannerDuration)) Set to an integer to control the size
@@ -1668,7 +1821,8 @@ the number of whole notes duration to use for the brackets.  It seems
 to be rounded to the nearest measure.  This can be used to shrink the
 length of brackets in the situation where one alternative is very
 large.  It may have odd effects if the specified duration is longer
-than the music given in an code(\alternative).  
+than the music given in an code(\alternative).   [FIXME: This was
+broken in 1.1.53]
 
 dit(code(barNonAuto)) If set to 1 then bar lines will not be printed
 automatically; they must be explicitly created with code(\bar) keywords.
@@ -1679,14 +1833,14 @@ zero.
 dit(code(defaultClef)) Determines the default clef.  See code(\clef)
 keyword.
 
-dit(code(nuberOfStaffLines)) Sets the number of lines that the staff has.
+dit(code(numberOfStaffLines)) Sets the number of lines that the staff has.
  
 dit(code(barAlways)) If set to 1 a bar line is drawn after each note.
 
 dit(code(defaultBarType)) Sets the default type of bar line.  See
 code(\bar) keyword.
 
-dit(code(keyoctaviation)) If set to 1, then keys are the same in all
+dit(code(keyOctaviation)) If set to 1, then keys are the same in all
 octaves.  If set to 0 then the key signature for different octaves can
 be different and is specified independently: code(\keysignature bes
 fis').  The default value is 1.  Can be set to zero with
@@ -1698,13 +1852,11 @@ is used to label the first line of the staff and the code(instr)
 property is used to label subsequent lines.  If the
 code(midiInstrument) property is not set then code(instrument) is
 used to determine the instrument for MIDI output.
-COMMENT(This prints the instrument name on top of the staff lines.)
 
 dit(code(createKeyOnClefChange)) Set to a nonempty string if you want key
 signatures to be printed when the clef changes.  Set to the empty string (the
 default) if you do not want key signatures printed.
 
-
 dit(code(timeSignatureStyle)) Changes the default two-digit layout
    for time signatures. The following values are recognized:
    description(
@@ -1791,23 +1943,14 @@ notes and rests into their full length, printing the appropriate
 number of empty bars so that synrchonization with other voices is
 preserved.  COMMENT(meaning of "skip" here seems to be different from
 the meaning used for the keyword \skip.)
+)
 
-dit(code(beamquantisation)) Set to code(\none) for no quantization.
-Set to code(\normal) to quantize position and slope.  Set to
-code(\traditional) to avoid wedges.  These three settings are
-available via code(\beamposfree), code(\beamposnormal), and
-code(\beampostraditional).
-
-dit(code(beamslopedamping)) Set to code(\none) for undamped beams.
-Set to code(\normal) for damped beams.  Set to code(\infinity) for
-beams with zero slope.  The identifiers code(\beamslopeproportional),
-code(\beamslopedamped), and code(\beamslopezero) each set the
-corresponding value.
+subsubsubsect(ChordNamesVoice properties)
 
+description(
 dit(code(chordInversion)) Determines whether LilyPond should look for
 chord inversions when translating from notes to chord names.  Set to 1
 to find inversions.  The default is 0 which does not look for inversions.
-
 )
 
 
@@ -1830,13 +1973,13 @@ dit(code(\dorian)) Used as the second argument of the code(\key)
 keyword to get a dorian mode.
 dit(code(\down)) Used for setting direction setting properties.  Is
 equal to -1.  
-dit(code(\f)) Print forte symbol on the preceeding note.
-dit(code(\ff)) Print fortissimo symbol on the preceeding note. 
-dit(code(\fff)) Print fortississimo symbol on preceeding note. 
-dit(code(\ffff)) Print fortissississimo symbol on preceeding note.
-dit(code(\fffff)) Print fffff symbol on preceeding note.
-dit(code(\ffffff)) Print ffffff symbol on preceeding note.
-dit(code(\fp)) Print fortepiano symbol on preceeding note. 
+dit(code(\f)) Print forte symbol on the preceding note.
+dit(code(\ff)) Print fortissimo symbol on the preceding note. 
+dit(code(\fff)) Print fortississimo symbol on preceding note. 
+dit(code(\ffff)) Print fortissississimo symbol on preceding note.
+dit(code(\fffff)) Print fffff symbol on preceding note.
+dit(code(\ffffff)) Print ffffff symbol on preceding note.
+dit(code(\fp)) Print fortepiano symbol on preceding note. 
 dit(code(\free)) Used for setting direction setting properties.  Is
 equal to 0.  
 dit(code(\Gourlay)) Used for setting the paper variable
@@ -1856,8 +1999,8 @@ dit(code(\minor)) Used as the second argument of the code(\key)
 keyword to get a minor key.
 dit(code(\mixolydian)) Used as the second argument of the code(\key)
 keyword to get a mixolydian mode.
-dit(code(\mf)) Print mezzoforte symbol on preceeding note. 
-dit(code(\mp)) Print mezzopiano symbol on preceeding note. 
+dit(code(\mf)) Print mezzoforte symbol on preceding note. 
+dit(code(\mp)) Print mezzopiano symbol on preceding note. 
 dit(code(\nobreak)) Prevent a line break in music by using a large
 negative argument for the keyword code(\penalty). 
 dit(code(\none)) Used for setting Score.beamslopedamping and
@@ -1866,21 +2009,21 @@ dit(code(\normal)) Used for setting Score.beamslopedamping and
 Score.beamquantisation properties.  Is equal to 1.
 dit(code(\normalkey)) Select normal key signatures where each octave
 has the same key signature.  This sets the Staff.keyoctaviation property.
-dit(code(\p)) Print a piano symbol on preceeding note. 
+dit(code(\p)) Print a piano symbol on preceding note. 
 dit(code(\phrygian)) Used as the second argument of the code(\key)
 keyword to get a phrygian mode.
-dit(code(\pp)) Print pianissimo symbol on preceeding note. 
-dit(code(\ppp)) Print pianississimo symbol on preceeding note. 
-dit(code(\pppp)) Print pianissississimo symbol on preceeding note.
-dit(code(\ppppp)) Print ppppp symbol on preceeding note.
-dir(code(\pppppp)) Print pppppp symbol on preceeding note.
+dit(code(\pp)) Print pianissimo symbol on preceding note. 
+dit(code(\ppp)) Print pianississimo symbol on preceding note. 
+dit(code(\pppp)) Print pianissississimo symbol on preceding note.
+dit(code(\ppppp)) Print ppppp symbol on preceding note.
+dir(code(\pppppp)) Print pppppp symbol on preceding note.
 dit(code(\rc)) Terminate a crescendo. 
 dit(code(\rced)) Terminate a decrescendo
-dit(code(\rfz)) Print a rinforzato symbol on preceeding note.
+dit(code(\rfz)) Print a rinforzato symbol on preceding note.
 dit(code(\right)) Used for setting textalignment property.  Is set to 1.
-dit(code(\sf)) Print a subito-forte symbol on preceeding note. 
-dit(code(\sff)) Print a subito-fortissimo symbol on preceeding note.
-dit(code(\sfz)) Print a sforzato symbol on preceeding note. 
+dit(code(\sf)) Print a subito-forte symbol on preceding note. 
+dit(code(\sff)) Print a subito-fortissimo symbol on preceding note.
+dit(code(\sfz)) Print a sforzato symbol on preceding note. 
 dit(code(\shiftoff)) Disable horizontal shifting of note heads that collide.  
 Sets the Voice.horizontalNoteShift property.
 dit(code(\shifton)) Enable note heads that collide with other note heads
@@ -1891,8 +2034,8 @@ dit(code(\slurdown)) Force slurs to be below notes. This sets the
 Voice.slurVerticalDirection property. 
 dit(code(\slurup)) Force slurs to be above notes.  This sets the
 Voice.slurVerticalDirection property.  
-dit(code(\sp)) Print a subito-piano symbol on preceeding note.
-dit(code(\spp)) Print a subito-forte symbol on preceeding note.
+dit(code(\sp)) Print a subito-piano symbol on preceding note.
+dit(code(\spp)) Print a subito-forte symbol on preceding note.
 dit(code(\specialkey)) Allow keys signatures do differ in different
 octaves.  This sets the Staff.keyoctaviation property.  
 dit(code(\stemboth)) Allow stems, beams, and slurs to point either
@@ -1980,9 +2123,31 @@ Warning: this section is outdated and inaccurate.
 There are a large number of paper variables that are used to control
 details of the layout.  Usually you will not want to change these
 variables; they are set by default to vaules that depend on the font
-size in use.  The only way to find out what variables are supported is
-to search the source code for code(get_var).  Two variables that you
-may want to change are code(linewidth) and code(indent).
+size in use.   The values are used by the graphic objects while
+formatting the score; they are therefore implementation dependent.
+Most variables are accompanied by documentation in the
+initalization file file(params.ly) or file(paperSZ.ly), where code(SZ)
+is the staff height in points.
+
+
+Nevertheless, here are some variables  you may want to use or change:
+
+description(
+dit(code(indent)) Sets the indentation of the first line of music.
+
+dit(code(interline)) The distance between two staff lines, calculated
+from the center of the lines.  You should use either this or
+code(rulethickness) as a unit for distances you modify.
+  
+dit(code(linewidth))  Sets the width of the lines.  If it is set to
+-1.0, then a single unjustified line is produced.  
+
+dit(code(output)) Specifies an alternate
+name for the TeX() output.  A file(.tex) extension will be added to
+the string you specify.
+
+dit(code(rulethickness)) Determines thickness of staff lines and bars. 
+)
 
 In order to change the font size used for the output, many variables
 need to be changed.  Some identifiers and initialization files can
@@ -1997,74 +2162,6 @@ code(\paper_sixteen), code(\paper_twenty) or code(\paper_twentysix)
 inside a code(\paper) block.
 
 
-description(
-  dit(var(integer)) If an integer appears on the left side of an
-assignment then a code(\font) keyword must appear on the right
-side.  This defines a music font at a particular size.  See Voice
-property code(fontSize).
-
-dit(code(arithmetic_basicspace) and code(arithmetic_multiplier))
-The space taken by a note is determined by the formula 
-COMMENT(
-
-)verb(arithmetic_multiplier * ( c + log2 (time) ))COMMENT(
-
-) where code(time) is the amount of time a note occupies.  The value
-of code(c) is chosen such that the smallest space within a measure is
-arithmetic_basicspace.  The smallest space is the one following the
-shortest note in the measure.  Typically arithmetic_basicspace is set
-to the width of a quarter note head.
-
-dit(code(beam_dir_algorithm)) Specify algorithm for determining
-whether beams go up or down.  It is real valued.  If set to 2.0 then
-majority selection is used.  If set to 3.0, then mean selection is
-used based on the mean center distance.  If set to 4.0 then median
-selection is used, based on the median center distance.  
-dit(code(castingalgorithm)) 
-dit(code(crescendo_shorten))
-dit(code(forced_stem_shorten)) Stems that have been forced to go the
-unnatural direction are shortened by this amount.  Equal to
-dit(code(forced_stem_shorten0))
-dit(code(gourlay_energybound))
-dit(code(gourlay_maxmeasures)) Maximum number of measures per line
-when using Gourlay method.
-Decreasing this greatly reduces computation time.  Default value: 10.  
-dit(code(indent)) Sets the indentation of the first line of music.  
-dit(code(interbeam))
-dit(code(interbeam4))
-dit(code(interline))  The distance between two staff
-lines, calculated from the center of the lines.  
-dit(code(linewidth))  Sets the width of the lines.  If it is set to
--1.0, then a single unjustified line is produced.  
-dit(code(notewidth)) Width of an average note head.  
-dit(code(output)) Specifies an alternate
-name for the TeX() output.  A file(.tex) extension will be added to
-the string you specify.
-dit(code(rulethickness)) Determines thickness of staff lines and bars. 
-dit(code(slur_clip_angle))
-dit(code(slur_clip_height))
-dit(code(slur_clip_ratio))
-dit(code(slur_height_limit)) Specifies the maximum height of slurs.
-Normally equal to staff_height.
-dit(code(slur_ratio)) Specifes the ratio of slur hight to slur width
-to aim for.  Default value is 0.3.  
-dit(code(slur_rc_factor))
-dit(code(slur_slope_damping)) Allows slurs to start and end at
-different heights ????  Default value is 0.5.
-dit(code(slur_thickness)) Specify slur thickness.  Equal to code(1.4 *
-\staffline) by default.  
-dit(code(slur_x_gap)) Horizontal space between note and slur.  Set to
-code(\interline / 5) by default.  
-dit(code(slur_x_minimum))
-dit(code(staffheight)) The height of the staff from the center of the
-bottom line to the center of the top line.  Equal to to code(4 * \interline).
-dit(code(stem_length)) Specify length of stems for notes in the staff
-that don't have beams.  
-dit(code(stemthickness)) Specifies the thickness of the stem lines.  
-dit(code(tie_slope_damping))
-dit(code(tie_x_minimum))
-)
-
 
 subsect(MIDI Instrument Names)
 label(midilist)
@@ -2156,20 +2253,25 @@ In the code(\paper) block, it is also possible to define translator
 identifiers.  Like other block identifiers, the identifier can only
 be used as the very first item of a translator.  In order to define
 such an identifier outside of code(\score), you must do
-verb(\paper{ foo=\translator{ ... }
+verb(
+\paper{ foo=\translator{ ... } }
 \score{
   \notes{ ... }
   \paper{ \translator{ \foo ... } }
 })
 
-Some All of the standard translators have predefined identifiers,  making
-it easy to redefine these contexts by adding or removing items. 
-The predefined identifiers are:  code(StaffContext),
-code(RhythmicStaffContext),  code(VoiceContext),  code(ScoreContext), code(ScoreWithNumbers)
+Some of the standard translators have predefined identifiers, making
+it easy to redefine these contexts by adding or removing items.  The
+predefined identifiers are: code(StaffContext),
+code(RhythmicStaffContext), code(VoiceContext), code(ScoreContext),
+code(ScoreWithNumbers)
 
 
 subsubsect(Paper Types and Engravers and Pre-defined Translators)
 
+Notation contexts are built from LilyPond modules called Engravers and
+Performers. 
+
 Some pre-defined identifiers can simplify modification of translators.
 The pre-defined identifiers are:  
 description(
@@ -2181,7 +2283,9 @@ dit(code(ScoreWithNumbers)) Score  context with numbering at  the
 Score level.   
 dit(code(BarNumberingStaffContext)) Staff context with numbering  at
 the Staff level.  
-dit(code(HaraKiriStaffContext))  
+dit(code(HaraKiriStaffContext))
+  Staff context that does not print if it only contains rests.  Useful for
+  orchestral scores.footnote(Hara kiri is the ritual suicide of the Samourai)
 dit(code(OrchestralPartStaffContext))
 dit(code(OrchestralScoreContext))
 )
@@ -2197,14 +2301,15 @@ description(
   dit(code(Engraver_group_engraver))
   dit(code(Hara_kiri_line_group_engraver))
   dit(code(Line_group_engraver_group))
-  dit(code(Score_engraver))  
+  dit(code(Score_engraver))
+  dit(code(Grace_group_engraver_group))
 )
 COMMENT( The names of these types seem somewhat confusing. )
 
 The engravers for paper output are:
 
 description(
-dit(code(Abbreviation_beam_engraver))
+dit(code(Abbreviation_beam_engraver)) [FIXME. Broken as of 1.0.?]
 dit(code(Bar_engraver)) Engraves bar lines.  Normally in code(Staff) and
 code(RhythmicStaff).  
 dit(code(Bar_number_engraver)) Engrave bar numbers.  These numbers
@@ -2287,3 +2392,4 @@ dit(code(Lyric_performer))
 dit(code(Swallow_performer))
 )
 
+)
diff --git a/NEWS b/NEWS
index 6c462b6903145f38ec198a132aad6524c7df7cd9..8ac7d5e991346d0193769e7b66a91a87caa9f02d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,11 +1,30 @@
+pl 64.jcn1
+       - resurrected abbreviation beam
+       - coriolan fixes
+
+pl 64.hwn1
+       - reference-manual updates.
+       - slurdash -> slurDash, keyoctaviation -> keyOctaviation
+
+pl 64.uu1
+       - \property forceHorizontalShift
+       - bf: denneboom.ly
+       - warn if translator switching  to self.
+       - warn if brace at end of lyric syllable.
+       - bf: Repeated_music::alternatives_length_mom ()
+       - \property automaticMelismas: if slur then melisma
+       - \property noVoltaBraces
+       - bf: star-spangled-banner
+
 pl 63.lu2
        - very tight: hinterfleisch -> 0 : input/bugs/spacing-very-tight.ly
        - bfs: neutral beam and tie directions (daar was ik al bang voor:-)
        - bf: abe: may beam over skip, as long as note present too
        - bf: scsii-prelude: added slurs using skips
 
+*********
 pl 63.uu1
-       - mutopia updates  courtesy Peter Chubb
+       - mutopia updates courtesy Peter Chubb
        - Don't make Time_scaled_music for c4*2/3 entry, only do the
 time compression.  Should cure spurious Tuplet_brace/spanner warnings.
 
diff --git a/TODO b/TODO
index 1474b91bf6874441c6768834b87038a6aec54ca3..2b0fcdc73095e8aa4d301f1394fe7baa0138da14 100644 (file)
--- a/TODO
+++ b/TODO
@@ -17,14 +17,12 @@ input/star-spangled-banner.ly: hw?
 mutopia/Coriolan/*
 . * spacing of accidentals
 . * key restorations & repeats
-. * spanners from grace to  normal ctxt
 . * rename \paper?
 . * Grace_slur_engraver.
 . * paperXX.ly \quartwidth, font setting not up to date. (Should read from AFM?)
 . * input/star-spangled-banner.ly: fold for lyrics?
 . * Break_req handling is silly (break_forbid () + \break fucks up.)
 . * account for accidentals in spacing.
-. * \shape 1st dim skipped? 
 . * We need feta-din*.mf files for more sizes than 10.
 . * fix dynamics decently, ie. use kerning & ligatures.
 
@@ -36,7 +34,8 @@ mutopia/Coriolan/*
 . * mudela-book.
 . * Key_engraver, Local_key_item
 . * Think of comprehensive solution for "if (grace_b == self_grace_b_)"
-. * Y dimension units: staffspace vs. Point
+. * String[String.length] doesn't trap.
+. * y dimension units: staffspace vs. Point
 . * Beam
 . * Stem
 . * Rhythmic_column and interaction stem/rhythmic_column/note_head/dots.
@@ -56,6 +55,7 @@ mutopia/Coriolan/*
 > >
 
 .* STUFF
+. * auto melismaBusy for beams.
 . *In Caro Mio Ben, bar 8, there's a syllable that starts on a note, and
 ends on a pair of grace notes.  Standard practice is to mark this with
 a slur starting on the main note and ending on the grace note, so a
@@ -71,6 +71,8 @@ one of the spacing bugs mentioned in the TODO.
         grace note.  This is usually wrong, but is sometimes right.
 . * decimal point in \paper {}
 . * tie-direction
+. * repeats and partial measures.
+. * rhythmic staff & accidentals.
 . * use melismaBusy in Lyric context to typeset melismata correctly.  
 . * ly2dvi/lilypond logfile.
 . * hang Item on Spanner
diff --git a/VERSION b/VERSION
index 62eb6c8658f75c6effb804c5055dd616ef9093e6..821fcdaf7394f7eb40ad6c2d167e0de8b619681a 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,8 +1,8 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=1
-PATCH_LEVEL=64
-MY_PATCH_LEVEL=lu1
+PATCH_LEVEL=65
+MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
index 597acece90ec21edce6a068a424dab7367723d17..183e068afcc53e6a4fbf2d5426285021c71fcccd 100644 (file)
@@ -11,8 +11,8 @@ Recommends: python-base (>= 1.5.1), python-misc (>= 1.5.1), tetex-base (>= 0.9.9
 Conflicts: musixtex-fonts, tetex-base (<< 0.9)
 Description: The GNU Project music typesetter.
  LilyPond is a music typesetter.  It produces beautiful sheet music
- using a high level description file as input.  It is part of the GNU
project.
+ using a high level description file as input.  LilyPond is part of 
the GNU Project.
  
  
  .
diff --git a/input/bugs/core.ly b/input/bugs/core.ly
new file mode 100644 (file)
index 0000000..ef4cb12
--- /dev/null
@@ -0,0 +1,11 @@
+
+text = \lyrics \repeat "fold" 2 {}
+\alternative {
+       foo bar
+       afoo abar
+}
+
+
+\score {
+\text
+}
index 0c3bd8770d40eacfd88d9010290e75bb8d48cddf..f088d1da8e281d4299cd00e1e75c66a2799e2306 100644 (file)
@@ -2,8 +2,8 @@
 filename =      "denneboom.ly";
 enteredby =     "jcn";
 copyright =     "public domain";
-TestedFeatures = "This file tests silly line shapes";
 }
+%{ file tests silly line shapes %}
 
 \include "paper20.ly"
 
@@ -95,9 +95,8 @@ denneboom_shape = \paper{
                 65. \mm, 30. \mm
                 ;
        gourlay_maxmeasures = 30.;
-% uhuh, loop if you comment these in
-%              arithmetic_basicspace = 3.8;
-%              arithmetic_multiplier = 8.\pt;
+       arithmetic_basicspace = 3.8;
+       arithmetic_multiplier = 8.\pt;
 }
 
 \score{
@@ -105,39 +104,7 @@ denneboom_shape = \paper{
                \context Staff { \time 3/4; \melody }
                \context Lyrics \verse_one
        \paper{ 
-% huh?
-%              \denneboom_shape 
-       \paper_twenty
-       indent = 20. \mm;
-       \shape  70. \mm, 50. \mm,
-                65. \mm, 30. \mm,
-                57.5 \mm, 45. \mm,
-                50. \mm, 60. \mm,
-                42.5 \mm, 75. \mm,
-                35. \mm, 90. \mm,
-                27.5 \mm, 105. \mm,
-                20. \mm, 120. \mm,
-                10. \mm, 140. \mm,
-%               65. \mm, 30. \mm,
-                65. \mm, 40. \mm
-                ;
-       gourlay_maxmeasures = 30.;
-% uhuh, loop if you comment these in
-               arithmetic_basicspace = 3.8;
-%              arithmetic_multiplier = 8.\pt;
-               arithmetic_multiplier = 7.5\pt;
-               casting_algorithm= \Wordwrap;
+               \denneboom_shape 
        }
        \midi{ \tempo 4 = 90; }
 }
-
-%{
-\score{
-       <
-               \melody_staff
-               \verse_two_staff
-       >
-       \paper{ \denneboom_shape }
-       \midi{ \tempo 4 = 90; }
-}
-%}
index 383bfe90e2f6a96945a4b640def18c8269d4bb09..4b7eeacfafaa48d8185ef03aff487ea665e033ea 100644 (file)
@@ -57,122 +57,105 @@ $staff2_voice_2 = \notes {
   g8. g16 fis4.()a,8 d8 e8 fis2 b8 b8 a4. a8 a,4 d2 s4 
 }
 
-% hw: how does this work with new repeats?
-textx = \lyrics {  
-  Oh4 __ \repeat fold 2 { }
-  \alternative {
-     { 
-       say.4 can you | see,2 by8. the16 dawn's4 ear- ly light2 What8
+
+altOne =\lyrics {  say,4 can you | see,2 __ by8. the16 dawn's4 ear- ly light2 What8
        so8 proud-4. ly8 we4 hailed,2 At8. the16 twi-4 light's last gleam-
-       ing. Whose8. broad16 
-     }
+       ing. Whose8. broad16  }
 
-    { 
-      stripes4 and bright stars,2 through8. the16 per-4 il- ous fight,2
+altTwo =     \lyrics {  stripes4 and bright stars,2 through8. the16 per-4 il- ous fight,2
       O'er8 the8 ram-4. parts8 we4 watched,2 were8. so16 gal-4 lant- ly 
-    }
-  }
-  stream-4 ing. And8. the16 rock-4 ets' red glare,2 the8 bombs8
+       _ _   % UGH UGH
+       stream-4 ing
+  And8. the16 rock-4 ets' red glare,2 the8 bombs8
   burst-4 ing in air,2 gave4 proof4. through8 the4 night2 that8.
   our16 flag4 was still there,2 Oh4 say, does that star- span-
   gled ban- ner yet wave,2 __ O'er8. the16 land2 __ of8 the8 free2
   and8 the8 home4. of8 the4 brave.2
 }
+% old code
+nonRepeatText = \lyrics  \context LyricVoice = LVA {
+  Oh4 __
+  \context Lyrics <
+       \altOne  
+       \altTwo 
+  >
+}
+
+%{
+Be careful to have all duration within the lyrics of the same kind.
+
+Alternatives & need to be matched more intelligently.  See
+"whose broad" alt1, volta1, "streaming" alt2, *volta2*!
+
+%}
 
 textxx = \lyrics {  
-  Oh __ " " \repeat fold 2 { }
+  Oh __ \repeat "fold" 2 { }
   \alternative {
      { 
-       say. can you | see, by the16 dawn's ear- ly light What
-       so proud- ly we hailed, At the16 twi- light's last gleam-
-       ing. Whose broad16 
+       say, can you | see, by the dawn's ear- ly light What
+       so proud- ly we hailed, At the twi- light's last gleam-
+       ing. Whose broad 
      }
 
     { 
-      stripes and bright stars, through the16 per- il- ous fight,
-      O'er the ram- parts we watched, were so16 gal- lant- ly 
-    }
-  }
-  stream- ing. And the16 rock- ets' red glare, the bombs
+      stripes and bright stars, through the per- il- ous fight,
+      O'er the ram- parts we watched, were so gal- lant- ly
+       _ _ _ _ % UGH UGH UGH 
+       stream- ing
+  And the rock- ets' red glare, the bombs
   burst- ing in air, gave proof through the night that
   our flag was still there, Oh say, does that star- span-
   gled ban- ner yet wave, __ O'er the land __ of the free
   and the home of the brave.
-}
-
-textxxx = \lyrics {  
-  Oh4 __ 
-  %\alternative {
-     { 
-       say.4 can you | see,2 by8. the16 dawn's4 ear- ly light2 What8
-       so8 proud-4. ly8 we4 hailed,2 At8. the16 twi-4 light's last gleam-
-       ing. Whose8. broad16 
-     }
-
-    %{ 
-      stripes4 and bright stars,2 through8. the16 per-4 il- ous fight,2
-      O'er8 the8 ram-4. parts8 we4 watched,2 were8. so16 gal-4 lant- ly 
-    }
-  %}
-  stream-4 ing. And8. the16 rock-4 ets' red glare,2 the8 bombs8
-  burst-4 ing in air,2 gave4 proof4. through8 the4 night2 that8.
-  our16 flag4 was still there,2 Oh4 say, does that star- span-
-  gled ban- ner yet wave,2 __ O'er8. the16 land2 __ of8 the8 free2
-  and8 the8 home4. of8 the4 brave.2
-}
-
-text = \lyrics {  
-  Oh __ " "
-  %\alternative {
-     { 
-       say. can you | see, " " by the16 dawn's ear- ly light What
-       so proud- ly we hailed, At the16 twi- light's last gleam-
-       ing. Whose broad16 
-     }
-
-    %{ 
-      stripes and bright stars, through the16 per- il- ous fight,
-      O'er the ram- parts we watched, were so16 gal- lant- ly 
-    }
-  %}
-  stream- ing. And the16 rock- ets' red glare, the bombs
-  burst- ing in air, gave proof through the night that
-  our flag was still there, Oh say, does that " " star- span-
-  gled ban- ner " " yet " " wave, __ " " O'er the land __ " " of the free
-  and the home of the brave.
-}
+  }
+}}
 
-global = \notes {
-       \time 3/4;
-       \key D;
-       \partial 4;
-       \skip 4;
-       \skip 2.*8;
-       \skip 2.*16;
-       \skip 2.;
-       \bar "|.";
-       }
 
-\include "paper16.ly";
+beginmatter = \notes {\time 3/4; \key D;  s4 | }
+                       
 
-\score{ 
-       \context GrandStaff < 
+automaticLyrics = \notes \context GrandStaff < 
                \addlyrics
-               \context Staff=staffA < 
-                       \global
-                       \notes \transpose c'' {\voiceone \$staff1_voice_1 } 
+               \context Staff=staffA <
+                       \beginmatter
+                       \clef treble;
+                       \property Staff.automaticMelismas = "1"
+                       \notes \transpose c'' {\voiceone \$staff1_voice_1 \bar "|.";} 
                        \notes \transpose c'' {\voicetwo \$staff1_voice_2 } 
                >
-               \context LyricVoice \text
+               \context LyricVoice \textxx
                \context Staff=staffB <
-               
-                       \global
+                       \beginmatter
                        \clef bass;
-                       \property Staff.voltaVisibility = "0"
-                       {\voiceone \$staff2_voice_1 } 
+               \property Staff.noVoltaBraces = "1"
+                       {\voiceone \$staff2_voice_1 \bar "|."; 
                        {\voicetwo \$staff2_voice_2 } 
                >
        >
+
+handLyrics = \notes \context GrandStaff < 
+               \context Staff=staffA <
+                       \beginmatter
+                       \notes \transpose c'' {\voiceone \$staff1_voice_1 \bar "|.";} 
+                       \notes \transpose c'' {\voicetwo \$staff1_voice_2 } 
+               >
+               \nonRepeatText
+               \context Staff=staffB <
+                       \beginmatter
+                       \clef bass;
+
+                       \property Staff.noVoltaBraces = "1"
+                       {\voiceone \$staff2_voice_1 \bar "|."; } 
+                       {\voicetwo \$staff2_voice_2 } 
+               >
+       >
+
+
+\include "paper16.ly";
+
+\score{ 
+       \automaticLyrics
        \paper{
                \paper_sixteen
                textheight = 230.\mm;
diff --git a/input/test/abbreviation-beam.sly b/input/test/abbreviation-beam.sly
new file mode 100644 (file)
index 0000000..88cc140
--- /dev/null
@@ -0,0 +1,6 @@
+[:16 c'1 d]
+[:8 c2 d]
+[:16 c4 d]
+[:32 c16 d]
+[:32 c16 d]
+[:16 c8 d]
diff --git a/input/test/force-hshift.fly b/input/test/force-hshift.fly
new file mode 100644 (file)
index 0000000..9bdee7d
--- /dev/null
@@ -0,0 +1,15 @@
+
+\context Staff <
+       \context Voice = VA {
+               \property Voice.forceHorizontalShift = "0.1"
+               \stemup \shifton
+               <g' d'>
+       }       
+
+       \context Voice = VB {
+               \stemdown
+               \shifton
+               \property Voice.forceHorizontalShift = "-0.1"
+               <bes f'>
+       }
+>
diff --git a/input/test/hara-kiri-switch.ly b/input/test/hara-kiri-switch.ly
new file mode 100644 (file)
index 0000000..0009eb1
--- /dev/null
@@ -0,0 +1,52 @@
+\version "1.1.64";
+
+voiceOne = \notes \relative c'' {
+       a1 a a
+       a2 a2
+       a2 a8 a a a
+}
+
+staffOne = \context Staff = one <
+       \notes \context Voice=one < 
+               \voiceOne
+       >
+>
+
+voiceTwo = \notes \relative c' {
+       % we must have a Thread context before we can switch staffs
+       % in this case, the notes before the switching  will do that 
+       % implicitely
+       \context Thread
+
+       R1*3
+       c2 c2
+       \translator Staff=one
+       \translator Voice=one
+       c2
+       c8 c c c
+}
+
+staffTwo = \context Staff = two <
+       % notes must go to Staff context: we want to switch Staff translators
+       %\notes \context Voice=one < 
+               \voiceTwo
+       %>
+>
+
+grandstaff = \context GrandStaff = one <
+       \staffOne
+       \staffTwo
+>
+
+\score{
+       \grandstaff
+       \paper{
+               linewidth=80.0\mm;
+               castingalgorithm = \Wordwrap;
+               \translator { \VoiceContext beamAuto=0; }
+               \translator { \HaraKiriStaffContext }
+               \translator { \OrchestralScoreContext skipBars = 1; }
+       }
+}
+
+
index 689cca54791d5fffc5e0c72fa8743d3ca3afb0db..814744a23524d4e10e82241f8b956498e8a5e681 100644 (file)
@@ -10,10 +10,11 @@ copyright =  "public domain";
 \version "1.1.52";
 
 m =\notes  \relative c'' {
+       \property Staff.automaticMelismas = "1"
        \autoBeamOff
-       g4  r8 \times 2/3 { g'8 f e } r8 \grace { [d16 c b] } e4
-       \melisma
-       d8.() c16
+       g4  r8 \times 2/3 { g'8( f )e } r8 \grace { [d16 c b] } e4
+       \property Staff.textEmptyDimension = "1"
+       d8.^"melisma"   \melisma c16
        \melismaEnd
        b }
 
index 2313f13a446aaa16e82de829f28d350f4acbc82f..d264169f9f0aae2d7ef6c1a4f517ea116fd2b195 100644 (file)
@@ -1,5 +1,3 @@
-#if 0
-
 /*
   abbreviation-beam-engraver.cc -- implement Abbreviation_beam_engraver
 
 #include "abbreviation-beam.hh"
 #include "musical-request.hh"
 #include "misc.hh"
+#include "warn.hh"
+#include "score-engraver.hh"
 
-
-ADD_THIS_TRANSLATOR(Abbreviation_beam_engraver);
+ADD_THIS_TRANSLATOR (Abbreviation_beam_engraver);
 
 Abbreviation_beam_engraver::Abbreviation_beam_engraver ()
 {
-  span_reqs_drul_[LEFT] = span_reqs_drul_[RIGHT] = 0;
+  reqs_drul_[LEFT] = reqs_drul_[RIGHT] = 0;
   abeam_p_ = 0;
+  finished_abeam_p_ = 0;
+  prev_start_req_ = 0;
 }
 
 bool
-Abbreviation_beam_engraver::do_try_music (Music*r)
+Abbreviation_beam_engraver::do_try_music (Music* m)
+{
+  if (Abbreviation_beam_req* b = dynamic_cast <Abbreviation_beam_req *> (m))
+    {
+      Direction d = b->span_dir_;
+      if (reqs_drul_[d] && !reqs_drul_[d]->equal_b (b))
+       return false;
+
+      if ((d == STOP) && !abeam_p_)
+       {
+         m->warning (_ ("No abbreviation beam to end"));
+         return false;
+       }
+
+      reqs_drul_[d] = b;
+      return true;
+    }
+
+  return false;
+}
+
+void
+Abbreviation_beam_engraver::do_process_requests ()
 {
-  Abbreviation_beam_req * b = dynamic_cast <Abbreviation_beam_req *> (r);
+  if (reqs_drul_[STOP])
+    {
+      if (!abeam_p_)
+       reqs_drul_[STOP]->warning (_("No abbreviation beam to end"));
+      prev_start_req_ = 0;
+      finished_abeam_p_ = abeam_p_;
+      abeam_p_ = 0;
+    }
 
-  if (!b)
-    return false;
+  if (abeam_p_)
+    {
+      Score_engraver * e = 0;
+      Translator * t  =  daddy_grav_l ();
+      for (; !e && t;  t = t->daddy_trans_l_)
+       {
+         e = dynamic_cast<Score_engraver*> (t);
+       }
+      
+      if (!e)
+       programming_error ("No score engraver!");
+      else
+       e->forbid_breaks ();
+    }
 
-  if (bool (abeam_p_) == bool (b->span_dir_ == START))
-    return false;
+  if (reqs_drul_[START])
+    {
+      if (abeam_p_)
+       {
+         reqs_drul_[START]->warning (_ ("Already have an abbreviation beam"));
+         return;
+       }
 
-  Direction d = (!abeam_p_) ? LEFT : RIGHT;
-  if (span_reqs_drul_[d] && !span_reqs_drul_[d]->equal_b (b))
-    return false;
+      prev_start_req_ = reqs_drul_[START];
 
-  span_reqs_drul_[d] = b;
-  return true;
+      abeam_p_ = new Abbreviation_beam;
+      announce_element (Score_element_info (abeam_p_, reqs_drul_[LEFT]));
+  }
 }
 
 void
-Abbreviation_beam_engraver::do_process_requests ()
+Abbreviation_beam_engraver::do_post_move_processing ()
 {
-  if (!abeam_p_ && span_reqs_drul_[LEFT]) {
-    abeam_p_ = new Abbreviation_beam;
-    announce_element (Score_element_info (abeam_p_, span_reqs_drul_[LEFT]));
-  }
+  reqs_drul_ [START] = 0;
 }
 
 void
 Abbreviation_beam_engraver::do_pre_move_processing ()
 {
-  if (abeam_p_ && span_reqs_drul_[RIGHT]) {
-    typeset_element (abeam_p_);
-    abeam_p_ = 0;
+  typeset_beam ();
+}
 
-    span_reqs_drul_[RIGHT] =
-      span_reqs_drul_[LEFT] = 0;
-  }
+void
+Abbreviation_beam_engraver::typeset_beam ()
+{
+  if (finished_abeam_p_)
+    {
+      typeset_element (finished_abeam_p_);
+      finished_abeam_p_ = 0;
+
+      reqs_drul_[STOP] = 0;
+    }
 }
 
 void
 Abbreviation_beam_engraver::do_removal_processing ()
 {
+  typeset_beam ();
   if (abeam_p_)
     {
-      span_reqs_drul_[LEFT]->warning (_("unterminated beam"));
-      typeset_element (abeam_p_);
-      abeam_p_ = 0;
+      prev_start_req_->warning (_ ("Unfinished abbreviation beam"));
+      finished_abeam_p_ = abeam_p_;
+      typeset_beam ();
     }
 }
 
 void
 Abbreviation_beam_engraver::acknowledge_element (Score_element_info i)
 {
-  Stem* s = dynamic_cast<Stem *> (i.elem_l_);
-  if (!abeam_p_ || !s)
-    return;
-
-  int type_i = span_reqs_drul_[LEFT]->type_i_;
-  s->flag_i_ = intlog2 (type_i) - 2;
-  s->beams_i_drul_[(span_reqs_drul_[RIGHT]) ? LEFT: RIGHT] = s->flag_i_;
-
-  abeam_p_->multiple_i_ = s->flag_i_;
-  if (s->type_i () != 1) // no abbrev gaps on half note
-    s->set_elt_property (beam_gap_scm_sym,
-                        gh_int2scm(s->flag_i_ - ((s->type_i () >? 2) - 2)));
-
-  abeam_p_->add_stem (s);
-}
-
+  if (abeam_p_)
+    {
+      if (Stem* s = dynamic_cast<Stem *> (i.elem_l_))
+       {
+         int type_i = prev_start_req_->type_i_;
+         s->flag_i_ = intlog2 (type_i) - 2;
+
+         s->beams_i_drul_[LEFT] = s->flag_i_;
+         s->beams_i_drul_[RIGHT] = s->flag_i_;
+         
+         abeam_p_->multiple_i_ = s->flag_i_;
+         /*
+           abbrev gaps on all but half note
+         */
+#if 0
+         if (s->type_i () != 1)
+           {
+             int gap_i =s->flag_i_ - ((s->type_i () >? 2) - 2);
+             s->set_elt_property (beam_gap_scm_sym, gh_int2scm(gap_i));
+           }
+#else
+         if (s->type_i () != 1)
+           {
+             int gap_i =s->flag_i_ - ((s->type_i () >? 2) - 2);
+             abeam_p_->set_elt_property (beam_gap_scm_sym, gh_int2scm(gap_i));
+           }
 #endif
+         
+         abeam_p_->add_stem (s);
+       }
+    }
+}
index cc10968278894aac61cca7604f58d11b0a54b489..b0307f2e6f07fcf649b3aca969eca254e6ef0a51 100644 (file)
@@ -1,4 +1,3 @@
-#if 0
 /*
   abbreviation-beam.cc -- implement Abbreviation_beam
 
@@ -59,4 +58,3 @@ Abbreviation_beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
    */
   return Beam::stem_beams (here, next, prev);
 }
-#endif
index 87165d732ded1a383c765550fe8ee8f389903464..c539e883c6391067b29481e2d5f7183d344a75fc 100644 (file)
@@ -11,6 +11,7 @@
 #include "musical-request.hh"
 #include "bar.hh"
 #include "beam.hh"
+#include "abbreviation-beam.hh"
 #include "rest.hh"
 #include "stem.hh"
 #include "debug.hh"
@@ -187,8 +188,18 @@ Auto_beam_engraver::create_beam_p ()
   Beam* beam_p = new Beam;
 
   for (int i = 0; i < stem_l_arr_p_->size (); i++)
-    beam_p->add_stem ((*stem_l_arr_p_)[i]);
-
+    {
+      /*
+       watch out for stem tremolos and abbreviation beams
+       */
+      if ((*stem_l_arr_p_)[i]->beam_l_)
+       {
+         delete beam_p;
+         return 0;
+       }
+      beam_p->add_stem ((*stem_l_arr_p_)[i]);
+    }
+  
   /* urg, copied from Beam_engraver */
   Scalar prop = get_property ("beamslopedamping", 0);
   if (prop.isnum_b ()) 
@@ -212,7 +223,8 @@ Auto_beam_engraver::end_beam ()
   else
     {
       finished_beam_p_ = create_beam_p ();
-      finished_grouping_p_ = grouping_p_;
+      if (finished_beam_p_)
+       finished_grouping_p_ = grouping_p_;
       delete stem_l_arr_p_;
       stem_l_arr_p_ = 0;
       grouping_p_ = 0;
@@ -287,6 +299,10 @@ Auto_beam_engraver::acknowledge_element (Score_element_info info)
        {
          junk_beam ();
        }
+      else if (Abbreviation_beam *b = dynamic_cast<Abbreviation_beam*> (info.elem_l_))
+       {
+         junk_beam ();
+       }
       else if (Bar *b = dynamic_cast<Bar *> (info.elem_l_))
        {
          junk_beam ();
index 199117ac07900880355a84f2e95c52873e6fc983..64448f2450ab50c96b7dd5e2a1f3cea71212b8a2 100644 (file)
@@ -341,8 +341,11 @@ Beam::set_steminfo ()
   for (int i=0; i < stems_.size (); i++)
     {
       Stem *s = stems_[i];
+#if 0
+      // abbreviation beam needs to beam over invisible stems of wholes
       if (s->invisible_b ())
        continue;
+#endif
 
       Stem_info info (s, multiple_i_);
       if (leftx == 0)
@@ -663,7 +666,13 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
   Molecule rightbeams;
 
   // UGH
-  Real nw_f = paper_l ()->note_width () * 0.8;
+  Real nw_f;
+  if (here->type_i ()== 1)
+    nw_f = paper_l ()->get_var ("wholewidth");
+  else if (here->type_i () == 2)
+    nw_f = paper_l ()->note_width () * 0.8;
+  else
+    nw_f = paper_l ()->get_var ("quartwidth");
 
   /* half beams extending to the left. */
   if (prev)
@@ -702,7 +711,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
       SCM gap = get_elt_property (beam_gap_scm_sym);
       if (gap != SCM_BOOL_F)
        {
-         int gap_i = gh_scm2int (gap);
+         int gap_i = gh_scm2int (SCM_CDR (gap));
          int nogap = rwholebeams - gap_i;
          
          for (; j  < nogap; j++)
@@ -720,7 +729,10 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
       for (; j  < rwholebeams; j++)
        {
          Molecule b (a);
-         b.translate (Offset (gap_f, -dir_ * dy * j));
+         if (!here->invisible_b ())
+           b.translate (Offset (gap_f, -dir_ * dy * j));
+         else
+           b.translate (Offset (0, -dir_ * dy * j));
          rightbeams.add_molecule (b);
        }
 
index 9d9bf43af76f19ddb5e4627763d3af1fcc4b2695..2ea397cb7228a7d5805820293e97670643f5e512 100644 (file)
@@ -50,7 +50,12 @@ Change_iterator::do_process_and_next (Moment m)
       last = current;
       current = current->daddy_trans_l_;
     }
-  
+
+  if (current && current->id_str_ == to_id)
+    {
+      String msg;
+      msg += "Cannot switch  translators, I'm there already.";
+    }
   
   if (current) 
     if (last)
index c895dac10df96e50f7115c35883209c4dc0e65cf..e9989408b3759171a0484d804491e2e15eeaeafe 100644 (file)
@@ -30,8 +30,8 @@ Collision_engraver::acknowledge_element (Score_element_info i)
 {
   if (Note_column * c = dynamic_cast<Note_column *> (i.elem_l_))
     {
-      if (c->rest_b () || c->dim_cache_[X_AXIS]->parent_l_
-         || c->dim_cache_[X_AXIS]->parent_l_)
+      /*should check Y axis? */
+      if (c->rest_b () || c->dim_cache_[X_AXIS]->parent_l_)
        return ;
 
       note_column_l_arr_.push (c);
index a252a633d3448261036db905106c3c57ca40e303..4b1fb66685881bf777422191430b414611f0b5ca 100644 (file)
@@ -10,6 +10,7 @@
 #include "note-column.hh"
 #include "note-head.hh"
 #include "paper-def.hh"
+#include "ly-symbols.hh"
 
 Collision::Collision()
 {
@@ -135,7 +136,20 @@ Collision::do_pre_processing()
          }
          while ((flip (&d))!= UP);
     }
-
+  do
+    {
+      for (int i=0; i < clash_groups[d].size (); i++)
+       {
+         SCM force =  clash_groups[d][i]->remove_elt_property (force_hshift_scm_sym);
+         if (force != SCM_BOOL_F)
+           {
+             force = SCM_CDR (force);
+             offsets[d][i] = gh_scm2double (force);
+           }
+       }
+    }
+  while ((flip (&d))!= UP);
+  
   Real wid_f = paper_l ()->note_width ();
   do
     {
index 6e957038e8486c66aa83d8266ef11ff4793095d0..d3610592bea3930e52effa8e90f66f1ad03f791a 100644 (file)
@@ -31,10 +31,14 @@ protected:
   virtual bool do_try_music (Music*);
   virtual void acknowledge_element (Score_element_info);
   virtual void do_pre_move_processing();
+  virtual void do_post_move_processing();
 
 private:
-  Drul_array<Abbreviation_beam_req *> span_reqs_drul_;
+  void typeset_beam ();
+  Drul_array<Abbreviation_beam_req*> reqs_drul_;
+  Abbreviation_beam_req* prev_start_req_;
   Abbreviation_beam* abeam_p_;
+  Abbreviation_beam* finished_abeam_p_;
 };
 
 #endif // ABBREVIATION_BEAM_ENGRAVER_HH
index 1a35162ab1c2b6b8ad7ded8de1b58e4e5d78f01f..9d446bae0be12931e90b7f014808d04a34be4b3d 100644 (file)
@@ -42,6 +42,7 @@ DECLARE_LY_SYMBOL(hyphen_height);
 DECLARE_LY_SYMBOL(hyphen_minimum_length);
 DECLARE_LY_SYMBOL(filledbox);
 DECLARE_LY_SYMBOL(fontsize);
+DECLARE_LY_SYMBOL(force_hshift);
 DECLARE_LY_SYMBOL(grace);
 DECLARE_LY_SYMBOL(header);
 DECLARE_LY_SYMBOL(horizontal_shift);
index 5ae6a43b55ea643dc3806a208a6d8972df980914..b8c36a8d0b01afca9aef6c0e88d6d60dfeb9aab9 100644 (file)
@@ -19,9 +19,6 @@ class Lyric_combine_music_iterator : public Music_iterator
   Music_iterator * lyric_iter_p_;
   
 protected:
-  bool melisma_started_b_;
-
-  
   virtual void construct_children ();
   virtual Moment next_moment () const;
   virtual void do_process_and_next (Moment);
index d3cfc3dd1ed14390e3d56356e4513d35a2f516e7..8f380e9a0462e934a8ade9d0c6191f1de7264289 100644 (file)
@@ -166,6 +166,19 @@ class Melisma_req : public Span_req
 public:
   VIRTUAL_COPY_CONS(Music);
 };
+/** 
+ Start / stop an abbreviation beam. */
+class Abbreviation_beam_req : public Span_req  
+{
+public:
+  VIRTUAL_COPY_CONS (Music);
+
+  Abbreviation_beam_req ();
+
+  virtual void do_print () const;
+
+  int type_i_;
+};
 
 /**
    Helping req to signal start of a melisma from within a context, and
index c56e1a910ad0c24d905c51e4a5a8765b397f82ce..cc86ccdac19294aa005dec466de5028dbf570033 100644 (file)
@@ -44,6 +44,8 @@ public:
   ~My_lily_lexer ();
   int yylex ();
 
+  Input here_input () const;
+
   void start_main_input ();
   bool notename_b (String) const;
   bool chordmodifier_b (String) const;
index ddd55c75171b247bd759f84f4342badeff8d5ac3..301eb358ee4a4aa3114688725ddb17f528447a89 100644 (file)
@@ -39,6 +39,7 @@ public:
   Duration default_duration_;
   Musical_pitch default_pitch_;
   Scope *default_header_p_;
+  int abbrev_beam_type_i_;
   bool first_b_;
   int fatal_error_i_;
   Sources * source_l_;
@@ -70,6 +71,7 @@ private:
   Simultaneous_music* get_rest_element (String, Duration *);
   Simultaneous_music* get_word_element (String, Duration*);
   String notename_str (Melodic_req* melodic);
+  void set_abbrev_beam (int type_i);
   void set_last_duration (Duration const *);
   void set_last_pitch (Musical_pitch const *);
   friend int yyparse (void*);
index 6ccf8e22c779578d91d3eb75b750b1ffdf9d8e67..ba470672f8944f4a30713c7e3dde64097b3a5709 100644 (file)
@@ -16,6 +16,7 @@ class Slur_engraver :public Engraver {
   Link_array<Slur> slur_l_stack_;
   Link_array<Slur> end_slur_l_arr_;
 
+  void set_melisma (bool);
 protected:
   virtual bool do_try_music (Music*);
   virtual void do_process_requests();
index 50b137ab897ad041d9da2ab3b6d4facd8af459f1..eff74dbb29c41462e0d4e5aa9de24d9fa9c2c798 100644 (file)
@@ -126,7 +126,7 @@ Key_engraver::read_req (Key_change_req const * r)
 {
   old_accidental_idx_arr_ = accidental_idx_arr_;
   key_.clear ();
-  Scalar prop = get_property ("keyoctaviation", 0);
+  Scalar prop = get_property ("keyOctaviation", 0);
   if (prop.length_i () > 0)
     {
       key_.multi_octave_b_ = ! prop.to_bool ();
index f7e82ac5bf5d0cefbe076ac88cb8d43b1cc7c4d4..472f2d0c49f2d4ac58d474e12a61022f90681387 100644 (file)
@@ -300,6 +300,11 @@ HYPHEN             --
                        *(s.ch_l () + i + 1) = 'c';
                        s = s.left_str (i+2) + " " + s.right_str (s.length_i ()-i-2);
                        }
+
+               char c = s[s.length_i () - 1];
+               if (c == '{' &&  c == '}') // brace open is for not confusing dumb tools.
+                       here_input ().warning (
+                               "Brace found at end of lyric. Did you forget a space?");
                yylval.string = new String (s);
                DOUT << "lyric : `" << s << "'\n";
                return STRING;
index 639cbaae25e61e17b9b3f156a77f518633bef6ea..6d4cdc6bee322b6f0d84151f0f8a6a86ee352af4 100644 (file)
@@ -23,7 +23,6 @@ Lyric_combine_music_iterator::Lyric_combine_music_iterator ()
   melisma_start_req.span_dir_ = START;
   melisma_stop_req.span_dir_ = STOP;
   
-  melisma_started_b_ = false;
   music_iter_p_ =0;
   lyric_iter_p_ =0;
 }
@@ -70,20 +69,21 @@ Lyric_combine_music_iterator::do_process_and_next (Moment m)
   if (busy)
     {
       bool melisma_b = try_music (&melisma_playing_req);
-      if (!melisma_started_b_ || !melisma_b)
+      if (!melisma_b)
        {
          if (lyric_iter_p_->ok ())
            {
+#if 0                          // devise a new way for this
              if (melisma_b && !melisma_started_b_)
                lyric_iter_p_->try_music (&melisma_start_req);
              else if (melisma_started_b_)
                lyric_iter_p_->try_music (&melisma_stop_req);
-         
+#endif
+             
              Moment m= lyric_iter_p_->next_moment ();
              lyric_iter_p_->process_and_next (m);
            }
        }
-      melisma_started_b_ = melisma_b;
     }
   
 
index 00faa6f0f435d1012b6bc511333e5cb1cb24ccea..c4d8efa4fe212fec3e167c23fbdfac04528f1a43 100644 (file)
@@ -159,6 +159,18 @@ Span_req::Span_req ()
   span_dir_ = CENTER;
 }
 
+Abbreviation_beam_req::Abbreviation_beam_req ()
+{
+  type_i_ = 0;
+}
+
+void
+Abbreviation_beam_req::do_print () const
+{
+#ifndef NPRINT
+  DOUT << type_i_;
+#endif
+}
 
 void
 Text_script_req::do_print () const
index 8e73971984178a09b3720056077318a58aee8e6e..00e55ae4dbbc75c4393ef1eacbda98f49707447f 100644 (file)
@@ -18,6 +18,7 @@
 #include "source-file.hh"
 #include "main.hh"
 #include "scope.hh"
+#include "input.hh"
 
 static Keyword_ent the_key_tab[]={
   {"spanrequest", SPANREQUEST},
@@ -231,3 +232,10 @@ My_lily_lexer::escaped_char(char c) const
     }
   return 0;
 }
+
+Input
+My_lily_lexer::here_input () const
+{
+  Source_file * f_l= source_file_l();
+  return Input (f_l, here_ch_C());
+}
index 46f09be71109b2950376e7a4f8ca50c7030e0ed8..61f52df13f685ad3e918013746b58ff900e59f1a 100644 (file)
@@ -27,6 +27,7 @@ My_lily_parser::My_lily_parser (Sources * source_l)
   first_b_ = true;
   source_l_ = source_l;
   lexer_p_ = 0;
+  abbrev_beam_type_i_ = 0;
   default_duration_.durlog_i_ = 2;
   default_pitch_ = Musical_pitch (5*7, 0);
   error_level_i_ = 0;
@@ -102,6 +103,12 @@ My_lily_parser::set_last_duration (Duration const *d)
   default_duration_ = *d;
 }
 
+void
+My_lily_parser::set_abbrev_beam (int type_i)
+{
+  abbrev_beam_type_i_ = type_i;
+}
+
 void
 My_lily_parser::set_last_pitch (Musical_pitch const* p)
 {
@@ -189,8 +196,7 @@ My_lily_parser::pop_spot()
 Input
 My_lily_parser::here_input() const
 {
-  Source_file * f_l= lexer_p_->source_file_l();
-  return Input (f_l, here_ch_C());
+  return  lexer_p_->here_input ();
 }
 
 Paper_def*
index bcbcf0cf10692129a51aef38e5e4602c1e664d18..7a6189007b4c85c3dd1ab08c04b6d1d92664058c 100644 (file)
@@ -923,11 +923,35 @@ abbrev_command_req:
                b->span_type_str_ = "beam";
                $$ =b;
        }
+       | '[' ':' unsigned {
+               if (!Duration::duration_type_b ($3))
+                 THIS->parser_error (_f ("not a duration: %d", $3));
+               else if ($3 < 8)
+                 THIS->parser_error (_ ("can't abbreviate"));
+               else
+                 THIS->set_abbrev_beam ($3);
+
+               Abbreviation_beam_req* a = new Abbreviation_beam_req;
+               a->span_dir_ = START;
+               a->type_i_ = THIS->abbrev_beam_type_i_;
+               $$=a;
+       }
        | ']'           {
-               Span_req*b= new Span_req;
-               b->span_dir_ = STOP;
-               b->span_type_str_ = "beam";
-               $$ = b;
+               if (!THIS->abbrev_beam_type_i_)
+                 {
+                    Span_req*b= new Span_req;
+                    b->span_dir_ = STOP;
+                    b->span_type_str_ = "beam";
+                    $$ = b;
+                  }
+               else
+                 {
+                   Abbreviation_beam_req* a = new Abbreviation_beam_req;
+                   a->span_dir_ = STOP;
+                   a->type_i_ = THIS->abbrev_beam_type_i_;
+                   THIS->set_abbrev_beam (0);
+                   $$ = a;
+                 }
        }
        | BREATHE {
                $$ = new Breathing_sign_req;
@@ -1355,6 +1379,13 @@ simple_element:
                delete $1;
                n->duration_ = *$4;
                delete $4;
+               if (THIS->abbrev_beam_type_i_)
+                 {
+                   if (n->duration_.plet_b ())
+                     THIS->parser_error (_ ("can't abbreviate tuplet"));
+                   else
+                     n->duration_.set_plet (1, 2);
+                 }
                n->cautionary_b_ = $3 % 2;
                n->forceacc_b_ = $2 % 2 || n->cautionary_b_;
 
index 62f5f4a48c07bc1b55348450c70b51fb2e930c6f..9dad869f63514e2ffe80c9bc1a11dcff7dee5cc0 100644 (file)
@@ -29,10 +29,7 @@ Repeat_engraver::do_try_music (Music* m)
   if (Repeated_music* r = dynamic_cast<Repeated_music *> (m))
     {
       if (repeated_music_l_)
-       {
-         m->warning ("Already have repeated music.");
-         return false;
-       }
+       return false;
       
       if (r->semi_fold_b_)
        {
@@ -58,7 +55,8 @@ Repeat_engraver::queue_events ()
   Music_sequence* alt = repeated_music_l_->alternatives_p_;
   Moment walk_mom = now_mom () + repeated_music_l_->repeat_body_p_->length_mom ();
 
-      
+  bool create_volta = ! get_property ("noVoltaBraces",0).to_bool ();
+
   Cons_list<Bar_create_event> becel;
   becel.append (new Bar_create_event (now_mom (), "|:"));
 
@@ -92,16 +90,18 @@ Repeat_engraver::queue_events ()
            }
 
          
-         Bar_create_event * c = new Bar_create_event (walk_mom, last_number+ 1,
-                                                      volta_number);
-
-         if (!i->next_)
-           c->last_b_ = true;
-         
-         becel.append (c);
-         last_number = volta_number;
-         volta_number ++;
-
+         if (create_volta)
+           {
+             Bar_create_event * c = new Bar_create_event (walk_mom, last_number+ 1,
+                                                          volta_number);
+             
+             if (!i->next_)
+               c->last_b_ = true;
+             
+             becel.append (c);
+             last_number = volta_number;
+             volta_number ++;
+           }
          // should think about voltaSpannerDuration
          walk_mom += i->car_->length_mom();
 
index 09fe2e05e81c23619386b9f1c3488af47b4c2a40..1aba90d57c654b21692c4c44e0486fd6328b37b3 100644 (file)
@@ -95,7 +95,7 @@ Repeated_music::alternatives_length_mom () const
     return 0;
   
   if  (fold_b_)
-    alternatives_p_->maximum_length ();
+    return alternatives_p_->maximum_length ();
 
   Moment m =0;
   int done =0;
index 5e03c9b3fb9ac94fe7cb2ba934e2fe3495df4585..a2f1103d8a743ea82ca63238502e21ad18f489f1 100644 (file)
@@ -105,13 +105,19 @@ Rhythmic_column_engraver::do_pre_move_processing()
   if (ncol_p_) 
     {
       Scalar sh = get_property ("horizontalNoteShift", 0);
-      // egcs
-      if (sh.to_bool () && sh.isnum_b ())
+      if (sh.isnum_b ())
        {
          ncol_p_->set_elt_property (horizontal_shift_scm_sym,
                                     gh_int2scm (int (sh)));
        }
 
+      sh = get_property ("forceHorizontalShift" ,0);
+      if (sh.isnum_b ())
+       {
+         ncol_p_->set_elt_property (force_hshift_scm_sym,
+                                    gh_double2scm (double (sh)));
+       }
+
       typeset_element (ncol_p_);
       ncol_p_ =0;
     }
index 70b163169397f4ee99446d8772e0f52e9454034f..1faaa67c13663a43eb60d64de06c0c13c034d44a 100644 (file)
@@ -41,6 +41,9 @@ Simultaneous_music_iterator::construct_children()
                                                    to_str (j))
        : report_to_l ();
 
+      if (!t)
+       t = report_to_l ();
+
       mi->init_translator (i->car_, t);
       mi->construct_children ();
       
index d2464fc5a74198c5429890eab50a20c8d046c492..b97a0de7b7b617627c88985a41865bebdd8c4080 100644 (file)
@@ -10,6 +10,7 @@
 #include "slur.hh"
 #include "debug.hh"
 #include "note-column.hh"
+#include "translator-group.hh"
 
 bool
 Slur_engraver::do_try_music (Music *req_l)
@@ -19,11 +20,23 @@ Slur_engraver::do_try_music (Music *req_l)
       if (sl->span_type_str_ != "slur")
        return false;
       new_slur_req_l_arr_.push (sl);
+
       return true;
     }
   return false;
 }
 
+void
+Slur_engraver::set_melisma (bool m)
+{
+    Translator_group *where = daddy_trans_l_;
+    get_property ("melismaBusy", &where);
+    if (!where)
+      where = daddy_trans_l_;
+    
+    daddy_trans_l_->set_property ("melismaBusy", m ? "1" :"0");
+}
+
 void
 Slur_engraver::acknowledge_element (Score_element_info info)
 {
@@ -76,7 +89,7 @@ Slur_engraver::do_process_requests()
          // push a new slur onto stack.
          //(use temp. array to wait for all slur STOPs)
          Slur * s_p =new Slur;
-         Scalar prop = get_property ("slurdash", 0);
+         Scalar prop = get_property ("slurDash", 0);
          if (prop.isnum_b ()) 
            s_p->set_elt_property (dashed_scm_sym, gh_int2scm(prop));
 
@@ -113,6 +126,10 @@ void
 Slur_engraver::do_post_move_processing()
 {
   new_slur_req_l_arr_.clear();
+  if (get_property ("automaticMelismas",0).to_bool ())
+    {
+      set_melisma (slur_l_stack_.size ());
+    }
 }
 
 
index 4e5d37d75155431270940ad75023383bc1e3ae42..837777d921105e47e2ac6976325e19d254693358 100644 (file)
@@ -48,7 +48,8 @@ papersize = "a4"
 % ugh
 \include "midi.ly"
 
-\include "dynamic.ly"
+\include "textscripts.ly"
+\include "spanners.ly"
 
 \include "property.ly"
 
diff --git a/ly/dynamic.ly b/ly/dynamic.ly
deleted file mode 100644 (file)
index a8cd081..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-%
-% declare the standard dynamic identifiers.
-%
-
-pppppp = \textscript"pppppp" "dynamic" 
-ppppp = \textscript"ppppp" "dynamic"
-pppp = \textscript "pppp" "dynamic"
-ppp = \textscript "ppp" "dynamic"
-pp = \textscript "pp" "dynamic"
-p = \textscript "p" "dynamic"
-mp = \textscript "mp" "dynamic"
-mf = \textscript "mf" "dynamic"
-f = \textscript "e" "dynamic"                  % see feta-din layout
-ff = \textscript "ff" "dynamic"
-fff = \textscript "fff" "dynamic"
-ffff = \textscript "ffff" "dynamic"
-fffff = \textscript "fffff" "dynamic"
-ffffff = \textscript "ffffff" "dynamic"
-fp = \textscript "fp" "dynamic"
-sf = \textscript "sf" "dynamic"
-sff = \textscript "sff" "dynamic"
-sfz = \textscript "sfz" "dynamic"
-fz = \textscript "fz" "dynamic"
-sp = \textscript "sp" "dynamic"
-spp = \textscript "spp" "dynamic"
-rfz = \textscript "rfz" "dynamic"
-
-% 1st arg dynamic (louder/softer). 2nd arg spantype
-cr = \spanrequest \start "crescendo"
-decr = \spanrequest  \start "decrescendo"
-rc = \spanrequest   \stop "crescendo"
-rced = \spanrequest \stop "decrescendo"
index 7cca986936e887d0d148aaa14f3dc693969d58eb..d8cd95439bde01c49e65ce8e96cc1fffddfb9249 100644 (file)
@@ -95,7 +95,7 @@ VoiceContext = \translator {
        beamAuto = "1";
        \consists "Auto_beam_engraver";
        \include "auto-beam-settings.ly";
-%      \consists "Abbreviation_beam_engraver";
+       \consists "Abbreviation_beam_engraver";
 %      \consists "Multi_measure_rest_engraver";
 
        % ugh.  Order matters here.
index 033f1c9a3ff1733f39a18773ee7cb4172739d5d4..1189cd97aa6aba3853a884b6b3889ec31fcd896d 100644 (file)
@@ -22,13 +22,26 @@ interbeam4 = (3.0 * \interline - \beam_thickness) / 3.0;
 % poor man's array size
 stem_max = 3.0;
 
-% stem stuff measured in staff positions.
+%{ Specify length of stems for notes in the staff
+that don't have beams. 
+ Measured in staff positions.
+%}
 stem_length0 = 7.;
 stem_length1 = 5.;
 stem_length2 = 4.;
 stem_length3 = 3.;
 
-%
+%{
+The space taken by a note is determined by the formula 
+
+arithmetic_multiplier * ( c + log2 (time) ))
+
+where code(time) is the amount of time a note occupies.  The value
+of code(c) is chosen such that the smallest space within a measure is
+arithmetic_basicspace.  The smallest space is the one following the
+shortest note in the measure.  Typically arithmetic_basicspace is set
+to the width of a quarter note head.
+%}
 arithmetic_basicspace = 2.;
 arithmetic_multiplier = 0.9 * \quartwidth ;
 
@@ -54,10 +67,12 @@ grace_minimum_stem_length1 = \minimum_stem_length1 * \grace_factor;
 grace_minimum_stem_length2 = \minimum_stem_length2 * \grace_factor;
 grace_minimum_stem_length3 = \minimum_stem_length3 * \grace_factor;
 
-% stems in unnatural (forced) direction should be shortened,
-% according to [Roush & Gourlay].  Their suggestion to knock off
-% a whole staffspace seems a bit drastical: we'll do half.
-%
+%{
+  stems in unnatural (forced) direction should be shortened,
+  according to [Roush & Gourlay].  Their suggestion to knock off
+  a whole staffspace seems a bit drastical: we'll do half.
+%}
+
 forced_stem_shorten0 = 1.0;
 forced_stem_shorten1 = \forced_stem_shorten0;
 forced_stem_shorten2 = \forced_stem_shorten1;
@@ -82,6 +97,15 @@ UP = 1.0;
 MAJORITY = 2.0;
 MEAN = 3.0;
 MEDIAN = 4.0;
+
+%{
+dit(code(beam_dir_algorithm)) Specify algorithm for determining
+whether beams go up or down.  It is real valued.  If set to 2.0 then
+majority selection is used.  If set to 3.0, then mean selection is
+used based on the mean center distance.  If set to 4.0 then median
+selection is used, based on the median center distance.
+%}
+
 % [Ross]: majority
 beam_dir_algorithm = \MAJORITY;
 
@@ -91,12 +115,21 @@ beam_lengthened = 0.2 * \interline;
 % and slope is running away steeper than
 beam_steep_slope = 0.2 / 1.0;
 
+%{
+dit(code(slur_x_gap)) Horizontal space between note and slur.  Set to
+code(\interline / 5) by default.  
+
+%}
 % OSU: suggested gap = ss / 5;
 slur_x_gap = \interline / 5.0;
 slur_y_gap = 0.25 * \interline;
 slur_y_free = 0.75 * \interline;
 slur_x_minimum = 3.0 * \interline;
 
+%{
+Like beams, slurs often aren't as steep as the notes they encompass.
+This sets the amount of damping.
+%}
 % slope damping: keep dy/dx < slur_slope_damping
 slur_slope_damping = 0.3;
 slur_interstaff_slope_damping = 0.6;
@@ -122,9 +155,17 @@ tie_staffspace_length = 4.0 * \interline;
 % ugh: rename to bow (in bezier.cc and fonts.doc too...)
 % slur_thickness = 1.8 * \staffline;
 slur_thickness = 1.4 * \staffline;
+
+%{
+ Specifies the maximum height of slurs.
+%}
 slur_height_limit = \staffheight;
 
 
+%{
+Specifes the ratio of slur hight to slur width
+to aim for.  Default value is 0.3. 
+%}
 
 % slur_ratio = 0.3;
 % try bit flatter slurs
@@ -142,8 +183,8 @@ rulethickness = \staffline;
 
 gourlay_energybound = 100000.;
 %{
-The following bounds the number of measures
-on a line.  Decreasing it greatly reduces computation time
+Maximum number of measures per line to try when using Gourlay
+method. Decreasing this greatly reduces computation time.  
 %}
 gourlay_maxmeasures = 10.;
 castingalgorithm = \Gourlay;
index 24a6f8c066a3ba6c0b2342d183ee6ad69432163d..a8a404f0556ae65817c6b97092aecaa2264c68ef 100644 (file)
@@ -95,11 +95,11 @@ beampostraditional =
 
 
 slurnormal = 
-       \property Voice.slurdash = ""
+       \property Voice.slurDash = ""
 
 
 slurdotted = 
-       \property Voice.slurdash = 1
+       \property Voice.slurDash = 1
 
 
 tupletoff = {
diff --git a/ly/spanners.ly b/ly/spanners.ly
new file mode 100644 (file)
index 0000000..bf8cafc
--- /dev/null
@@ -0,0 +1,7 @@
+
+
+% 1st arg dynamic (louder/softer). 2nd arg spantype
+cr = \spanrequest \start "crescendo"
+decr = \spanrequest  \start "decrescendo"
+rc = \spanrequest   \stop "crescendo"
+rced = \spanrequest \stop "decrescendo"
diff --git a/ly/textscripts.ly b/ly/textscripts.ly
new file mode 100644 (file)
index 0000000..0a2942c
--- /dev/null
@@ -0,0 +1,28 @@
+
+%
+% declare the standard dynamic identifiers.
+%
+
+pppppp = \textscript"pppppp" "dynamic" 
+ppppp = \textscript"ppppp" "dynamic"
+pppp = \textscript "pppp" "dynamic"
+ppp = \textscript "ppp" "dynamic"
+pp = \textscript "pp" "dynamic"
+p = \textscript "p" "dynamic"
+mp = \textscript "mp" "dynamic"
+mf = \textscript "mf" "dynamic"
+f = \textscript "e" "dynamic"                  % see feta-din layout
+ff = \textscript "ff" "dynamic"
+fff = \textscript "fff" "dynamic"
+ffff = \textscript "ffff" "dynamic"
+fffff = \textscript "fffff" "dynamic"
+ffffff = \textscript "ffffff" "dynamic"
+fp = \textscript "fp" "dynamic"
+sf = \textscript "sf" "dynamic"
+sff = \textscript "sff" "dynamic"
+sfz = \textscript "sfz" "dynamic"
+fz = \textscript "fz" "dynamic"
+sp = \textscript "sp" "dynamic"
+spp = \textscript "spp" "dynamic"
+rfz = \textscript "rfz" "dynamic"
+
index 37ec490e5dfea542ed062a0b2fbebd7610392f5a..646967f0805d988292a91a310529c75ac5ce6337 100644 (file)
@@ -1,11 +1,11 @@
 Begin3
 Title: LilyPond
-Version: 1.1.64
-Entered-date: 21JUL99
+Version: 1.1.65
+Entered-date: 22JUL99
 Description: 
 LilyPond is a music typesetter.  It produces beautiful sheet music
-using a high level description file as input.  It is part of the GNU
-project.
+using a high level description file as input.  LilyPond is part of 
+the GNU Project.
 
 
 Keywords: music notation typesetting midi fonts engraving
@@ -13,8 +13,8 @@ Author: hanwen@cs.uu.nl (Han-Wen Nienhuys)
        janneke@gnu.org (Jan Nieuwenhuizen)
 Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
 Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
-       1000k lilypond-1.1.64.tar.gz 
+       1000k lilypond-1.1.65.tar.gz 
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-       1000k lilypond-1.1.64.tar.gz 
+       1000k lilypond-1.1.65.tar.gz 
 Copying-policy: GPL
 End
index a9c8b2f62804b332a71b545ebca7057d745b4fe9..f30526e3a344f8290c9ded1022ff889c16260c40 100644 (file)
@@ -1,9 +1,9 @@
 Name: lilypond
-Version: 1.1.64
+Version: 1.1.65
 Release: 1
 Copyright: GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.64.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.65.tar.gz
 Summary: A program for printing sheet music.
 URL: http://www.cs.uu.nl/~hanwen/lilypond
 Packager: Han-Wen Nienhuys <hanwen@cs.uu.nl>
@@ -14,8 +14,8 @@ Prereq: tetex
 %description 
 
 LilyPond is a music typesetter.  It produces beautiful sheet music
-using a high level description file as input.  It is part of the GNU
-project.
+using a high level description file as input.  LilyPond is part of 
+the GNU Project.
 
 
 
index 1ee2457763c8c868ef98c283af2390d289535d84..6dbd46b2d608694d904599340d3069502c86935e 100644 (file)
@@ -10,7 +10,6 @@ copyright =    "public domain";
 \version "1.1.52";
 
 viola1 = \notes \relative c {
-       \context Voice=one
        c'1\ff ~ | c | f,4-. r r2 | r1 |
        % copied 3 bars from three back...
        %5
index 4b960a8acdc33d51827a5af43c0d9591c94972df..ebec60e0ed2c0aa72a5e06ac767c3e9c4add409b 100644 (file)
@@ -13,8 +13,9 @@ viola2 = \notes \relative c {
        % starts on (actualy, most part is on) same staff as viola1
        %urg, parse error
 %urg   \translator Staff=viola1
+       \context Thread
        \translator Staff=violai
-       \context Voice=one
+       \translator Voice=one
        c1 ~ | c | s1*2 |
        % copied 3 bars from three back...
        c ~ | c | s1*2 % |
@@ -36,9 +37,10 @@ $viola2_staff = \context Staff = violaii <
        \property Staff.instrument = "Viola II"
        \property Staff.instr = "Vla. II"
        \clef "alto";
-       \notes \context Voice=one< 
+       % notes must go to Staff context: we want to switch Staff translators
+       %\notes \context Voice=one< 
                \global
                \$viola2
-       >
+       %>
 >
 
index a36b83edf9df57f91a09391e3a547971e5882bee..47308fcf5488a74ffd976661cff7cfbabf33464c 100644 (file)
@@ -373,6 +373,18 @@ if 1:
        conversions.append ((1,1,55), conv,
                            '\\wheel -> \\coda')
 
+if 1:
+       def conv(lines):
+               newlines =[]
+               for x in lines:
+                       x =  re.sub ('keyoctaviation','keyOctaviation', x)
+                       x =  re.sub ('slurdash','slurDash', x)
+                       newlines.append (x)
+               return newlines
+
+       conversions.append ((1,1,65), conv,
+                           'slurdash -> slurDash, keyoctaviation -> keyOctaviation')
+
 
 ############################