]> git.donarmstrong.com Git - lilypond.git/commitdiff
release: 1.1.66 release/1.1.66
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Fri, 23 Jul 1999 09:07:47 +0000 (11:07 +0200)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Fri, 23 Jul 1999 09:07:47 +0000 (11:07 +0200)
50 files changed:
ANNOUNCE-1.2
Documentation/tex/lilypond-regtest.doc
Documentation/tex/reference-manual.yo
NEWS
TODO
VERSION
input/bugs/auto-melismas.ly [new file with mode: 0644]
input/bugs/spacing-very-tight.ly
input/bugs/staccato-quantisation.sly [new file with mode: 0644]
input/praeludium-fuga-E.ly
input/test/abbreviation-beam.sly [deleted file]
input/test/chord-tremolo.sly [new file with mode: 0644]
input/test/force-hshift.fly
input/test/hshift.fly [new file with mode: 0644]
input/test/note-shift.sly [new file with mode: 0644]
lily/abbreviation-beam-engraver.cc [deleted file]
lily/abbreviation-beam.cc [deleted file]
lily/auto-beam-engraver.cc
lily/beam.cc
lily/chord-tremolo-engraver.cc [new file with mode: 0644]
lily/chord-tremolo.cc [new file with mode: 0644]
lily/colhpos.cc [deleted file]
lily/column-x-positions.cc [new file with mode: 0644]
lily/gourlay-breaking.cc
lily/include/abbreviation-beam-engraver.hh [deleted file]
lily/include/abbreviation-beam.hh [deleted file]
lily/include/break.hh
lily/include/chord-tremolo-engraver.hh [new file with mode: 0644]
lily/include/chord-tremolo.hh [new file with mode: 0644]
lily/include/colhpos.hh [deleted file]
lily/include/column-x-positions.hh [new file with mode: 0644]
lily/include/lily-proto.hh
lily/include/line-of-score.hh
lily/include/musical-request.hh
lily/include/paper-score.hh
lily/include/spring-spacer.hh
lily/include/tie-engraver.hh
lily/lexer.ll
lily/melisma-engraver.cc
lily/musical-request.cc
lily/my-lily-lexer.cc
lily/parser.yy
lily/slur-engraver.cc
lily/spring-spacer.cc
lily/tie-engraver.cc
ly/engraver.ly
make/out/lilypond.lsm
make/out/lilypond.spec
mf/GNUmakefile
mutopia/F.Schubert/standchen.ly

index f0246bb97a18049fabd4a915d1650bc615e638c0..ee93a2d658314cd656c654b0da2e1e3536b60f78 100644 (file)
@@ -39,25 +39,26 @@ WHAT'S NEW?
 * Large cleanups, enhanced design and GUILE integration for smaller
   memory footprint and more flexible code.
 
-* Direct output to PostScript (optional), PDFTeX or as GUILE script.
+* Direct output to PostScript (optional), PDFTeX or as GUILE script
+  (default output still to plain TeX).
 
-* convertors for ABC and MUP formats.
+* Convertors for ABC and MUP formats.
 
-* Font: now available as scaleable PostScript.  New glyphs: time
+* Font: now available as scalable PostScript.  New glyphs: time
   signature, more note heads.
 
 * Enhanced input: semi-automatic beaming, (nested) tuplets, (nested)
   repeats, automatic staff switching, chordnames, automatic Lyrics
   durations.
   
-* Grace notes, volta brackets, better spacing, multiple styles for
-  note heads and time signatures, breathing signs, lyric extenders,
-  cross staff beaming and slurring.
+* Grace notes, volta brackets, multiple styles for note heads and 
+  time signatures, breathing signs, lyric extenders, cross staff 
+  beaming and slurring.
   
-* --safe option for the paranoid
+* --safe option for the paranoid.
 
 * More elegant spacing.  Text is spaced exactly.
 
-* lots of bugfixes
+* Lots of bugfixes.
 
 
index 8286332d3d8c01a3ca19125bfe74d47bc6a04823..58595717403f3d2d2779a1f111434deabe973850 100644 (file)
@@ -1,4 +1,4 @@
-% -*-LaTeX-*-
+% -*-LaTeX-*-  vim:tw=72
 \documentclass{article}
 
 \title{LilyPond feature test}
@@ -49,12 +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}
+Chord tremolos look like beams, but are a kind of repeat symbol.
+To avoid confusion, chord tremolo beams do not reach the stems, but 
+leave a gap.  Chord tremolo beams on half notes are not ambiguous,
+as half notes cannot appear in a regular beam, and should reach the 
+stems.
+  
+\mudelafile{chord-tremolo.sly}
 
 Beams, stems and noteheads often have communication troubles, since
 the two systems for y dimensions (1 unit = staffspace, 1 unit = 1
@@ -166,11 +167,12 @@ Folded.  This doesn't make sense without alternatives, but it works.
 Lyrics can be set to a melody automatically.  Excess lyrics will be
 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.
+automaticMelismas (which will set melismas during slurs and ties).  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}
 
@@ -182,13 +184,19 @@ inside the staff, and by half spaces outside.  Notice that the half
 and whole rests just outside the staff get ledger lines in different
 cases.
 
-\mudelafile{rest-collision.ly}
+% \m udelafile{rest-collision.ly}
 
 Normal collisions. We have support for four voice polyphony, where the
 middle voices are horizontally shifted in a limited number of cases.
 
 \mudelafile{collisions.ly}
 
+In some cases, collisions may be hairy to resolve, or the typesetter
+may have special whishes.  For those special cases, note shifts can be 
+set by hand.
+
+\mudelafile{note-shift.sly}
+
 The number of stafflines of a staff can be set with the property
 numberOfStaffLines.  Ledger lines both on note heads and rests are
 adjusted.  Barlines also are adjusted.
index 836bd1f2f862de4956fc6217c52c6463f1882bdc..a82396c82f7a638aea54a5ca696bb9c0ee86f080 100644 (file)
@@ -62,7 +62,12 @@ includefile(html-disclaimer.yo-urg)
 )
 
 
-This document describes the the GNU LilyPond input format, which is a
+
+sect(Overview)
+
+
+This bind(document)footnote(This document was revised for LilyPond
+1.2.)  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
@@ -70,59 +75,60 @@ 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. 
+Mudela is a language that allows you  to
+itemize(
+it() create musical expressions by combining pitches, durations to
+it() output those musical expressions to various formats
+it() give those musical expressions and output definitions names, so
+you can enter them in manageable chunks.
+)
 
-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
-point of view.
+Mudela aims to be a language that defines a piece of music completely
+both for typesetting and for a performance point of view.
 
-The Musical Definition Language (Mudela), has a logical structure,
-making use of identifiers, that allows for flexible input, and
-definition reuse. See the documentation file file(MANIFESTO), included
-with the LilyPond sources for reasons and design considerations.
+sect(General syntax)
 
+The percent sign introduces line comments.
 
-sect(Running LilyPond)
+The syntax for most constructions follows this pattern: A keyword that
+is the name of the construction, followed by a list of items, which is
+enclosed in braces, e.g. a paper block looks like this
+verb(\paper {
+  linewidth = 14.0 \cm;          % one item
+  indent = \linewidth / 12.0 ;   % another one.
+})
 
+Keywords are prefixed by a backslash. Words without backslashes are
+strings, like ``linewidth'' in the above example.  When you do an
+assigment, the left hand side is a string, the name name of the
+identifier you wish to assign to.  When you refer to an identifier,
+you must put a backslash before the name, like in second item of the
+example.
 
-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(
+sect(Music expressions)
 
-)verb(\score {
-  \notes\relative c {
-    \input "yourfile.fly"
-  }
-  \paper{}
-  \midi{}
-})
-If you invoke LilyPond with a file file(foo.)var(ext) that doesn't
-have the file(.ly) extension then LilyPond will look for a file called
-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.
+Music in mudela is entered as a music expression.  Notes, rests, lyric
+syllables are music expressions (the atomic expressions), and you can
+combine music expressions to form new music expressions.  This example
+forms a compound expressions out of the quarter code(c)   note and a
+code(d) note:COMMENT(
 
-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).
+)verb(\sequential { c4 d4 })COMMENT(
 
+)The meaning of this compound expression is to play the code(c) first,
+and then the code(d) (as opposed to playing them simultaneously, for
+instance).
 
+We shall first review how to make atomic music expressions, and then
+how to make compound expressions.
 
-sect(Syntax)
+subsect(Atomic music expressions)
 
+subsect(Composition music expressions)
 
 
 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
@@ -160,8 +166,7 @@ dit(dimension) Consists of a real followed by one of the dimension
 keywords: code(\mm), code(\pt), code(\in), or code(\cm).  Dimensions
 are converted immediately to a real which gives the dimension in
 points, so they can be mixed with reals, but the result is no longer
-of type dimension.  The keywords that require a dimension
-(code(\shape)).
+of type dimension.  
 
 dit(pitch) 
 A pitch is a string which is the name of a pitch.  Example: code(a).
@@ -237,7 +242,7 @@ verb(foo = \paper{ linewidth = 6.0\in; }
   \paper{ \foo }
 })
 If code(\foo) is used here without the surrounding code(\paper) then
-an error will result.  Note however that the following is acceptible
+an error will result.  Note however that the following is acceptable
 verb(foo = \notes { ... }
 \score{ \foo })  
 It is not necessary to specify code(\notes).
@@ -245,7 +250,7 @@ It is not necessary to specify code(\notes).
 Identifiers can be set equal to integers, reals, strings, music,
 durations (specified with code(\duration)), note ornaments (specified
 with code(\script), dynamics commands, or code(:)), note name tables
-(specified with code(\notenames), translator definitions, the
+(specified with code(\notenames)), translator definitions, the
 code(\paper) block, the code(\midi) block or the code(\score) block.
 When identifiers are used for translators, the code(\paper),
 code(\midi), and code(\score) blocks, they may only be referred to as
@@ -622,13 +627,19 @@ 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.  
-
+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. 
+  
 mudela(fragment,verbatim,center)(
-c'2:8 c':32 c'
-))
-
+  c'2:8 c':32 [:16 e'1 g'] [:8 e'4 f']
+)
+  
+mudela(fragment,verbatim,center)(
+  c'4:32 [:16 c'8 d'8]
+)
 
 sect(Other Ways to Enter Pitches)
 
@@ -653,19 +664,32 @@ catalan.ly     do  re  mi  fa  sol la  sid si  -d/-s       -b)
 subsect(Relative Pitch Specification)
 label(relative)
 
-One very common error when entering music is to place notes in the wrong
-octave.  One way to avoid being confused by large numbers of octave changing
-marks is to use
-the code(\relative) keyword. 
-Music which appears within code(\relative) is
-interpreted differently.  The octave of a note is determined by making it as
-close to the previous note as possible.  The octave changing marks code(') and
-code(,) can then be added to raise or lower this note by octaves.  You have to
-specify a starting pitch because the first note of a list has no predecessor.  
+A very common mistake when entering music is to place a note in the wrong
+octave.  One can easily get confused by the large numbers of octave changing
+marks in the music.  For most music, a much friendlier way of specifying
+a note's octave is by using the Relative Pitch Specification mode, that is
+introduced by the code(\relative) keyword.  For real world music entry, 
+Relative mode is being used almost exclusively.
+
+The octave of notes that appear in code(\relative) mode is calculated
+differently: The octave of a note depends on the previous note.
+When no octave changing marks are used, the basic interval (without
+accidentals) between two notes is always taken to be equal to or smaller 
+than a quart.  The octave changing marks code(') and code(,) can then be 
+added to raise or lower that interval by octaves.  Upon entering 
+code(\relative) mode, an absolute starting pitch must be specified
+that will act as the predecessor of the first note of the following music.  
+
+Thus, entering scales is straightforward
+
+mudela(fragment,verbatim,center)(
+\relative c' { c d e f g a b c c, }
+)
+
+and octave changing marks are used for intervals greater than a quart.
 
 mudela(fragment,verbatim,center)(
-\relative c'' { c d b c, d b c' d 
-                b c,, d b }
+\relative c'' { c g c f, c' a,, e''' }
 )
 
 When the preceding item is a chord, the first note of the chord is used to
@@ -872,9 +896,9 @@ COMMENT(
        \addlyrics
                \transpose c'' { c4 d8. e16 f2 }
                \context Lyrics \lyrics { do4 re mi fa }
-)
+)COMMENT(
 
-You should use a single rhythm melody, and single rhythm lyrics (a
+)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(
 
@@ -1070,12 +1094,6 @@ request identifier containing the fingering `6' (with neutral direction).
 
 Since this assignment is possible at top-level and within paper, these
 are two conflicts.
-it() A chord followed by
-code(-3)
-can be interpreted as a chord substraction, or as the fingering  `2' (with
-neutral direction)
-it() Similarly code(^2) is a conflict.
- chord_addition '^' ->? 
 it()
 If you do a nested repeat,
 verb (
@@ -1462,8 +1480,7 @@ 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()).
+their parent. In other words, suppose that  the syntax for a music expression is 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.
@@ -1631,6 +1648,9 @@ subsubsubsect(Voice properties)
 
 description(  
 
+dit(code(stemLength)) Set length of stems.  Unit is 
+code(interline)/2, so stemLength defaults to 7.
+
 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.
@@ -1703,11 +1723,12 @@ 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.
 
-dit(code(horizontalNoteShift)) Set to 1 to enable LilyPond to shift notes
+dit(code(horizontalNoteShift)) Enable LilyPond to shift notes
 horizontally if they collide with other notes.  This is useful when
 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.
+defined to enable this.  Traditionally, the outer chords (the upmost
+and downmost voices), should have no horizontalNoteShift. Voice s 
+
 
 dit(code(forceHorizontalShift)) Force horizontal shift for collision
 resolution.  It overrides automatic collision resolution.
@@ -2309,7 +2330,6 @@ COMMENT( The names of these types seem somewhat confusing. )
 The engravers for paper output are:
 
 description(
-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
@@ -2325,6 +2345,7 @@ dit(code(Beam_req_swallow_translator)) Swallows beam requests.  In
 code(LyricVoice).  
 dit(code(Chord_name_engraver)) Engraves chord names.  Normally in
 code(ChordNameVoice) 
+dit(code(Chord_tremolo_engraver))
 dit(code(Clef_engraver)) Engraves the clef symbol.  Normally in code(Staff).
 dit(code(Collision_engraver))
 dit(code(Dot_column_engraver)) Engraves dots on dotted notes shifted to the
@@ -2393,3 +2414,33 @@ dit(code(Swallow_performer))
 )
 
 )
+
+sect(Running LilyPond)
+
+
+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"
+  }
+  \paper{}
+  \midi{}
+})
+If you invoke LilyPond with a file file(foo.)var(ext) that doesn't
+have the file(.ly) extension then LilyPond will look for a file called
+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.footnote(Not entirely true: the status of
+GUILE is kept).
diff --git a/NEWS b/NEWS
index 8ac7d5e991346d0193769e7b66a91a87caa9f02d..a07ce5738abaac163e55171cfc8492b0a36b7af7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,25 @@
+pl 65.hwn1
+       - refman updates
+       - added \simultaneous { } , \sequential { } syntax, for
+consistency.
+
+pl 65.jcn2
+       - bf: if tie then melisma
+
+pl 65.uu1
+       - bf: squashed 2 sr conflicts in parser.
+
+pl 64.jcn2
+       - stanchen almost without " " hacks
+       - if tie then melisma..?
+       - refman updates
+       - Abbreviation.beam -> Chord_tremolo
+       - bf: chord tremolo vs beam over rests
+       - bf: note width for noteless stem 
+
+
+
+********
 pl 64.jcn1
        - resurrected abbreviation beam
        - coriolan fixes
diff --git a/TODO b/TODO
index 2b0fcdc73095e8aa4d301f1394fe7baa0138da14..f922b37570ee8c10c0a6a4d2c659e87fae7526dc 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,20 +1,20 @@
 -*-outline-layout:(2 (-1 -1 0 :) 0);outline-stylish-prefixes:nil -*-
 
 * GNU LilyPond TODO
-Features you cannot find in the doco as working, should be
+Features you cannot find in the documentation as working, should be
 mentioned here.  This is an assorted collection of stuff that will be
-done, might be done, or is an idea that I want to think about
+done, might be done, or is an idea that we want to think about.
 
 Most of the items are marked in the code as well
-Grep for TODO and ugh/ugr/urg.  
+Grep -i for TODO, FIXME and ugh/ugr/urg.  
 
 .* TODO before 1.2
 . * align left edge of broken (de)cresc/slur/tie/tuplet/volta
 . * auto-staff-switching.
+. * staccato-dot placement/quantisation is broken again
 . * warning if feta-nummer.tfm not found
 . * broken examples:
 input/star-spangled-banner.ly: hw?
-mutopia/Coriolan/*
 . * spacing of accidentals
 . * key restorations & repeats
 . * rename \paper?
@@ -75,6 +75,7 @@ one of the spacing bugs mentioned in the TODO.
 . * rhythmic staff & accidentals.
 . * use melismaBusy in Lyric context to typeset melismata correctly.  
 . * ly2dvi/lilypond logfile.
+. * def stem dir.
 . * hang Item on Spanner
 . * do --safe for PS output?
 . * msgfmt -o check?
@@ -214,7 +215,6 @@ typeface. ie. leading is vertical space  --hwn]
 \cadenza , \meter,  should all be \properties
 . * fix singleStaffBracket
 . * rename
-.  * abbreviation-beam -> (measured/unmeasured) tremolo
 .  * partial -> anacrouse
 . * move paper vars into engraver properties
 . * add new glyphs to font.ly
diff --git a/VERSION b/VERSION
index 821fcdaf7394f7eb40ad6c2d167e0de8b619681a..4d94b6ae43ab541d07d28e9447a374aff4013180 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,7 +1,7 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=1
-PATCH_LEVEL=65
+PATCH_LEVEL=66
 MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
diff --git a/input/bugs/auto-melismas.ly b/input/bugs/auto-melismas.ly
new file mode 100644 (file)
index 0000000..bafa169
--- /dev/null
@@ -0,0 +1,17 @@
+\score{
+       \addlyrics
+               \context Staff {
+                       \notes\relative c''{ c () d r e f }
+                       \notes\relative c''{ c ~ c r c c }
+               }
+               {
+                       \context Lyrics \lyrics { foo __ bar baz }
+                       \context Lyrics \lyrics { foo __ bar baz }
+               }
+       \paper{
+               \translator{
+                       \VoiceContext
+                       automaticMelismas=1;
+               }
+       }
+}
index c903f74af81233c80246866d0955576af5341feb..fb03b9155f60fc7399a73eadaa5d9f2e5d8a2343 100644 (file)
@@ -1,11 +1,15 @@
-% when tightly spaced, hinterfleisch -> 0 (and not: -> note-width)
-% we need a mininum of about a note-width/interline space before
-% bar line
+% When tightly spaced, hinterfleisch -> 0.
+% Stems may touch the bar lines, opposite stems may touch eachother.
+% We need a mininum of about a note-width/interline space in these
+% situations, so that in tightly spaced music all vertical lines
+% are about equally spaced.
 
-% set rediculously tight
 \score {
-       \notes { \time 2/2; c'2 c'2 \time 2/2; }
-       \paper { linewidth = 2.0 \cm;
-       indent = 0.0;
+       \notes \relative c''{ 
+               r1 e4 f, e' f,
+       }
+       \paper { 
+               linewidth = 25.0 \mm;
+               indent = 0.0\mm;
        }
 }
diff --git a/input/bugs/staccato-quantisation.sly b/input/bugs/staccato-quantisation.sly
new file mode 100644 (file)
index 0000000..1c290a4
--- /dev/null
@@ -0,0 +1,2 @@
+\stemup
+f'-. g-. a-. b-. c-. d-. e-.
index 214795e22d0f853d34a97a648d6adf6ed6a090e0..896184b5d0c56adf4bc0735c4d1e2987e48e6750 100644 (file)
@@ -112,23 +112,34 @@ fugaII_right = \notes   \relative c''   {
     \context Voice = VA { \stemup [b8 fis8] b4 }
     \context Voice = VB {  \stemdown fis2 }
   >
-   %{ this chord is usually set like this:
-        |
-       x|| 
-        x||
-         x|
-      |x
-      |
-   %}
-   \context Staff <
-     { \stemup \shiftoff e4 }
-     { \stemup \shifton cis }
-     { \stemup \shifton ais }
-     { \stemdown fis }
-   > |
-  %16
-  \context Staff <
-    \context VoiceOne {  dis2 dis4 |
+
+  % Wadieuw
+  \context Staff \notes\relative c''<
+       \context Voice=one {
+         \property Voice.horizontalNoteShift=0
+         \property Voice.verticalDirection=1 
+         e4 
+       }
+       \context Voice=two {
+         \property Voice.verticalDirection=1 
+         \property Voice.horizontalNoteShift=1
+         cis
+       }
+       \context Voice=three {
+         \property Voice.horizontalNoteShift=2
+         \property Voice.verticalDirection=1 
+         ais
+       }
+       \context Voice=four {
+         \property Voice.verticalDirection=-1 
+         \property Voice.horizontalNoteShift=-1
+         fis
+       }
+  >
+
+    %16
+    \context Staff <
+      \context VoiceOne {  dis2 dis4 |
       cis2 cis4 |
       b4. [cis8 dis e] }
     \context VoiceThree {  \stemup \shifton [b8 fis] b2 ~ |
diff --git a/input/test/abbreviation-beam.sly b/input/test/abbreviation-beam.sly
deleted file mode 100644 (file)
index 88cc140..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-[:16 c'1 d]
-[:8 c2 d]
-[:16 c4 d]
-[:32 c16 d]
-[:32 c16 d]
-[:16 c8 d]
diff --git a/input/test/chord-tremolo.sly b/input/test/chord-tremolo.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]
index 9bdee7d1e515c157d55538ce1a13bb3bc690cfb9..06c92d55fe5ed8324438e83fbd936eefe37c5715 100644 (file)
@@ -2,13 +2,16 @@
 \context Staff <
        \context Voice = VA {
                \property Voice.forceHorizontalShift = "0.1"
-               \stemup \shifton
+               % \stemup \shifton
+               \property Voice.verticalDirection=1 
+                       \property Voice.horizontalNoteShift=1
                <g' d'>
        }       
 
        \context Voice = VB {
-               \stemdown
-               \shifton
+               %\stemdown \shifton
+               \property Voice.verticalDirection=-1 
+                       \property Voice.horizontalNoteShift=1
                \property Voice.forceHorizontalShift = "-0.1"
                <bes f'>
        }
diff --git a/input/test/hshift.fly b/input/test/hshift.fly
new file mode 100644 (file)
index 0000000..5545874
--- /dev/null
@@ -0,0 +1,8 @@
+
+\context Staff <
+       \context Voice =VA  {\stemup \property Voice.horizontalNoteShift = 0 g'' }
+       \context Voice =VB  {\stemup \property Voice.horizontalNoteShift = 1 e }
+       \context Voice =VC  {\stemup \property Voice.horizontalNoteShift = 2 c }
+       \context Voice =VD  {\stemup \property Voice.horizontalNoteShift = 3 a }
+       \context Voice =VE  {\stemup \property Voice.horizontalNoteShift = 4 f }
+>
diff --git a/input/test/note-shift.sly b/input/test/note-shift.sly
new file mode 100644 (file)
index 0000000..645baea
--- /dev/null
@@ -0,0 +1,23 @@
+\context Staff \notes\relative c''<
+     \context Voice=one {
+       \property Voice.horizontalNoteShift=0
+       \property Voice.verticalDirection=1 
+       e4 
+     }
+     \context Voice=two {
+       \property Voice.verticalDirection=1 
+       \property Voice.horizontalNoteShift=1
+       cis
+     }
+     \context Voice=three {
+       \property Voice.horizontalNoteShift=2
+       \property Voice.verticalDirection=1 
+       ais
+     }
+     \context Voice=four {
+       \property Voice.verticalDirection=-1 
+       \property Voice.horizontalNoteShift=-1
+       fis
+     }
+>
+
diff --git a/lily/abbreviation-beam-engraver.cc b/lily/abbreviation-beam-engraver.cc
deleted file mode 100644 (file)
index d264169..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
-  abbreviation-beam-engraver.cc -- implement Abbreviation_beam_engraver
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-           Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-
-#include "duration-convert.hh"
-#include "time-description.hh"
-#include "abbreviation-beam-engraver.hh"
-#include "stem.hh"
-#include "abbreviation-beam.hh"
-#include "musical-request.hh"
-#include "misc.hh"
-#include "warn.hh"
-#include "score-engraver.hh"
-
-ADD_THIS_TRANSLATOR (Abbreviation_beam_engraver);
-
-Abbreviation_beam_engraver::Abbreviation_beam_engraver ()
-{
-  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* 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 ()
-{
-  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 (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 (reqs_drul_[START])
-    {
-      if (abeam_p_)
-       {
-         reqs_drul_[START]->warning (_ ("Already have an abbreviation beam"));
-         return;
-       }
-
-      prev_start_req_ = reqs_drul_[START];
-
-      abeam_p_ = new Abbreviation_beam;
-      announce_element (Score_element_info (abeam_p_, reqs_drul_[LEFT]));
-  }
-}
-
-void
-Abbreviation_beam_engraver::do_post_move_processing ()
-{
-  reqs_drul_ [START] = 0;
-}
-
-void
-Abbreviation_beam_engraver::do_pre_move_processing ()
-{
-  typeset_beam ();
-}
-
-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_)
-    {
-      prev_start_req_->warning (_ ("Unfinished abbreviation beam"));
-      finished_abeam_p_ = abeam_p_;
-      typeset_beam ();
-    }
-}
-
-void
-Abbreviation_beam_engraver::acknowledge_element (Score_element_info i)
-{
-  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);
-       }
-    }
-}
diff --git a/lily/abbreviation-beam.cc b/lily/abbreviation-beam.cc
deleted file mode 100644 (file)
index b0307f2..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-  abbreviation-beam.cc -- implement Abbreviation_beam
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-          Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-
-#include "paper-column.hh"
-#include "array.hh"
-#include "proto.hh"
-#include "abbreviation-beam.hh"
-#include "misc.hh"
-#include "debug.hh"
-
-#include "molecule.hh"
-#include "leastsquares.hh"
-#include "stem.hh"
-#include "paper-def.hh"
-#include "lookup.hh"
-#include "stem-info.hh"
-
-
-
-
-Abbreviation_beam::Abbreviation_beam ()
-  : Beam ()
-{
-}
-
-Molecule*
-Abbreviation_beam::do_brew_molecule_p () const 
-{
-  return Beam::do_brew_molecule_p ();
-}
-
-void
-Abbreviation_beam::do_print () const
-{
-#ifndef NPRINT
-  Beam::do_print ();
-  Spanner::do_print ();
-#endif
-}
-
-/*
-  beams to go with one stem.
-  */
-Molecule
-Abbreviation_beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
-{
-  /* 
-   todo
-    - shorter beams (not reaching outer "stems") 
-      for [:16 c4 c4] and [:16 c1 c1]
-    - centered beam on [:16 c1 c1] heads, rather than "stems"
-   */
-  return Beam::stem_beams (here, next, prev);
-}
index c539e883c6391067b29481e2d5f7183d344a75fc..550fbd652a185c0381231346e474f49e99852754 100644 (file)
@@ -11,7 +11,7 @@
 #include "musical-request.hh"
 #include "bar.hh"
 #include "beam.hh"
-#include "abbreviation-beam.hh"
+#include "chord-tremolo.hh"
 #include "rest.hh"
 #include "stem.hh"
 #include "debug.hh"
@@ -299,7 +299,7 @@ Auto_beam_engraver::acknowledge_element (Score_element_info info)
        {
          junk_beam ();
        }
-      else if (Abbreviation_beam *b = dynamic_cast<Abbreviation_beam*> (info.elem_l_))
+      else if (Chord_tremolo *b = dynamic_cast<Chord_tremolo*> (info.elem_l_))
        {
          junk_beam ();
        }
index 64448f2450ab50c96b7dd5e2a1f3cea71212b8a2..ad751ac71ceebfe1a610669a6f90c40946ae8e4a 100644 (file)
@@ -24,6 +24,7 @@ needs what, and what information should be available when.
 
 #include <math.h>
 
+#include "chord-tremolo.hh"
 #include "new-beaming.hh"
 #include "proto.hh"
 #include "dimensions.hh"
@@ -341,11 +342,14 @@ 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
+      /*
+       Chord tremolo needs to beam over invisible stems of wholes
+      */
+      if (!dynamic_cast<Chord_tremolo*> (this))
+       {
+         if (s->invisible_b ())
+           continue;
+       }
 
       Stem_info info (s, multiple_i_);
       if (leftx == 0)
@@ -667,7 +671,9 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
 
   // UGH
   Real nw_f;
-  if (here->type_i ()== 1)
+  if (!here->head_l_arr_.size ())
+    nw_f = 0;
+  else 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;
diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc
new file mode 100644 (file)
index 0000000..d41c818
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+  abbreviation-beam-engraver.cc -- implement Chord_tremolo_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+           Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#include "duration-convert.hh"
+#include "time-description.hh"
+#include "chord-tremolo-engraver.hh"
+#include "stem.hh"
+#include "chord-tremolo.hh"
+#include "musical-request.hh"
+#include "misc.hh"
+#include "warn.hh"
+#include "score-engraver.hh"
+
+ADD_THIS_TRANSLATOR (Chord_tremolo_engraver);
+
+Chord_tremolo_engraver::Chord_tremolo_engraver ()
+{
+  reqs_drul_[LEFT] = reqs_drul_[RIGHT] = 0;
+  abeam_p_ = 0;
+  finished_abeam_p_ = 0;
+  prev_start_req_ = 0;
+}
+
+bool
+Chord_tremolo_engraver::do_try_music (Music* m)
+{
+  if (Chord_tremolo_req* b = dynamic_cast <Chord_tremolo_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
+Chord_tremolo_engraver::do_process_requests ()
+{
+  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 (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 (reqs_drul_[START])
+    {
+      if (abeam_p_)
+       {
+         reqs_drul_[START]->warning (_ ("Already have an abbreviation beam"));
+         return;
+       }
+
+      prev_start_req_ = reqs_drul_[START];
+
+      abeam_p_ = new Chord_tremolo;
+      announce_element (Score_element_info (abeam_p_, reqs_drul_[LEFT]));
+  }
+}
+
+void
+Chord_tremolo_engraver::do_post_move_processing ()
+{
+  reqs_drul_ [START] = 0;
+}
+
+void
+Chord_tremolo_engraver::do_pre_move_processing ()
+{
+  typeset_beam ();
+}
+
+void
+Chord_tremolo_engraver::typeset_beam ()
+{
+  if (finished_abeam_p_)
+    {
+      typeset_element (finished_abeam_p_);
+      finished_abeam_p_ = 0;
+
+      reqs_drul_[STOP] = 0;
+    }
+}
+
+void
+Chord_tremolo_engraver::do_removal_processing ()
+{
+  typeset_beam ();
+  if (abeam_p_)
+    {
+      prev_start_req_->warning (_ ("Unfinished abbreviation beam"));
+      finished_abeam_p_ = abeam_p_;
+      typeset_beam ();
+    }
+}
+
+void
+Chord_tremolo_engraver::acknowledge_element (Score_element_info i)
+{
+  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);
+       }
+    }
+}
diff --git a/lily/chord-tremolo.cc b/lily/chord-tremolo.cc
new file mode 100644 (file)
index 0000000..fe743fa
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+  abbreviation-beam.cc -- implement Chord_tremolo
+
+  source file of the GNU LilyPond music typesetter
+
+  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+          Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#include "paper-column.hh"
+#include "array.hh"
+#include "proto.hh"
+#include "chord-tremolo.hh"
+#include "misc.hh"
+#include "debug.hh"
+
+#include "molecule.hh"
+#include "leastsquares.hh"
+#include "stem.hh"
+#include "paper-def.hh"
+#include "lookup.hh"
+#include "stem-info.hh"
+
+
+
+
+Chord_tremolo::Chord_tremolo ()
+  : Beam ()
+{
+}
+
+Molecule*
+Chord_tremolo::do_brew_molecule_p () const 
+{
+  return Beam::do_brew_molecule_p ();
+}
+
+void
+Chord_tremolo::do_print () const
+{
+#ifndef NPRINT
+  Beam::do_print ();
+  Spanner::do_print ();
+#endif
+}
+
+/*
+  beams to go with one stem.
+  */
+Molecule
+Chord_tremolo::stem_beams (Stem *here, Stem *next, Stem *prev) const
+{
+  /* 
+   todo
+    - shorter beams (not reaching outer "stems") 
+      for [:16 c4 c4] and [:16 c1 c1]
+    - centered beam on [:16 c1 c1] heads, rather than "stems"
+   */
+  return Beam::stem_beams (here, next, prev);
+}
diff --git a/lily/colhpos.cc b/lily/colhpos.cc
deleted file mode 100644 (file)
index f23646c..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-  colhpos.cc -- implement Column_x_positions
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-#include "colhpos.hh"
-#include "real.hh"
-#include "debug.hh"
-#include "vector.hh"
-#include "line-spacer.hh"
-
-Column_x_positions::Column_x_positions()
-{
-  energy_f_ = infinity_f;
-  satisfies_constraints_b_ = false;
-  spacer_l_ =0;
-}
-
-Column_x_positions::~Column_x_positions()
-{
-
-}
-
-void
-Column_x_positions::add_paper_column (Paper_column*c)
-{
-  cols_.push (c);
-}
-
-void
-Column_x_positions::print() const
-{
-#ifndef NPRINT
-  DOUT << "energy : " << energy_f_ << '\n';
-  DOUT << "line of " << config_.size() << " cols\n";
-  Vector v (config_);
-  DOUT << v;
-#endif
-}
-
-void
-Column_x_positions::OK() const
-{
-#ifndef NDEBUG
-  assert (config_.size() == cols_.size ());
-#endif
-}
-
-void
-Column_x_positions::set_stupid_solution(Vector v)
-{
-  energy_f_ = infinity_f;
-  config_ = v;
-}
-
-void
-Column_x_positions::stupid_solution()
-{
-  set_stupid_solution (spacer_l_->default_solution());
-}
-
-void
-Column_x_positions::solve_line() 
-{
-  spacer_l_->solve (this);
-}
-
-
-void
-Column_x_positions::approximate_solve_line() 
-{
-  spacer_l_->lower_bound_solution (this);
-}
-
-
diff --git a/lily/column-x-positions.cc b/lily/column-x-positions.cc
new file mode 100644 (file)
index 0000000..894844d
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+  colhpos.cc -- implement Column_x_positions
+
+  source file of the GNU LilyPond music typesetter
+
+  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+#include "column-x-positions.hh"
+#include "real.hh"
+#include "debug.hh"
+#include "vector.hh"
+#include "line-spacer.hh"
+
+Column_x_positions::Column_x_positions()
+{
+  energy_f_ = infinity_f;
+  satisfies_constraints_b_ = false;
+  spacer_l_ =0;
+}
+
+Column_x_positions::~Column_x_positions()
+{
+
+}
+
+void
+Column_x_positions::add_paper_column (Paper_column*c)
+{
+  cols_.push (c);
+}
+
+void
+Column_x_positions::print() const
+{
+#ifndef NPRINT
+  DOUT << "energy : " << energy_f_ << '\n';
+  DOUT << "line of " << config_.size() << " cols\n";
+  Vector v (config_);
+  DOUT << v;
+#endif
+}
+
+void
+Column_x_positions::OK() const
+{
+#ifndef NDEBUG
+  assert (config_.size() == cols_.size ());
+#endif
+}
+
+void
+Column_x_positions::set_stupid_solution(Vector v)
+{
+  energy_f_ = infinity_f;
+  config_ = v;
+}
+
+void
+Column_x_positions::stupid_solution()
+{
+  set_stupid_solution (spacer_l_->default_solution());
+}
+
+void
+Column_x_positions::solve_line() 
+{
+  spacer_l_->solve (this);
+}
+
+
+void
+Column_x_positions::approximate_solve_line() 
+{
+  spacer_l_->lower_bound_solution (this);
+}
+
+
index cc494cfa8896f26b44de7bbad0feddf99547ef2b..382548592dd0f6c52892fd83b4264825f166bfcb 100644 (file)
@@ -7,7 +7,7 @@
 */
 
 #include "gourlay-breaking.hh"
-#include "colhpos.hh"
+#include "column-x-positions.hh"
 #include "spring-spacer.hh"
 #include "debug.hh"
 #include "paper-column.hh"
diff --git a/lily/include/abbreviation-beam-engraver.hh b/lily/include/abbreviation-beam-engraver.hh
deleted file mode 100644 (file)
index d361059..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
-  abbreviation-beam-engraver.hh -- declare Abbreviation_beam_engraver
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-          Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-
-
-#ifndef ABBREVIATION_BEAM_ENGRAVER_HH
-#define ABBREVIATION_BEAM_ENGRAVER_HH
-
-#include "engraver.hh"
-#include "drul-array.hh"
-
-/**
-  Generate an abbreviation beam.  Eat stems.
- */
-class Abbreviation_beam_engraver : public Engraver
-{
-public:
-  VIRTUAL_COPY_CONS(Translator);
-  
-
-  Abbreviation_beam_engraver();
-
-protected:
-  virtual void do_removal_processing();
-  virtual void do_process_requests();
-  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:
-  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
diff --git a/lily/include/abbreviation-beam.hh b/lily/include/abbreviation-beam.hh
deleted file mode 100644 (file)
index 3d1b45a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-  abbreviation-beam-engraver.hh -- declare Abbreviation_beam_engraver
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-          Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-
-#ifndef ABBREVIATION_BEAM_HH
-#define ABBREVIATION_BEAM_HH
-
-#include "beam.hh"
-
-/** a beam connects multiple stems Beam adjusts the stems its owns to
-  make sure that they reach the beam and that point in the correct
-  direction */
-class Abbreviation_beam : public Beam {
-public:
-  
-
-  Abbreviation_beam();
-
-  VIRTUAL_COPY_CONS(Score_element);
-
-protected:
-  virtual void do_print() const;
-  virtual Molecule stem_beams (Stem *here, Stem *next, Stem *prev) const;
-  virtual Molecule* do_brew_molecule_p() const;
-};
-
-#endif // ABBREVIATION_BEAM_HH
-
index f2b9d9df909072a685e4fa607b720a1084606b6f..c6654fa8f04d2887aa719ad739d7d6d345466141 100644 (file)
@@ -12,7 +12,7 @@
 #include "array.hh"
 #include "interval.hh"
 #include "lily-proto.hh"
-#include "colhpos.hh"
+#include "column-x-positions.hh"
 
 /**
   Statistics for the number of columns calced.
diff --git a/lily/include/chord-tremolo-engraver.hh b/lily/include/chord-tremolo-engraver.hh
new file mode 100644 (file)
index 0000000..3616779
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+  chord-tremolo-engraver.hh -- declare Chord_tremolo_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+          Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+
+#ifndef Chord_tremolo_ENGRAVER_HH
+#define Chord_tremolo_ENGRAVER_HH
+
+#include "engraver.hh"
+#include "drul-array.hh"
+
+/**
+  Generate an abbreviation beam.  Eat stems.
+ */
+class Chord_tremolo_engraver : public Engraver
+{
+public:
+  VIRTUAL_COPY_CONS(Translator);
+  
+
+  Chord_tremolo_engraver();
+
+protected:
+  virtual void do_removal_processing();
+  virtual void do_process_requests();
+  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:
+  void typeset_beam ();
+  Drul_array<Chord_tremolo_req*> reqs_drul_;
+  Chord_tremolo_req* prev_start_req_;
+  Chord_tremolo* abeam_p_;
+  Chord_tremolo* finished_abeam_p_;
+};
+
+#endif // Chord_tremolo_ENGRAVER_HH
diff --git a/lily/include/chord-tremolo.hh b/lily/include/chord-tremolo.hh
new file mode 100644 (file)
index 0000000..eb2d133
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+  chord-tremolo-engraver.hh -- declare Chord_tremolo_engraver
+
+  source file of the GNU LilyPond music typesetter
+
+  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+          Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#ifndef Chord_tremolo_HH
+#define Chord_tremolo_HH
+
+#include "beam.hh"
+
+/** a beam connects multiple stems Beam adjusts the stems its owns to
+  make sure that they reach the beam and that point in the correct
+  direction */
+class Chord_tremolo : public Beam {
+public:
+  
+
+  Chord_tremolo();
+
+  VIRTUAL_COPY_CONS(Score_element);
+
+protected:
+  virtual void do_print() const;
+  virtual Molecule stem_beams (Stem *here, Stem *next, Stem *prev) const;
+  virtual Molecule* do_brew_molecule_p() const;
+};
+
+#endif // Chord_tremolo_HH
+
diff --git a/lily/include/colhpos.hh b/lily/include/colhpos.hh
deleted file mode 100644 (file)
index 98b808a..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-  colhpos.hh -- part of GNU LilyPond
-
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-#ifndef COLHPOS_HH
-#define COLHPOS_HH
-
-#include "parray.hh"
-#include "lily-proto.hh"
-
-typedef Link_array<Paper_column>  Line_of_cols;
-
-struct Column_x_positions {
-  Line_spacer * spacer_l_;
-  Line_of_cols cols_;
-  Array<Real> config_;
-  
-  Real energy_f_;
-  bool satisfies_constraints_b_;
-
-  void OK() const;
-  ~Column_x_positions();
-  void solve_line();
-  void approximate_solve_line();
-  /** generate a solution with no regard to idealspacings or
-    constraints.  should always work */
-  void stupid_solution();
-  void set_stupid_solution (Vector);
-  Column_x_positions();
-  void add_paper_column (Paper_column*c);
-  void print() const;
-};
-
-
-#endif // COLHPOS_HH
-
diff --git a/lily/include/column-x-positions.hh b/lily/include/column-x-positions.hh
new file mode 100644 (file)
index 0000000..254ae88
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+  column-x-positions.hh -- part of GNU LilyPond
+
+  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+#ifndef COLUMN_X_POSITIONS_HH
+#define COLUMN_X_POSITIONS_HH
+
+#include "parray.hh"
+#include "lily-proto.hh"
+
+typedef Link_array<Paper_column>  Line_of_cols;
+
+struct Column_x_positions {
+  Line_spacer * spacer_l_;
+  Line_of_cols cols_;
+  Array<Real> config_;
+  
+  Real energy_f_;
+  bool satisfies_constraints_b_;
+
+  void OK() const;
+  ~Column_x_positions();
+  void solve_line();
+  void approximate_solve_line();
+  /** generate a solution with no regard to idealspacings or
+    constraints.  should always work */
+  void stupid_solution();
+  void set_stupid_solution (Vector);
+  Column_x_positions();
+  void add_paper_column (Paper_column*c);
+  void print() const;
+};
+
+
+#endif // COLUMN_X_POSITIONS_HH
+
index e360dbfa6255cb09ebbb9f7357660f4891165d0f..dd2cd050f9ef14bfef423119af867fd398840b35 100644 (file)
@@ -12,9 +12,6 @@
 
 
 
-struct Abbreviation_beam; 
-struct Abbreviation_beam_engraver;
-struct Abbreviation_beam_req;
 struct Absolute_dynamic_req;
 struct Adobe_font_char_metric;
 struct Adobe_font_metric;
@@ -58,6 +55,9 @@ struct Bracket_req;
 struct Break_align_item;
 struct Break_req;
 struct CHyphen_req;
+struct Chord_tremolo; 
+struct Chord_tremolo_engraver;
+struct Chord_tremolo_req;
 struct Cadenza_req;
 struct Change_iterator;
 struct Change_translator;
index 6cf5efbfaea3d61dac7d2707d5d2d77726f9f5ec..d80ae6b1e28816c14b24a24c34a4e7e98a93b406 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef SCORELINE_HH
 #define SCORELINE_HH
 
-#include "colhpos.hh"
+#include "column-x-positions.hh"
 #include "axis-group-spanner.hh"
 #include "super-element.hh"
 
index 8f380e9a0462e934a8ade9d0c6191f1de7264289..cf583c1b99556ebb3b047630071d65d3a58bdf4d 100644 (file)
@@ -168,12 +168,12 @@ public:
 };
 /** 
  Start / stop an abbreviation beam. */
-class Abbreviation_beam_req : public Span_req  
+class Chord_tremolo_req : public Span_req  
 {
 public:
   VIRTUAL_COPY_CONS (Music);
 
-  Abbreviation_beam_req ();
+  Chord_tremolo_req ();
 
   virtual void do_print () const;
 
index e27fe7294366f270952b488d79fadca1bb212643..c17afddfee42bd25c3ede20dbd29902cc3bf2d2f 100644 (file)
@@ -10,7 +10,7 @@
 #ifndef P_SCORE_HH
 #define P_SCORE_HH
 
-#include "colhpos.hh"
+#include "column-x-positions.hh"
 #include "parray.hh"
 #include "lily-proto.hh"
 #include "music-output.hh"
index 354b664fb6fab29310953ebc9ac06c30a6b00c94..ffab17f066a23bf43a690d7963825ab67c0f39a2 100644 (file)
@@ -13,7 +13,7 @@
 #include "line-spacer.hh"
 #include "cons.hh"
 #include "col-info.hh"
-#include "colhpos.hh"
+#include "column-x-positions.hh"
 #include "moment.hh"
 
 
index 448ed172305470314961f3b31213b762ee5e76d9..7246d0e4f81ebda0bac1515a966334b4c168b813 100644 (file)
@@ -44,6 +44,7 @@ class Tie_engraver : public Engraver
   Array<CHead_melodic_tuple> stopped_heads_;
   Link_array<Tie> tie_p_arr_;
   
+  void set_melisma (bool);
 protected:
   virtual void do_post_move_processing ();
   virtual void do_pre_move_processing ();
index 472f2d0c49f2d4ac58d474e12a61022f90681387..4fa1396533e67b1e81a6d8c08177cdaa8c39c248 100644 (file)
@@ -327,6 +327,12 @@ HYPHEN             --
        \" {
                start_quote ();
        }
+       -  {
+               return CHORD_MINUS;
+       }
+       \^  {
+               return CHORD_CARET;
+       }
        . {
                return yylval.c = YYText ()[0];
        }
index 434fefbc32fa81a433d2c58d19216d18c954602a..6cae059cceef67d578f83d3d2563b4fbd64a76c9 100644 (file)
@@ -26,8 +26,10 @@ Melisma_engraver::do_try_music (Music *m )
 {
   if (dynamic_cast<Melisma_playing_req*>(m))
     {
-      Scalar s (get_property ("melismaBusy", 0));
-      return s.to_bool ();
+      Scalar plain (get_property ("melismaBusy", 0));
+      Scalar slur (get_property ("slurMelismaBusy", 0));
+      Scalar tie (get_property ("tieMelismaBusy", 0));
+      return plain.to_bool () || slur.to_bool () || tie.to_bool ();
     }
   return false;
 }
index c4d8efa4fe212fec3e167c23fbdfac04528f1a43..cedc1ce5e039b145d0a5fb270001582c6da0e218 100644 (file)
@@ -159,13 +159,13 @@ Span_req::Span_req ()
   span_dir_ = CENTER;
 }
 
-Abbreviation_beam_req::Abbreviation_beam_req ()
+Chord_tremolo_req::Chord_tremolo_req ()
 {
   type_i_ = 0;
 }
 
 void
-Abbreviation_beam_req::do_print () const
+Chord_tremolo_req::do_print () const
 {
 #ifndef NPRINT
   DOUT << type_i_;
index 00e55ae4dbbc75c4393ef1eacbda98f49707447f..fb660fb505ab049f3e1f81a31fe997ae7d953c6b 100644 (file)
@@ -22,6 +22,8 @@
 
 static Keyword_ent the_key_tab[]={
   {"spanrequest", SPANREQUEST},
+  {"simultaneous", SIMULTANEOUS},
+  {"sequential", SEQUENTIAL},
   {"accepts", ACCEPTS},
   {"alternative", ALTERNATIVE},
   {"bar", BAR},
index 7a6189007b4c85c3dd1ab08c04b6d1d92664058c..9fc2b7e3f1f52511f6eab0252dd8915a01c01a3e 100644 (file)
@@ -136,6 +136,8 @@ yylex (YYSTYPE *s,  void * v_l)
 %token CLEF
 %token CM_T
 %token CONSISTS
+%token SEQUENTIAL
+%token SIMULTANEOUS
 %token CONSISTSEND
 %token DURATION
 %token EXTENDER
@@ -182,7 +184,7 @@ yylex (YYSTYPE *s,  void * v_l)
 %token VERSION
 
 /* escaped */
-%token E_EXCLAMATION E_SMALLER E_BIGGER E_CHAR
+%token E_EXCLAMATION E_SMALLER E_BIGGER E_CHAR CHORD_MINUS CHORD_CARET 
 
 %type <i>      exclamations questions
 %token <i>     DIGIT
@@ -729,13 +731,23 @@ Music_sequence: '{' Music_list '}'        {
        }
        ;
 
-Sequential_music: '{' Music_list '}'           {
+Sequential_music:
+       SEQUENTIAL '{' Music_list '}'           {
+               $$ = new Sequential_music ($3);
+               $$->set_spot ($3->spot ());
+       }
+       | '{' Music_list '}'            {
                $$ = new Sequential_music ($2);
                $$->set_spot ($2->spot ());
        }
        ;
 
-Simultaneous_music: '<' Music_list '>' {
+Simultaneous_music:
+       SIMULTANEOUS '{' Music_list '}'{
+               $$ = new Simultaneous_music ($3);
+               $$->set_spot ($3->spot ());
+       }
+       | '<' Music_list '>'    {
                $$ = new Simultaneous_music ($2);
                $$->set_spot ($2->spot ());
        }
@@ -931,7 +943,7 @@ abbrev_command_req:
                else
                  THIS->set_abbrev_beam ($3);
 
-               Abbreviation_beam_req* a = new Abbreviation_beam_req;
+               Chord_tremolo_req* a = new Chord_tremolo_req;
                a->span_dir_ = START;
                a->type_i_ = THIS->abbrev_beam_type_i_;
                $$=a;
@@ -946,7 +958,7 @@ abbrev_command_req:
                   }
                else
                  {
-                   Abbreviation_beam_req* a = new Abbreviation_beam_req;
+                   Chord_tremolo_req* a = new Chord_tremolo_req;
                    a->span_dir_ = STOP;
                    a->type_i_ = THIS->abbrev_beam_type_i_;
                    THIS->set_abbrev_beam (0);
@@ -1443,7 +1455,7 @@ chord_additions:
        {
                $$ = new Array<Musical_pitch>;
        } 
-       | '-' chord_notes {
+       | CHORD_MINUS chord_notes {
                $$ = $2;
        }
        ;
@@ -1462,7 +1474,7 @@ chord_subtractions:
        {
                $$ = new Array<Musical_pitch>;
        } 
-       | '^' chord_notes {
+       | CHORD_CARET chord_notes {
                $$ = $2;
        }
        ;
index b97a0de7b7b617627c88985a41865bebdd8c4080..5332167199b0c9e51d424d15733c508839896cb2 100644 (file)
@@ -29,12 +29,12 @@ Slur_engraver::do_try_music (Music *req_l)
 void
 Slur_engraver::set_melisma (bool m)
 {
-    Translator_group *where = daddy_trans_l_;
-    get_property ("melismaBusy", &where);
-    if (!where)
-      where = daddy_trans_l_;
+  Translator_group *where = daddy_trans_l_;
+  get_property ("slurMelismaBusy", &where);
+  if (!where)
+    where = daddy_trans_l_;
     
-    daddy_trans_l_->set_property ("melismaBusy", m ? "1" :"0");
+  daddy_trans_l_->set_property ("slurMelismaBusy", m ? "1" :"0");
 }
 
 void
index f80fe91561f68a8dff6c31f6af1acc7b6a3e9241..f458a7a97a3a51eba959a064168feabed2f92b50 100644 (file)
@@ -20,7 +20,7 @@
 #include "pointer.tcc"
 #include "score-column.hh"
 #include "paper-def.hh"
-#include "colhpos.hh"
+#include "column-x-positions.hh"
 #include "main.hh"
 
 Vector
index 04746dc634cedc8f760ad1fec743f0b5ae5b883f..848c5b16a9ce7f09d0f854ee200071d793873d36 100644 (file)
@@ -12,6 +12,7 @@
 #include "note-head.hh"
 #include "musical-request.hh"
 #include "tie.hh"
+#include "translator-group.hh"
 
 Tie_engraver::Tie_engraver()
 {
@@ -25,11 +26,26 @@ Tie_engraver::do_try_music (Music *m)
   if (Tie_req * c = dynamic_cast<Tie_req*> (m))
     {
       req_l_ = c;
+      if (get_property ("automaticMelismas",0).to_bool ())
+       {
+         set_melisma (true);
+       }
       return true;
     }
   return false;
 }
 
+void
+Tie_engraver::set_melisma (bool m)
+{
+  Translator_group *where = daddy_trans_l_;
+  get_property ("tieMelismaBusy", &where);
+  if (!where)
+    where = daddy_trans_l_;
+    
+  daddy_trans_l_->set_property ("tieMelismaBusy", m ? "1" :"0");
+}
+
 void
 Tie_engraver::acknowledge_element (Score_element_info i)
 {
@@ -172,7 +188,11 @@ Tie_engraver::do_pre_move_processing ()
 void
 Tie_engraver::do_post_move_processing ()
 {
-  req_l_ =0;
+  if (get_property ("automaticMelismas",0).to_bool ())
+    {
+      set_melisma (false);
+    }
+  req_l_ = 0;
   Moment now = now_mom ();
   while (past_notes_pq_.size () && past_notes_pq_.front ().end_ < now)
     past_notes_pq_.delmin ();
index d8cd95439bde01c49e65ce8e96cc1fffddfb9249..0e5e9d2cb198827d4097ec5c557d8ac75411f710 100644 (file)
@@ -86,7 +86,7 @@ VoiceContext = \translator {
        \consists "Dynamic_engraver";   % must come before text_engraver.
        \name Voice ;
 
-       \consists "Tie_engraver";
+%      \consists "Tie_engraver";
        \consists "Breathing_sign_engraver";
        \consists "Rest_engraver";
        \consists "Dot_column_engraver";
@@ -95,7 +95,7 @@ VoiceContext = \translator {
        beamAuto = "1";
        \consists "Auto_beam_engraver";
        \include "auto-beam-settings.ly";
-       \consists "Abbreviation_beam_engraver";
+       \consists "Chord_tremolo_engraver";
 %      \consists "Multi_measure_rest_engraver";
 
        % ugh.  Order matters here.
@@ -107,6 +107,7 @@ VoiceContext = \translator {
        \consists "Rhythmic_column_engraver";
        \consists "Font_size_engraver";
        \consists "Slur_engraver";
+       \consists "Tie_engraver";
        \consists "Tuplet_engraver";
        \consists "Grace_position_engraver";
        \consists "Skip_req_swallow_translator";
index 646967f0805d988292a91a310529c75ac5ce6337..6c88842f89e6c5502ca30cdd7935390c9b42a732 100644 (file)
@@ -1,7 +1,7 @@
 Begin3
 Title: LilyPond
-Version: 1.1.65
-Entered-date: 22JUL99
+Version: 1.1.66
+Entered-date: 23JUL99
 Description: 
 LilyPond is a music typesetter.  It produces beautiful sheet music
 using a high level description file as input.  LilyPond is part of 
@@ -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.65.tar.gz 
+       1000k lilypond-1.1.66.tar.gz 
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-       1000k lilypond-1.1.65.tar.gz 
+       1000k lilypond-1.1.66.tar.gz 
 Copying-policy: GPL
 End
index f30526e3a344f8290c9ded1022ff889c16260c40..4d4372075a0a302b948d744f98240a265d49477b 100644 (file)
@@ -1,9 +1,9 @@
 Name: lilypond
-Version: 1.1.65
+Version: 1.1.66
 Release: 1
 Copyright: GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.65.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.66.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>
index a6804652c5376d74a09e8655fb34cc6dec0331bd..f594a6284f24a03d4330edb213b63d5c91e70574 100644 (file)
@@ -7,12 +7,12 @@ STEPMAKE_TEMPLATES=metafont metapost install install-out
 EXTRA_DIST_FILES += README
 
 FET_FILES = $(wildcard feta[0-9]*.mf)
+FONT_FILES = $(wildcard feta*[0-9].mf)
 
 LOG_FILES = $(addprefix $(outdir)/, $(FET_FILES:.mf=.log))
 TEXTABLES = $(addprefix $(outdir)/, $(FET_FILES:.mf=.tex))
-XPM_FONTS = feta20
 AFM_FILES = $(addprefix $(outdir)/, $(FET_FILES:.mf=.afm)) 
-TFM_FILES = $(addprefix $(outdir)/, $(FET_FILES:.mf=.tfm)) 
+TFM_FILES = $(addprefix $(outdir)/, $(FONT_FILES:.mf=.tfm)) 
 
 ALL_GEN_FILES= $(TEXTABLES) $(LOG_FILES) $(AFM_FILES) $(TFM_FILES)
 
index aa61bf49a7a42b4204d9a14228502d11f99514a2..977682d3d4d59880670b0cef54df04fe1a151d64 100644 (file)
@@ -34,7 +34,6 @@ vocalVerse = \notes\relative c''{
        R2. |
        g8. b16 es4. d8 |
        c8. g16 es4. c8 |
-       % \times 2/3 { [ as\grace( bes ] )
        \grace { as'16 bes } \times 2/3 { [ )as8( )g] as } c4. as8 |
        g2. |
        \grace { f16( g } \times 2/3 { [ )f8( )e] f } as4. f8 |
@@ -44,8 +43,7 @@ vocalVerse = \notes\relative c''{
        c8. g16 e4. c8 |
        \grace { a'16( b } \times 2/3 { [ )a!8( ) gis] a } c4. a8 |
        g!2. |
-       % \times 2/3 { [ a\grace( b] )
-       \times 2/3 { [ d'8\f cis] d } f4. b,8 |
+       \times 2/3 { [ d'8\f( )cis] d } f4. b,8 |
        c!2. |
 }
 
@@ -61,7 +59,7 @@ vocalThrough = \notes\relative c{
        R2. |
        \grace { a16( b } \times 2/3 { [ )a!8( ) gis] a } c4. a8 |
        g!2. |
-       \times 2/3 { [ d'8\f cis] d } f4. b,8 |
+       \times 2/3 { [ d'8\f( )cis] d } f4. b,8 |
        c!2. ~ |
        c4 r c |
        as2. |
@@ -70,42 +68,42 @@ vocalThrough = \notes\relative c{
 }
 
 lyricVerseOne = \lyrics{
-       Lei- " " se fleh- en mei- " " ne Lie- der 
-       Durch die Nacht " " zu dir; 
-       In " " den stil- len Hain " " her- nie- der
-       Lieb- chen, komm " " zu mir! 
+       Lei- se fleh- en mei- ne Lie- der 
+       Durch die Nacht zu dir; 
+       In den stil- len Hain her- nie- der
+       Lieb- chen, komm zu mir! 
        
        Fl\"us- ternd schlan- ke Wip- fel rau- schen
-       In " " des Mon- des Licht,
-       In " " des Mon- des Licht;
+       In des Mon- des Licht,
+       In des Mon- des Licht;
 
        Des Ver- r\"a- ters feind- lich Lau- schen
-       F\"urch- " " te, Hol- de, nicht,
-       F\"urch- " " te, Hol- de, nicht.
+       F\"urch- te, Hol- de, nicht,
+       F\"urch- te, Hol- de, nicht.
 }
        
 lyricVerseTwo = \lyrics{
-       H\"orst " " die Nach- ti- gal- " " len schla- gen? 
-       Ach! sie fleh- " " en dich, 
-       Mit " " der T\"o- ne s\"u- " " "\ss en" Kla- gen
-       Fleh- en sie " " f\"ur mich. 
+       H\"orst die Nach- ti- gal- len schla- gen? 
+       Ach! sie fleh- en dich, 
+       Mit der T\"o- ne s\"u- "\ss en" Kla- gen
+       Fleh- en sie f\"ur mich. 
        
        Sie- ver- "steh'n" des Bus- ens Seh- nen
-       Ken- " " nen Lieb- es- schmerz,
-       Ken- " " nen Lieb- es- schmerz.
+       Ken- nen Lieb- es- schmerz,
+       Ken- nen Lieb- es- schmerz.
 
        R\"uh- ren mit den Sil- ber- t\"o- nen
-       Jed- " " es wei- che Herz,
-       Jed- " " es wei- che Herz.
+       Jed- es wei- che Herz,
+       Jed- es wei- che Herz.
 }
 
 lyricThrough = \lyrics{
        La\ss auch dir die Brust be- we- gen 
        Lieb- chen, h\"o- re mich! 
-       Be- bend harr' " " ich dir ent- ge- gen! 
+       Be- bend harr' ich dir ent- ge- gen! 
        
-       Komm, " " be- gl\"uk- ke mich!
-       Komm, " " be- gl\"uk- ke mich, __ " "
+       Komm, be- gl\"uk- ke mich!
+       Komm, be- gl\"uk- ke mich, __ 
        Be- gl\"uk- ke mich!
 }
 
@@ -326,6 +324,7 @@ vocals = \notes{
        \clef treble;
        % certainly no auto-beaming for vocals
        \property Voice.beamAuto=0
+       \property Staff.automaticMelismas=1
 
        \property Voice.dynamicDir = \up
        \skip 4 * 12;