From 643c1a49be582b0f0959db5904c284e8f1dd2a16 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sun, 25 Feb 2001 23:58:52 +0100 Subject: [PATCH] release: 1.3.132 ============ * Fixes for ascii-script output. Stylesheet needs some work, just as PostScript output. * Bugfix: convert-ly --to accepts argument. * Prepared Petites Preludes for (first?) submission to mutopia. * Bugfix: out-letter/%.ps generation for mutopia. * Bugfix: don't use $(message ) in makefiles; some versions of make choke on this. * Bugfix: ly2dvi.py: don't add magic `//' to TEXINPUTS,MFINPUTS; this chokes kpsewhich 3.3.1 (bug report filed). * Bugfix: file-path.cc: don't interpret relative path as system root. * Bugfix: --srcdir install. 1.3.131.h --- CHANGES | 25 +- Documentation/user/convertors.itely | 148 ++- Documentation/user/invoking.itexi | 4 +- Documentation/user/literature.itely | 9 +- Documentation/user/ly2dvi.itexi | 13 +- Documentation/user/refman.itely | 1299 +++++++++++++---------- Documentation/user/tutorial.itely | 48 +- VERSION | 4 +- buildscripts/mutopia-index.py | 34 +- configure | 2 +- input/bugs/grace-dynamic.ly | 2 + input/bugs/ss.ly | 14 - input/regression/lyrics-multi-stanza.ly | 164 +-- lily/align-interface.cc | 43 +- lily/break-align-engraver.cc | 13 +- lily/break-align-item.cc | 30 +- lily/dynamic-engraver.cc | 1 - lily/include/align-interface.hh | 2 +- lily/parser.yy | 2 +- lily/stem.cc | 18 +- make/out/lilypond.lsm | 8 +- make/out/lilypond.spec | 4 +- mutopia/Coriolan/clarinetti.ly | 3 - mutopia/Coriolan/corni.ly | 3 - scm/grob-description.scm | 4 +- scm/grob-property-description.scm | 8 +- scm/interface-description.scm | 2 +- scm/translator-description.scm | 8 +- scm/translator-property-description.scm | 8 +- stepmake/configure | 2 +- 30 files changed, 1062 insertions(+), 863 deletions(-) create mode 100644 input/bugs/grace-dynamic.ly delete mode 100644 input/bugs/ss.ly diff --git a/CHANGES b/CHANGES index 281ffa35d8..91841f2b9a 100644 --- a/CHANGES +++ b/CHANGES @@ -8,9 +8,6 @@ PostScript output. * Prepared Petites Preludes for (first?) submission to mutopia. -1.3.131.jcn1 -============ - * Bugfix: out-letter/%.ps generation for mutopia. * Bugfix: don't use $(message ) in makefiles; some versions of make @@ -23,6 +20,28 @@ chokes kpsewhich 3.3.1 (bug report filed). * Bugfix: --srcdir install. +1.3.131.hwn1 +============ + +* Documentation: piano pedals, breath marks, tutorial fixes, +convertors, autochange, \override/\set/\revert, multi-stanza lyrics, +\outputproperty + +* Bugfix: another fix for collapsing dynamics with partcombine. + +* Bugfix: add functionality of +Side_position_interface::self_align_callback() into +Align_interface::align_elements_to_extents(). Otherwise, combining +both (such as in a break alignment) leads to weird behavior: the +spacing information is written halfway during a callback sequence, +leading to weird results. + +This fixes input/test/orchestscore.ly + +* Bugfix: x-offset of stem was off by 0.5 stem thickness. + +* Add grob-property attachment-angle: angle for stem to attach to note head. + 1.3.130.hwn2 ============ diff --git a/Documentation/user/convertors.itely b/Documentation/user/convertors.itely index 92848556d9..81174826e3 100644 --- a/Documentation/user/convertors.itely +++ b/Documentation/user/convertors.itely @@ -3,21 +3,37 @@ @node Conversion tools @chapter Converting to LilyPond format. -@section midi2ly -Midi2ly translates a MIDI input file to a LilyPond source file. -Midi2ly is part of the GNU LilyPond music typesetting package. +@menu +* midi2ly:: +* etf2ly:: +* abc2ly:: +* pmx2ly:: +* musedata2ly:: +@end menu + +@node midi2ly +@section midi2ly +Midi2ly translates a MIDI input file to a LilyPond source file. MIDI +(Music Instrument Digital Interface) is a standard for digital +instruments: it specifies cabling, a serial protocol and a file format. -Human players usually are rhythmically not very exact when they record -MIDI files. midi2ly tries to compensate for these errors, but is not -very good at this. It is therefore not recommended to use midi2ly for -human-generated midi files. Correcting the quantization mistakes of the -human player takes a lot of time. +It is possible to record a MIDI file using a digital keyboard, and then +convert it to @file{.ly}. However, human players can not rhythmically +exact enough to make a MIDI to .ly conversion trivial. midi2ly tries to +compensate for these timing errors, but is not very good at this. It is +therefore not recommended to use midi2ly for human-generated midi +files. Correcting the quantization mistakes of the human player takes a +lot of time. Hackers who know about signal processing are invited to write a more robust midi2ly. +MIDI is also a de facto standard format for exporting music from other +programs, so this capability may come in useful when you want to import +files from a program that has no convertor for its native format. + @subsection Invoking midi2ly @example @@ -56,13 +72,16 @@ robust midi2ly. Assume no double dotted notes. @end table - +@node etf2ly @section etf2ly -@subsection Invoking etf2ly -Usage: +ETF (Enigma Transport Format) is a format used by Coda Music +Technology's Finale product. This program will convert part of an ETF +file to a ready-to-use lilypond file. +@subsection Invoking etf2ly +Usage: @example etf2ly [OPTION]... ETF-FILE @@ -80,13 +99,108 @@ set output filename to FILE version information @end table -Enigma Transport Format is a format used by Coda Music Technology's -Finale product. This program will convert part of an ETF file to a -ready-to-use lilypond file. -Report bugs to bug-gnu-music@@gnu.org +Written by @email{Han-Wen Nienhuys,hanwen@@cs.uu.nl}. + + +@subsection Bugs + +Known: articulation scripts are buggy. Empty measures confuse etf2ly. +Report bugs to @email{bug-gnu-music@@gnu.org}. + +@node abc2ly +@section abc2ly + +ABC is a fairly simple ASCII based format. It is described at +@uref{http://www.gre.ac.uk/~c.walshaw/abc2mtex/abc.txt}. + + +@example + abc2ly [OPTION]... ABC-FILE +@end example + +Convert ABC to LilyPond. + +Options: +@table @code +@item -h,--help +this help +@item -o,--output=FILE +set output filename to FILE +@item -v,--version +version information +@end table + +@subsection Bugs + +The ABC standard is not very "standard". For extended features +(eg. polyphonic music) different conventions exist. + +[TODO: describe limitations] + + +@node pmx2ly +@section pmx2ly + +PMX is a Musixtex preprocessor written by Don Simons, see +@uref{http://www.gmd.de/Misc/Music/musixtex/software/pmx/}. + +Report bugs to @email{bug-gnu-music@@gnu.org}. + +@example + pmx2ly [OPTION]... PMX-FILE +@end example + +Convert PMX to LilyPond. + +Options: +@table @code +@item -h,--help +this help +@item -o,--output=FILE +set output filename to FILE +@item -v,--version +version information +@end table + + +@node musedata2ly +@section musedata2ly + +PMX is a Musixtex preprocessor written by Don Simons, see +@uref{http://www.gmd.de/Misc/Music/musixtex/software/pmx/}. + +Report bugs to @email{bug-gnu-music@@gnu.org}. + +@example + musedata2ly [OPTION]... MUSEDATA-FILE +@end example + +Convert Musedata to LilyPond. Musedata (@uref{http://www.musedata.org/}) +is an electronic library of classical music scores, currently comprising +about 800 composition dating from 1700 to 1825. The music is encoded in +so-called Musedata format +(@uref{http://www.ccarh.org/publications/books/beyondmidi/online/musedata}). +musedata2ly converts a set of musedata files to one .ly file, and will +include a \header field if a .ref file is supplied + +Report bugs to @email{bug-gnu-music@@gnu.org}. + +Written by @email{Han-Wen Nienhuys,hanwen@@cs.uu.nl}. + + +Options: +@table @code +@item -h,--help +this help +@item -o,--output=@var{file} +set output filename to @var{file} +@item -v,--version +version information +@item -r,--ref=@var{reffile} + read background information from ref-file +@var{REFFILE} +@end table -Written by Han-Wen Nienhuys -[descibe abc2ly, pmx2ly, etf2ly, musedata2ly here] diff --git a/Documentation/user/invoking.itexi b/Documentation/user/invoking.itexi index e5e8dd30e6..96f19453cb 100644 --- a/Documentation/user/invoking.itexi +++ b/Documentation/user/invoking.itexi @@ -21,9 +21,9 @@ dump). For processing both the @TeX{} and the PostScript output, you must have appropriate environment variables set. For @TeX{}, you have to -set @var{MFINPUTS} and @var{TEXINPUTS} to point to the directory +set @code{MFINPUTS} and @code{TEXINPUTS} to point to the directory containing LilyPond metafont and .tex files. For processing the -PostScript with Ghostscript, you have to set @var{GS_FONTPATH} to +PostScript with Ghostscript, you have to set @code{GS_FONTPATH} to point to the directory containing LilyPond @file{pfa} files. Scripts to do this are included in diff --git a/Documentation/user/literature.itely b/Documentation/user/literature.itely index 86629ec9b1..0140a5e529 100644 --- a/Documentation/user/literature.itely +++ b/Documentation/user/literature.itely @@ -19,11 +19,7 @@ Tom Gerou and Linda Lusk, Essential Dictionary of Music Notation. Alfred Publishing, Van Nuys CA ISBN 0-88284-768-6 A concise, alphabetically ordered list of typesetting and music -(notation) issues with a rather simplistic attitude but in most cases -"good-enough" answers. - -[graag zonder neertrappen.] - +(notation) issues which covers most of the normal cases. @item Stone80 @@ -38,8 +34,7 @@ overview of existing traditional notation practices. Gardner Read, Music Notation: a Manual of Modern Practice. Taplinger Publishing, New York (2nd edition). -This is as close to the ``standard'' reference work for music notation -issues as one is likely to get. +A standard work on music notation. @item hader48, diff --git a/Documentation/user/ly2dvi.itexi b/Documentation/user/ly2dvi.itexi index 8b7bddfd71..3c54dbd2f0 100644 --- a/Documentation/user/ly2dvi.itexi +++ b/Documentation/user/ly2dvi.itexi @@ -218,17 +218,8 @@ a list of priorities for lowest to hightest proirity. @subsection Bugs -See @ref{Bug reports}. If you have found a bug, you should send a -bugreport. - -@itemize @bullet -@item Send a copy of the input which causes the error. -@item Send a description of the platform you use. -@item Send a description of the LilyPond and ly2dvi version you use. -@item Send a description of the bug itself. -@item Send it to @email{bug-gnu-music@@gnu.org} (you don't have to subscribe - to this mailinglist). -@end itemize +If find something that you consider a bug, please send a bugreport (See +@ref{Bug reports}) to @email{bug-gnu-music@@gnu.org}. @subsection Remarks diff --git a/Documentation/user/refman.itely b/Documentation/user/refman.itely index 4a8652b6f5..f882840e7e 100644 --- a/Documentation/user/refman.itely +++ b/Documentation/user/refman.itely @@ -14,10 +14,6 @@ Rhythm staff (clef, x-notehead) - postscript, scheme output? - - (links to?) using/existance of ly2dvi, lilypond-book - @end ignore @@ -27,28 +23,28 @@ @chapter Reference Manual This document describes GNU LilyPond and its input format. This document -has been revised for LilyPond 1.3.125 +has been revised for LilyPond 1.3.131 @menu * Overview:: -* Repeats:: * Note entry:: * Music notation:: * Polyphony:: * Spanners:: +* Repeats:: * Piano music:: * Lyrics:: * Chords:: * Writing parts:: * Custodes:: +* Tuning output:: * Page layout:: * Sound:: * Music entry:: * Engravers:: * Syntactic details:: -* Unsorted:: @end menu @c . {Overview} @@ -114,196 +110,6 @@ can enter and edit them in manageable chunks. -@c . {Repeats} -@node Repeats -@section Repeats - - -@cindex repeats -@cindex @code{\repeat} - -In order to specify repeats, use the @code{\repeat} -keyword. Since repeats look and sound differently when played or -printed, there are a few different variants of repeats. - -@table @asis -@item unfolded -Repeated music is fully written (played) out. Useful for MIDI -output. - -@item volta -This is the normal notation: Repeats are not written out, but -alternative endings (voltas) are printed, left to right. - -@item folded -Alternative endings are written stacked. Which is unfortunately not -practical for anything right now. - -@item tremolo -Make tremolo beams. -@end table - -@menu -* Repeat syntax:: -* Manual repeat commands:: -* Tremolo repeats:: -* Tremolo subdivision:: -@end menu - -@node Repeat syntax -@subsection Repeat syntax - -The syntax for repeats is - -@example - \repeat @var{variant} @var{repeatcount} @var{repeatbody} -@end example - -If you have alternative endings, you may add - -@cindex @code{\alternative} -@example - \alternative @code{@{} @var{alternative1} - @var{alternative2} - @var{alternative3} @dots{} @code{@}} -@end example - -where each @var{alternative} is a Music expression. - -Normal notation repeats are used like this: - -@quotation - -@lilypond[fragment,verbatim] - c'1 - \repeat volta 2 { c'4 d' e' f' } - \repeat volta 2 { f' e' d' c' } -@end lilypond -@end quotation - -With alternative endings: - -@quotation - -@lilypond[fragment,verbatim] - c'1 - \repeat volta 2 {c'4 d' e' f'} - \alternative { {d'2 d'} {f' f} } -@end lilypond -@end quotation - -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 at some point in the future.} - -@quotation - -@lilypond[fragment,verbatim] - c'1 - \repeat fold 2 {c'4 d' e' f'} - \alternative { {d'2 d'} {f' f} } - -@end lilypond -@end quotation - - -If you don't give enough alternatives for all of the repeats, then -the first alternative is assumed to be repeated often enough to equal -the specified number of repeats. - -@quotation -@lilypond[fragment,verbatim] -\context Staff { - \relative c' { - \partial 4; - \repeat volta 3 { e | c2 d2 | e2 f2 | } - \alternative { { g4 g g } { a | a a a a | b2. } } - } -} - -@end lilypond -@end quotation - - -As you can see, LilyPond doesn't remember the timing information, nor -are slurs or ties repeated, so you have to reset timing information -after a repeat, eg using bar-checks, @code{Score.measurePosition} or -@code{\partial}. We hope to fix this after 1.4. - -It is possible to nest @code{\repeat}, although it probably is only -meaningful for unfolded repeats. - -@node Manual repeat commands -@subsection Manual repeat commands - -@cindex @code{repeatCommands} - -The property @code{repeatCommands} can be used to control the layout of -repeats. Its value is a Scheme list of repeat commands, where each repeat -command can be - -@table @code -@item 'start-repeat - Print a |: bar line -@item 'stop-repeat - Print a :| bar line -@item (volta . @var{text}) - Print a volta bracket saying @var{text}. -@item (volta . #f) - Stop a running volta bracket -@end table - -@lilypond[verbatim, fragment] - c''4 - \property Score.repeatCommands = #'((volta "93") end-repeat) - c4 c4 - \property Score.repeatCommands = #'((volta #f)) - c4 c4 -@end lilypond - - -@node Tremolo repeats -@subsection Tremolo repeats -@cindex tremolo beams - -To place tremolo marks between notes, use @code{\repeat} with tremolo -style. -@lilypond[verbatim,center] -\score { - \context Voice \notes\relative c' { - \repeat "tremolo" 8 { c16 d16 } - \repeat "tremolo" 4 { c16 d16 } - \repeat "tremolo" 2 { c16 d16 } - \repeat "tremolo" 4 c16 - } - \paper { - linewidth = 40*\staffspace; - } -} -@end lilypond - -@node Tremolo subdivision -@subsection Tremolo subdivision -@cindex tremolo marks -@cindex @code{tremoloFlags} - -Tremolo marks can be printed on a single 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{tremoloFlags} property if there was no last value. - -@lilypond[verbatim,fragment,center] - c'2:8 c':32 -@end lilypond - -Tremolos in this style do not carry over into the MIDI output. - -Using this mechanism pays off when you entering many tremolos, since the -default argument saves a lot of typing. - - @c . {Note entry} @node Note entry @section Note entry @@ -485,8 +291,9 @@ r1 r2 r4 r8 r16 r32 r64 r64 @end lilypond @end quotation -As you can see, the longa is not printed. To get a longa note head, you -have to use a different style of note heads. See [TODO]. +As you can see, the longa is not printed. To get a longa note head, you +have to use a mensural note heads. This is done accomplished by setting +the @code{style} property of the NoteHead grob to @code{mensural}. If the duration is omitted then it is set equal to the previous duration entered. At the start of parsing there is no previous duration, so then @@ -566,6 +373,7 @@ this has the same effect as the spacer rest. @cindex Music notation @menu * Key:: +* Breath marks:: * Time signature:: @end menu @@ -637,8 +445,6 @@ Supported clef-names include @item percussion: percussion clef @end itemize -[todo: ancient clefs] - Supported associated symbols (for Staff.clefGlyph) are: @itemize @bullet @@ -666,6 +472,17 @@ Supported associated symbols (for Staff.clefGlyph) are: historic editions". @emph{Editio XXX style} means "as is/was printed in Editio XXX". +@node Breath marks +@subsection Breath marks + +Breath marks are entered using @code{\breathe}: + +@lilypond[fragment,relative] +c'4 \breathe d4 +@end lilypond + + + @c . {Time signature} @node Time signature @subsection Time signature @@ -708,6 +525,9 @@ Short cut for See the documentation of @code{measurePosition}. + + + @c . {Polyphony} @node Polyphony @section Polyphony @@ -998,6 +818,8 @@ note in the phrasing slur. \time 6/4; c''\((d)e f(e)\)d @end lilypond +[TODO: put together with breath mark.] + @c . {Tie} @menu @@ -1095,12 +917,13 @@ their written length: Define a spanning request. The @var{startstop} parameter is either -1 (@code{\start}) or 1 (@code{\stop}) and @var{type} is a string that -describes what should be started. Supported types are @code{crescendo}, -@code{decrescendo}, @code{beam}, @code{slur}. [FIXME: many more] This -is an internal command. Users should use the shorthands which are -defined in the initialization file @file{spanners.ly}. +describes what should be started. Among the supported types are +@code{crescendo}, @code{decrescendo}, @code{beam}, @code{slur}.This is +an internal command. Users should use the shorthands which are defined +in the initialization file @file{spanners.ly}. -You can attach a (general) span request to a note using +You can attach a (general) span request to a note using the following +syntax. @lilypond[fragment,verbatim,center] c'4-\spanrequest \start "slur" @@ -1109,7 +932,6 @@ You can attach a (general) span request to a note using The slur syntax with parentheses is a shorthand for this. - @c . {Ornaments} @node Ornaments @subsection Ornaments @@ -1331,13 +1153,12 @@ implemented. -@c . {Stem tremolo} + @menu * Glissando :: * Dynamics:: * Crescendo and Decrescendo:: * Bar lines:: -* Breath marks:: @end menu @@ -1467,12 +1288,6 @@ You are encouraged to use @code{\repeat} for repetitions. See [FIXME] -@c . {Breath marks} -@node Breath marks -@subsubsection Breath marks -@cindex Breath marks - - @c . {Bar check} @node Bar check @@ -1496,37 +1311,250 @@ A bar check is entered using the bar symbol, @code{|} +@c . {Repeats} +@node Repeats +@section Repeats +@cindex repeats +@cindex @code{\repeat} -@c . {Piano music} -@node Piano music -@section Piano music -@menu -* Automatic staff changes:: -* Manual staff switches:: -* Pedals:: -* Arpeggio:: -* Follow Thread:: -@end menu - +In order to specify repeats, use the @code{\repeat} +keyword. Since repeats look and sound differently when played or +printed, there are a few different variants of repeats. -@c . {Automatic staff changes} -@node Automatic staff changes -@subsection Automatic staff changes -@cindex Automatic staff changes +@table @asis +@item unfolded +Repeated music is fully written (played) out. Useful for MIDI +output. -[\autochange] +@item volta +This is the normal notation: Repeats are not written out, but +alternative endings (voltas) are printed, left to right. -@node Manual staff switches -@subsection Manual staff switches +@item folded +Alternative endings are written stacked. Which is unfortunately not +practical for anything right now. -@cindex manual staff switches -@cindex staff switch, manual +@item tremolo +Make tremolo beams. +@end table -@cindex @code{\translator} -@example - \translator @var{contexttype} = @var{name} +@menu +* Repeat syntax:: +* Manual repeat commands:: +* Tremolo repeats:: +* Tremolo subdivision:: +@end menu + +@node Repeat syntax +@subsection Repeat syntax + +The syntax for repeats is + +@example + \repeat @var{variant} @var{repeatcount} @var{repeatbody} +@end example + +If you have alternative endings, you may add + +@cindex @code{\alternative} +@example + \alternative @code{@{} @var{alternative1} + @var{alternative2} + @var{alternative3} @dots{} @code{@}} +@end example + +where each @var{alternative} is a Music expression. + +Normal notation repeats are used like this: + +@quotation + +@lilypond[fragment,verbatim] + c'1 + \repeat volta 2 { c'4 d' e' f' } + \repeat volta 2 { f' e' d' c' } +@end lilypond +@end quotation + +With alternative endings: + +@quotation + +@lilypond[fragment,verbatim] + c'1 + \repeat volta 2 {c'4 d' e' f'} + \alternative { {d'2 d'} {f' f} } +@end lilypond +@end quotation + +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 at some point in the future.} + +@quotation + +@lilypond[fragment,verbatim] + c'1 + \repeat fold 2 {c'4 d' e' f'} + \alternative { {d'2 d'} {f' f} } + +@end lilypond +@end quotation + + +If you don't give enough alternatives for all of the repeats, then +the first alternative is assumed to be repeated often enough to equal +the specified number of repeats. + +@quotation +@lilypond[fragment,verbatim] +\context Staff { + \relative c' { + \partial 4; + \repeat volta 3 { e | c2 d2 | e2 f2 | } + \alternative { { g4 g g } { a | a a a a | b2. } } + } +} + +@end lilypond +@end quotation + + +As you can see, LilyPond doesn't remember the timing information, nor +are slurs or ties repeated, so you have to reset timing information +after a repeat, eg using bar-checks, @code{Score.measurePosition} or +@code{\partial}. We hope to fix this after 1.4. + +It is possible to nest @code{\repeat}, although it probably is only +meaningful for unfolded repeats. + +@node Manual repeat commands +@subsection Manual repeat commands + +@cindex @code{repeatCommands} + +The property @code{repeatCommands} can be used to control the layout of +repeats. Its value is a Scheme list of repeat commands, where each repeat +command can be + +@table @code +@item 'start-repeat + Print a |: bar line +@item 'stop-repeat + Print a :| bar line +@item (volta . @var{text}) + Print a volta bracket saying @var{text}. +@item (volta . #f) + Stop a running volta bracket +@end table + +@lilypond[verbatim, fragment] + c''4 + \property Score.repeatCommands = #'((volta "93") end-repeat) + c4 c4 + \property Score.repeatCommands = #'((volta #f)) + c4 c4 +@end lilypond + + +@node Tremolo repeats +@subsection Tremolo repeats +@cindex tremolo beams + +To place tremolo marks between notes, use @code{\repeat} with tremolo +style. +@lilypond[verbatim,center] +\score { + \context Voice \notes\relative c' { + \repeat "tremolo" 8 { c16 d16 } + \repeat "tremolo" 4 { c16 d16 } + \repeat "tremolo" 2 { c16 d16 } + \repeat "tremolo" 4 c16 + } + \paper { + linewidth = 40*\staffspace; + } +} +@end lilypond + +@node Tremolo subdivision +@subsection Tremolo subdivision +@cindex tremolo marks +@cindex @code{tremoloFlags} + +Tremolo marks can be printed on a single 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{tremoloFlags} property if there was no last value. + +@lilypond[verbatim,fragment,center] + c'2:8 c':32 +@end lilypond + +Tremolos in this style do not carry over into the MIDI output. + +Using this mechanism pays off when you entering many tremolos, since the +default argument saves a lot of typing. + + + + + +@c . {Piano music} +@node Piano music +@section Piano music +@menu +* Automatic staff changes:: +* Manual staff switches:: +* Pedals:: +* Arpeggio:: +* Follow Thread:: +@end menu + + +@c . {Automatic staff changes} +@node Automatic staff changes +@subsection Automatic staff changes +@cindex Automatic staff changes + +Voices can be switched from top to bottom staff automatically. The +syntax for this is +@example + \autochange @var{contexttype} @var{musicexp} +@end example +This will switch notation context of @var{musicexp} between a +@var{contexttype} named @code{up} and @code{down}. Typically, you use +@code{Staff} for @var{contexttype}. The autochanger switches on basis +of pitch (central C is the turning point), and it looks ahead skipping +over rests to switch rests in advance. + +@lilypond[verbatim,singleline] +\score { \notes \context PianoStaff < + \context Staff = "up" { + \autochange Staff \context Voice = VA < \relative c' { g4 a b c d r4 a g } > + } + \context Staff = "down" { + \clef bass; + s1*2 + } > } +@end lilypond + + + + +@node Manual staff switches +@subsection Manual staff switches + +@cindex manual staff switches +@cindex staff switch, manual + +@cindex @code{\translator} +@example + \translator @var{contexttype} = @var{name} @end example A music expression indicating that the context which is a direct @@ -1545,7 +1573,28 @@ Usually this is used to switch staffs in Piano music, e.g. @subsection Pedals @cindex Pedals -[todo] +Piano pedals can be entered using the following span requests of the +types @code{Sustain}, @code{UnaChorda} and @code{Sostenuto}: +@lilypond[fragment,verbatim] +c''4 \spanrequest \start "Sustain" c4 c4 \spanrequest \stop "Sustain" +@end lilypond + +For these verbose expressions, standard shorthands have been defined: +@table @code +@item sustainDown +@item sustainUp +@item unaChorda +@item treChorde +@item sostenutoDown +@item sostenutoUp +@end table + +The symbols that are printed can be modified by setting pedalXStrings, +where one of the pedal types. Refer to the generaetd documentation for +more information. + +Currently, brackets are not supported, only text markings (ie. Ped* +style). @c . {Arpeggio} @@ -1622,6 +1671,7 @@ can be printed automatically. This is enabled if the property * Lyrics mode:: * Printing lyrics:: * Automatic syllable durations:: +* More stanzas:: @end menu @c . {Lyrics mode} @@ -1774,7 +1824,6 @@ For example: @cindex Automatic syllable durations -[explain automatic phrasing] @cindex automatic lyric durations @cindex @code{\addlyrics} @@ -1827,6 +1876,40 @@ undesired effects when using multiple stanzas: It is valid (but probably not very useful) to use notes instead of lyrics for @var{musicexpr2}. +@node More stanzas +@subsection More stanzas + +@cindex phrasing + +If you have multiple stanzas printed underneath each other, the separate +syllables should be aligned around punctuation. LilyPond can do this if +you explain it which lyric lines belong to which melody. + +To this end, give the Voice context an identity, and set the LyricsVoice +to name starting with that identity. In the following example, the Voice +identity is @code{duet}, and the identities of the LyricsVoices are +@code{duet-1} and @code{duet-2}. + + +@lilypond[singleline,verbatim] +\score { +\addlyrics + \notes \relative c'' \context Voice = duet { \time 3/4; g2 e4 a2 f4 g2. } + \lyrics \context Lyrics < + \context LyricsVoice = "duet-1" { + \property LyricsVoice . stanza = "Bert" + Hi, my name is bert. } + \context LyricsVoice = "duet-2" { + \property LyricsVoice . stanza = "Ernie" + Ooooo, ch\'e -- ri, je t'aime. } + > +} +@end lilypond + +You can add stanza numbers by setting @code{LyricsVoice.Stanza} (for the +first system) and @code{LyricsVoice.stz} for the following systems. + +@cindex stanza numbering @c . {Chords} @@ -1992,7 +2075,7 @@ For displaying printed chord names, use the @code{ChordNames} and the notation described above, or directly using simultaneous music. @quotation -@lilypond[verbatim] +@lilypond[verbatim,singleline] scheme = \notes { \chords {a1 b c} } @@ -2001,7 +2084,6 @@ scheme = \notes { \context ChordNamesVoice \scheme \context Staff \transpose c'' \scheme > - \paper { linewidth = -1.; } } @end lilypond @end quotation @@ -2042,7 +2124,7 @@ identify chord inversions or added base, which may result in strange chord names when chords are entered as a list of pitches: @quotation -@lilypond[verbatim,center] +@lilypond[verbatim,center,singleline] scheme = \notes { @@ -2054,7 +2136,6 @@ scheme = \notes { \context ChordNamesVoice \scheme \context Staff \scheme > - \paper { linewidth = -1.; } } @end lilypond @end quotation @@ -2063,7 +2144,7 @@ To specify chord inversions, append @code{/}. To specify an added bass note, append @code{/+ - \paper { linewidth = -1.; } } @end lilypond @end quotation @@ -2202,21 +2282,11 @@ scheme = \chords { * Rehearsal marks:: * Instrument names:: * Transpose:: +* Sound output for transposing instruments:: * Multi measure rests:: +* Automatic part combining:: @end menu -[TODO: - -partcombine - -rehearsal marks - -tranposing midi property. - -instrument names - -] - @c . {Rehearsal marks} @node Rehearsal marks @subsection Rehearsal marks @@ -2255,10 +2325,10 @@ You can specify an instrument name for a staff by setting before the start of the staff. For the first start, @code{instrument} is used, for the next ones @code{instr} is used. -@lilypond[verbatim] +@lilypond[verbatim,singleline] \score { \notes { \property Staff.instrument = "instr " { c''4 } } - \paper { linewidth = -1.; + \paper { \translator { \StaffContext \consists "Instrument_name_engraver"; } } } @end lilypond @@ -2304,6 +2374,21 @@ If you want to use both @code{\transpose} and @code{\relative}, then you must use @code{\transpose} first. @code{\relative} will have no effect music that appears inside a @code{\transpose}. +@node Sound output for transposing instruments +@subsection Sound output transposing instruments + +When you want to play a score containing transposed and untransposed +instruments, you have to instruct LilyPond the pitch offset (in +semitones) for the transposed instruments. This is done using +@code{transposing}. + +@cindex @code{transposing} + +@example + \property Staff.instrument = #"Cl. in B-flat" + \property Staff.transposing = #-2 +@end example + @c . {Multi measure rests} @node Multi measure rests @@ -2328,6 +2413,12 @@ multimeasure rest. @cindex condensing rests +@node Automatic part combining +@subsection Automatic part combining + +[TODO] + + @c . {Custodes} @node Custodes @section Custodes @@ -2378,15 +2469,257 @@ are @code{vaticana}, @code{medicaea}, @code{hufnagel} and @} @end quotation -The property can also be set locally, for example in a @code{\notes} -block: +The property can also be set locally, for example in a @code{\notes} +block: + +@quotation +\notes @{ + \property Staff.Custos \override #'style = #'vaticana + c'1 d' e' d' \break c' d' e' d' +@} +@end quotation + +@c . {Tuning output} +@node Tuning output +@section Tuning output + +LilyPond tries to take as much formatting as possible out of your +hands. Nevertheless, there are situations where it needs some help, or +where you want to override its decisions. + +Here we discuss how you can do that. + +Notational output is specified in so called grobs (graphic +objects). Each grob carries with it a set of properties (grob +properties) specific to that grob. For example, a stem grob has grob +properties that specify its direction, length and thickness. + +The most common way of tuning the output is to alter the values of these +properties. There are two ways of doing that: first, you can +specifically select a set of grobs at one point, and set properties as +you wish, or secondly, you can (temporarily) modify the definition of a +grob, thereby affecting an entire group of grobs. + +@menu +* Tuning groups of grobs :: +* Tuning per grob :: +* What to tune?:: +* Text markup:: +@end menu + +@node Tuning groups of grobs +@subsection Tuning groups of grobs + +@cindex grob description + +A grob definition is an association list, that is stored in a context +property. By assigning to that property (using plain @code{\property}), +you can change the resulting grobs. +@lilypond[verbatim, fragment] +c'4 \property Voice.Stem = #'((meta . ((interfaces . ())))) c'4 +@end lilypond +The @code{\property} statement effectively empties the definition of the +Stem object. One of the effects is that property specifying how it +should be printed is erased, with the effect of rendering it invisible. + +@cindex \override +@cindex \revert +@cindex \set + + +This mechanism is fairly crude, since you can only set, but not modify, +the definition of a grob. For this reason, there is a more advanced +mechanism: you can add a property on top of an existing definition, or +remove a property: @code{\override} adds a settings, @code{\revert} +removes that setting. +@lilypond[verbatim] +c'4 \property Voice.Stem \override #'thickness = #4.0 +c'4 \property Voice.Stem \revert #'thickness +c'4 +@end lilypond + +For the digirati, the grob description is an Scheme association +list. Since it is singly linked, we can treat it as a stack, and +@code{\override} and @code{\revert} are just push and pop +operations. This pushing and popping is also used in the +@code{autoBeamSettings} property. + +If you revert a setting which was not set in the first place, then it +has no effect. However, if the setting was set as a system default, it +may remove the default value, and this may give surprising results, +including crashes. In other words, if you use @code{\override} and +@code{\revert}, be sure to balance the overrides and reverts. + +If balancing them is too much work, use the following shorthand: +@code{\set} performs a revert followed by an override: +@example +\property Voice.Stem \set #'thickness = #2.0 +@end example + +Formally the syntax for these constructions is +@example +\property @var{context}.@var{grobname} \override @var{symbol} = @var{value} +\property @var{context}.@var{grobname} \set @var{symbol} = @var{value} +\property @var{context}.@var{grobname} \revert @var{symbol} +@end example +Here @var{symbol} is a Scheme expression of symbol type, @var{context} +and @var{grobname} are strings and @var{value} is a Scheme expression. + +LilyPond will hang or crash if @var{value} contains cyclic references. + + + +@node Tuning per grob +@subsection Tuning per grob + +@cindex \outputproperty + +A second way of tuning grobs is the more arcane @code{\outputproperty} +feature. +Syntax is as follows +@example +\outputproperty @var{predicate} @var{symbol} = @var{value} +@end example +Here @code{predicate} is a Scheme functoin taking a grob a argument +argument, and returning a boolean. This statement is processed by the +@code{Output_property_engraver}. It instructs the engraver to feed all +grobs that it sees to @var{predicate}. Whenever the predicate returns +true, the grob property @var{symbol} will be set to @var{value}. + +You will need to combine this statement with @code{\context} to select +the appropriate context to apply this to. + +If possible, avoid this feature: the semantics are not very clean, and +the syntax and semantics are up for rewrite. + +Here are some random examples: + +@lilypond[fragment,verbatim,singleline] +\relative c'' { c4 + \context Staff \outputproperty + #(make-type-checker 'note-head-interface) + #'extra-offset = #'(0.5 . 0.75) + } +@end lilypond + +@cindex @code{extra-offset} + +This selects all note heads occurring at current staff level, and sets +the @code{extra-offset} of those heads to @code{(0.5,0.75)}, shifting +them up and right. + +Move the text "m.d.", but not the fingering instruction "2". +@lilypond[verbatim,singleline] +#(define (make-text-checker text) + (lambda (grob) (equal? text (ly-get-elt-property grob 'text)))) + +\score { + \notes\relative c''' { + \property Voice.Stem \set #'direction = #1 + \outputproperty #(make-text-checker "m.d.") + #'extra-offset = #'(-3.5 . -4.5) + a^2^"m.d." + } +} +@end lilypond + + + + +@node What to tune? +@subsection What to tune? + +This all tells you how to tune grobs, but what variables are there? The +question is not answered in this manual (although you may encounter +some examples.). + +Grob properties are tied directly to the implementation of LilyPond, and +they are thus a moving target. Refer to the automatically generated +documentation of the internals (available from the website). + +You need the following information + +@itemize @bullet +@item +which grob to modify +@item +which property to modify +@item +which context the grob comes from. +@end itemize + +Included with the automatically generated documentation is a master list +of grobs. Each one can be clicked, taking you to a overview of the +available properties. + +There is also a master list of contexts. Clicking each takes you to an +overview of the context, listing which grob types are created there. + + + +@node Text markup +@subsection Text markup +@cindex text markup +@cindex markup text + +LilyPond has an internal mechanism to typeset texts. You can +form text markup expressions by composing scheme expressions +in the following way. + +@lilypond[verbatim] +\score { \notes \relative c' { + b-#"text" + c-#'(bold "text") + d-#'(lines "one" (bold "text")) + e-#'(music (named "noteheads-2" "flags-u3")) +} +\paper { linewidth = 10.\cm; } } +@end lilypond + +Normally, the Scheme markup text is stored in the @code{text} property +of a grob. Formally, it is defined as follows: + +@example +text: string | (head? text+) +head: markup | (markup+) +markup-item: property | abbrev | @var{fontstyle} +property: (@var{key} . @var{value}) +abbrev: @code{rows lines roman music bold italic named super sub text} +@end example + +The markup is broken down and converted into a list of grob properties, +which are prepended to the grop's property list. The +@var{key}-@var{value} pair is a grob property. + +The following abbreviations are currently +defined: + +@table @code +@item rows +horizontal mode: set all text on one line (default) +@item lines + vertical mode: set every text on new line +@item roman + select roman font +@item music + select feta font +@item bold + select bold series +@item italic + select italic shape +@item named + lookup by character name +@item text + plain text lookup (by character value) +@item super + superscript +@item sub + subscript +@end table + +@var{fontstyle} may be any of @code{finger volta timesig mmrest mark +script large Large dynamic} -@quotation -\notes @{ - \property Staff.Custos \override #'style = #'vaticana - c'1 d' e' d' \break c' d' e' d' -@} -@end quotation @c . {Page layout} @node Page layout @@ -2420,7 +2753,7 @@ where each of the items is one of @item An assignment. The assignment must be terminated by a semicolon. - @item A context definition. See section @ref{Context definitions} for + @item A context definition. See Section @ref{Notation contexts} for more information on context definitions. @item \stylesheet declaration. Its syntax is @@ -2596,6 +2929,14 @@ example file @file{input/test/between-systems.ly} @node Sound @section Sound @cindex Sound + +LilyPond allows MIDI output, with the purpose of proof-hearing the music +you enter. The performance lacks lots of interesting effects, such as +swing, articulation, slurring, tieing, etc. + +Also note that it is not possible to use the percussion channel +(generally channel 10 of a MIDI file). + @menu * MIDI block:: * MIDI instrument names:: @@ -2807,7 +3148,8 @@ relative within transposed music, you must place an additional * Creating contexts:: * Default contexts:: * Context properties:: -* Context definitions:: +* Changing context definitions:: +* Defining new contexts:: @end menu @c . {Music expressions} @@ -2866,7 +3208,7 @@ context does not exist, it will be created. @quotation -@lilypond[verbatim] +@lilypond[verbatim,singleline] \score { \notes \relative c'' { c4 f @@ -2894,7 +3236,7 @@ notation context from their parent. Each note is a music expression, and as you can see in the following example, only the sequential music enclosing the three notes has an explicit context. -@lilypond[verbatim] +@lilypond[verbatim,singleline] \score { \notes \context Voice = goUp { c'4 d' e' } } @end lilypond @@ -2910,7 +3252,7 @@ words, you may think of @code{\score} working like @end example Sequential music follows the contexts of its "children". Take this example -@lilypond +@lilypond[verbatim, singleline] \score { \context Score \notes { c'4 ( d' )e' } } @end lilypond @@ -2922,15 +3264,17 @@ music is also interpreted with the same Thread, Voice and Staff context, putting the notes on the same staff, in the same voice. This is a convenient mechanism, but do not expect opening chords to work -without @code{\context}. For every note, a separate staff -@lilypond +without @code{\context}. For every note, a separate staff is +instantiated. + +@lilypond[verbatim, singleline] \score { \notes } @end lilypond Of course, if the chord is preceded by a normal note in sequential music, the chord will be interpreted by the Thread of the preceding note: -@lilypond +@lilypond[verbatim,singleline] \score { \notes { c'4 } } @end lilypond @@ -2960,33 +3304,94 @@ example) and thus take effect in all @code{Voice} contexts. @c . {Context definitions} -@node Context definitions -@subsection Context definitions +@node Changing context definitions +@subsection Changing context definitions @cindex context definition @cindex translator definition -[todo: ] +The most common way to define a context is by extending an existing +context. You can change an existing context from the paper block, by +first initializing a translator with an existing context identifier: +@example +\paper @{ + \translator @{ + @var{context-identifier} + @} @} +@end example +Then you can add engravers, remove engravers and set context +properties. The syntax for these operations are respectively +@example + \remove @var{engravername} + \consists @var{engravername} + @var{propname} = @var{value} +@end example -A notation contexts is defined by the following information +Here @var{engravername} is a string, the name of an engraver in the +system. @var{propname} is a string and @var{value} is a Scheme +expression. -@enumerate 1 - @item A name. +@lilypond[verbatim,singleline] +\score { \notes { + c'4 c'4 } + \paper { + \translator { \StaffContext + \consists Instrument_name_engraver; + instrument = #"foo" + \remove Clef_engraver; + } } } +@end lilypond - @item The LilyPond modules that do the actual conversion of music to - notation. Each module is a so-called - @emph{engraver} @cindex engraver -. - @item How these modules should cooperate, i.e. which ``cooperation - module'' should be used. This cooperation module is a special - type of engraver. +These type of property assignments happen before interpretation starts, +so a @code{\property} expression will override any predefined settings. + +Engravers are the actual C++ modules that do the work in the +interpretation phase. + + +There are some pre-defined identifiers to simplify editing translators, +they are defined in @file{ly/engraver.ly}. These pre-defined +identifiers are: + +@table @code +@cindex @code{StaffContext} + @item @code{StaffContext} + Default Staff context. +@cindex @code{RhythmicStaffContext} + + @item @code{RhythmicStaffContext} + Default RhythmicStaff context. +@cindex @code{VoiceContext} + + @item @code{VoiceContext} + Default Voice context. +@cindex @code{ScoreContext} + + @item @code{ScoreContext} + Default Score context. + +@cindex @code{HaraKiriStaffContext} + + @item @code{HaraKiriStaffContext} + Staff context that does not print if it only contains rests. + Useful for orchestral scores.@footnote{Harakiri, also called + Seppuku, is the ritual suicide of the Japanese Samourai warriors.} +@end table + +@node Defining new contexts +@subsection Defining new contexts + +If you want to build a context from scratch, you must also supply the +following extra information: +@itemize @bullet + @item A name, specified by @code{\name @var{contextname};}. - @item What other contexts the context can contain, + @item A cooperation engraver. This is specified by @code{\type +@var{typename};}. +@end itemize - @item What properties are defined. -@end enumerate A context definition has this syntax: @@ -2999,18 +3404,24 @@ A context definition has this syntax: @var{translatorinit} can be an identifier or @example - \type @var{typename} @code{;} + @end example where @var{typename} is one of +The cooperation engraver groups other engravers, and specifies how they +should cooperate. Choices are: + @table @code @cindex @code{Engraver_group_engraver} @item @code{Engraver_group_engraver} The standard cooperation engraver. + @cindex @code{Score_engraver} @item @code{Score_engraver} - This is cooperation module that should be in the top level context. + This is cooperation module that should be in the top level context, +and only the toplevel context. + @cindex @code{Grace_engraver_group} @item @code{Grace_engraver_group} @@ -3084,52 +3495,6 @@ such an identifier outside of @code{\score}, you must do @cindex paper types, engravers, and pre-defined translators -Some pre-defined identifiers can simplify modification of -translators. The pre-defined identifiers are: - -@table @code -@cindex @code{StaffContext} - @item @code{StaffContext} - Default Staff context. -@cindex @code{RhythmicStaffContext} - - @item @code{RhythmicStaffContext} - Default RhythmicStaff context. -@cindex @code{VoiceContext} - - @item @code{VoiceContext} - Default Voice context. -@cindex @code{ScoreContext} - - @item @code{ScoreContext} - Default Score context. - -@cindex @code{HaraKiriStaffContext} - - @item @code{HaraKiriStaffContext} - Staff context that does not print if it only contains rests. - Useful for orchestral scores.@footnote{Harakiri, also called - Seppuku, is the ritual suicide of the Japanese Samourai warriors.} - -@end table - -Using these pre-defined values, you can remove or add items to the -translator: - -@quotation - -@example -\paper @{ - \translator @{ - \StaffContext - \remove Some_engraver; - \consists Different_engraver; - @} -@} -@end example - -@end quotation - @@ -3141,9 +3506,6 @@ is @var{propname} @code{=} @var{value} @end example -This assignment happens before interpretation starts, so a -@code{\property} expression will override any predefined settings. - 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 @emph{translators}. Translators for @@ -3176,7 +3538,10 @@ called @emph{performers}. This section describes what you may enter at top level. -@unnumberedsubsec Score definition +@c . {Score} +@subsubsection Score +@cindex Score + @cindex score definition The output is generated combining a music expression with an output @@ -3190,17 +3555,12 @@ definition. A score block has the following syntax: definition is supplied, the default @code{\paper} block will be added. -@c . {Score} -@subsubsection Score -@cindex Score -@c . {Paper} -@subsubsection Paper -@cindex Paper +@c . {Default output} +@subsubsection Default output -@c . {Midi} -@subsubsection Midi -@cindex Midi +Default values for the @code{\paper} and @code{\midi} block are set by +entering such a block at top-level. @c . {Header} @subsubsection Header @@ -3334,22 +3694,16 @@ However, in some cases, LilyPond will also try to choose contexts, and use the structure of the music expression to do so. This can have undesired effects: for example, LilyPond will create a separate staff for each note if you start a @code{\score} with a chord: -@lilypond[verbatim,center] +@lilypond[verbatim,center,singleline] \score { \notes - \paper { - linewidth = -1.; - } } @end lilypond The solution is to explicitly instantiate the context you desire. In this case this is typically a Voice context -@lilypond[verbatim,center] +@lilypond[verbatim,center,singleline] \score { \notes\context Voice - \paper { - linewidth = -1.; - } } @end lilypond If you use @code{\context Staff} you will get separate stems for each @@ -3714,229 +4068,6 @@ foo = -6 -@c . {Unsorted} -@node Unsorted -@section Unsorted - -[mucho todo] - -Translation? - -@cindex properties -@unnumberedsubsec Translation property - - -[todo: add \set/\override/\revert] - - - -@cindex output properties -@unnumberedsubsec Output properties - -These allow you to tweak what is happening in the back-end -directly. If you want to control every detail of the output -formatting, this is the feature to use. The downside to this is that -you need to know exactly how the backend works. Example: - - -@lilypond[fragment,verbatim] -\relative c'' { c4 - \context Staff \outputproperty - #(make-type-checker 'note-head-interface) - #'extra-offset = #'(0.5 . 0.75) - } -@end lilypond - -This selects all note heads occurring at current staff level, and sets -the @code{extra-offset} of those heads to @code{(0.5,0.75)}, shifting -them up and right. - -Use of this feature is entirely on your own risk: if you use this, the -result will depend very heavily on the implementation of the backend, -which we change regularly and unscrupulously. - - -Don't move the finger 2, only text "m.d." ... -@lilypond[verbatim] -#(define (make-text-checker text) - (lambda (grob) (equal? text (ly-get-elt-property grob 'text)))) - -\score { - \notes\relative c''' { - \property Voice.Stem \set #'direction = #1 - \outputproperty #(make-text-checker "m.d.") - #'extra-offset = #'(-3.5 . -4.5) - a^2^"m.d." - } - \paper { linewidth = -1.; } -} -@end lilypond - - -@menu -* Text markup:: -@end menu - -@node Text markup -@subsection Text markup -@cindex text markup -@cindex markup text - -LilyPond has an internal mechanism to typeset texts: you can -form text markup expressions by composing scheme expressions -in the following way: - -@lilypond[verbatim] -\score { \notes \relative c' { - b-#"text" - c-#'(bold "text") - d-#'(lines "one" (bold "text")) - e-#'(music (named "noteheads-2" "flags-u3")) -} -\paper { linewidth = 10.\cm; } } -@end lilypond - -Formally, Scheme markup text is defined as follows: - -@example -text: string | (head? text+) -head: markup | (markup+) -markup-item: property | abbrev | @var{fontstyle} -property: (@var{key} . @var{value}) -abbrev: @code{rows lines roman music bold italic named super sub text} -@end example - -The markup is broken down and converted into a list of grob properties, -which are prepended to the grop's property list. The -@var{key}-@var{value} pair is a grob property. -@ignore -[Why is this useful?] - -?Snapnie: markup text is eerste item dat voldoet aan mijn gewelfdige, -ideale idee van direct-en-eenmalig-per-item te zetten properties, ipv -gehaspel via \property en hopen dat je property (enkel) in juiste item -terecht gaat komen. Heb je deze wel bewust meegemaakt: - -Sender: jan@appel.lilypond.org -To: Han-Wen -Subject: (elt) properties -Organization: Jan at Appel -From: janneke@gnu.org -Date: 01 Nov 2000 10:39:10 +0100 -Message-ID: -User-Agent: Gnus/5.0807 (Gnus v5.8.7) Emacs/20.7 -MIME-Version: 1.0 -Content-Type: text/plain; charset=us-ascii -Lines: 77 -Xref: appel.lilypond.org vers:1991 - -Hi, - -Wat ik vooral mis, is een koele manier om een propertie eenmalig aan -een element te hangen. Hoop dat je zinvol over wilt meedenken; zie -het monster van les-nereides. Misschien dat we 't niet moeten doen -voor 1.4 maar wachten tot properties nog wat verder -uitgekristalliseerd zijn? - -Nu moet je - - \property Voice.Stem \push #'length = #'6 - a - \property Voice.Stem \pop #'length - b - -waarmee je in feite zeg tegen de stem-engraver: vanaf nu aan moet je -alle stems 6 lang maken (maakt stem); onee, doe maar weer default -lengte. - -Maar dat is eigenlijk niet wat je bedoelt, wat je zou willen is net -zo'n directe interface als wat we nu hebben voor markup text, bv. iets -van: - - a+#'(Stem::length . 6) b - -Bij markup text kun je direct en eenmalig een reeks properties aan een -enkel item toevoegen; iets wat je volgens mij vaak nodig hebt. - -Ik zat eerst te denken aan ``request properties'': properties -toevoegen aan request, die dan worden doorgegeven aan alle items die -door dat request worden gemaakt. - -Maar misschien zuigt dat wel te vreselijk en moeten we iets van -``volatile'' properties maken. - -Btw, - - \property Voice.Slur \push #'dash = #1 - \property Voice.Slur \pop #'dash - a()b - \property Voice.Slur \push #'direction = #-1 - \property Voice.Slur \pop #'direction - ()c - -of de kluts waar ik brr van word, eigenlijk ook alleen doenbaar is -voor wat veelgebruikte properties: - - slurDotted = \property Voice.Slur \push #'dash = #1 - slurNoDots = \property Voice.Slur \pop #'dash - slurUp = \property Voice.Slur \push #'direction = #1 - slurDown = \property Voice.Slur \push #'direction = #-1 - slurBoth = \property Voice.Slur \pop #'direction - - [..] - - \slurDotted\slurDown - a()b - ()c - \slurNoDots\slurBoth - -zou toch graag meer iets in trant van, als je begrijpt wat ik bedoel - - Slur+#'((dash . 1) (direction . 1)) - b () c - Slur-#'(dash direction) - -ofwel - - a(+#'((dash . 1) (direction . 1)) - )b(+#'((dash . 1) (direction . 1)) - )c -@end ignore - -The following abbreviations are currently -defined: - -@table @code -@item rows -horizontal mode: set all text on one line (default) -@item lines - vertical mode: set every text on new line -@item roman - select roman font -@item music - select feta font -@item bold - select bold series -@item italic - select italic shape -@item named - lookup by character name -@item text - plain text lookup (by character value) -@item super - superscript -@item sub - subscript -@end table - - -@var{fontstyle} may be any of @code{finger volta timesig mmrest mark -script large Large dynamic} - -@ignore -[kern, raise ??] -Wat is daarmee, zijn toch gewoon grob properties van text-interface? -@end ignore @c .{Local emacs vars} @c Local variables: diff --git a/Documentation/user/tutorial.itely b/Documentation/user/tutorial.itely index c86ccfae3d..2160899c59 100644 --- a/Documentation/user/tutorial.itely +++ b/Documentation/user/tutorial.itely @@ -33,8 +33,8 @@ subdirectory @file{input/tutorial/}.@footnote{When we refer to filenames, they are relative to the top directory of the source package. @cindex file names -} We recommend that you experiment with writing Lilypond input yourself, -to get a feel for how the program behaves. +}. We recommend that you experiment with writing Lilypond input +yourself, to get a feel for how the program behaves. @node Running LilyPond @@ -66,7 +66,7 @@ If you run Unix, proceed as follows: run lilypond on the file, i.e., @example lilypond test @end example -You will the following on your screen: +You will see the following on your screen: @example GNU LilyPond 1.3.125. Now processing: `input/tutorial/test.ly' @@ -78,7 +78,7 @@ paper output to test.tex... @end example Now, run @TeX{}@footnote{@TeX{} is a text-typesetting system that is -especially suited for typesetting mathematics}. The result should +especially suited for typesetting mathematics.}. The result should resemble this: @example This is TeX, Version 3.14159 (Web2C 7.3.1) @@ -101,7 +101,7 @@ To view the output, run Xdvi, i.e. @example xdvi test @end example -You should will see this +You should see the following in a window next to some buttons. @lilypond \header { title = "Test"; @@ -112,7 +112,6 @@ You should will see this \paper { } } @end lilypond -along with some buttons in a window. @cindex postscript, converting to When you're satisfied with the result, you can print it. For printing, @@ -132,12 +131,12 @@ This is dvips(k) 5.86 Copyright 1999 Radical Eye Soft ... @cindex GhostScript @cindex @code{lpr} PostScript is a page description language, similar to PDF. Some printers -can understand a postscript file directly, but the cheapers need the -intervention of GhostScript, a PostScript emulator that runs on your +can understand a postscript file directly, but the cheaper ones need the +intervention of GhostScript, an emulator that runs PostScript on your computer instead of your printer. Most Linux distributions nowadays have -GhostScript running ``in the background'', so any configured printer -will act as a PostScript printer. Assuming this, the -following command will print the file +GhostScript running ``in the background'', so any configured printer +will act as a PostScript printer. Assuming this, the following command +will print the file @example lpr test.ps @end example @@ -145,11 +144,11 @@ If this does not make your printer produce a page of music, then you should look into installing and configuring ghostscript. Refer to GhostScript's website at @uref{http://www.ghostscript.com}. -There are two different routes: firstly, you can add titling to the -output. This is done by a separate program called ly2dvi: this program -first calls LilyPond to process the @file{.ly} file, and then runs -@TeX{} on it to produce a @file{.dvi} file with proper margin settings -and titling. +There are three other routes: firstly, you can add titling to the +output. This is done by a separate program called @file{ly2dvi}: this +program first calls LilyPond to process the @file{.ly} file, and then +runs @TeX{} on it to produce a @file{.dvi} file with proper margin +settings and titling. @cindex titles, adding @cindex ly2dvi @@ -158,20 +157,27 @@ and titling. ly2dvi test.ly @end example After some disk-activity, you should end up with a @file{.dvi} file. -6 -Secondly, you can generate PostScript directly. This is not very useful -currently, but here goes: +Ly2dvi is further described in the Chapter @ref{ly2dvi}. + +Secondly, you can generate PostScript directly. This is useful if you +can not or do not want to run @TeX{} on your system. +To obtain PS output, invoke LilyPond as follows: @cindex PostScript output @example lilypond -f ps test.ly @end example -[treat FAQs here, eg. about env vars.] +You have to set some environment variables to view or print this +output. More information can be found in the Section @ref{Invoking +LilyPond}. +Finally, there is a script called lilypond-book, that allows you to +freely mix LilyPond input with Texinfo or LaTeX input. For example, this +manual was written using lilypond-book. @unnumberedsubsec Windows -[todo] +[TODO] @node The first tune diff --git a/VERSION b/VERSION index 76280b6600..ab4bed8b3f 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 -PATCH_LEVEL=131 -MY_PATCH_LEVEL=jcn2 +PATCH_LEVEL=132 +MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/buildscripts/mutopia-index.py b/buildscripts/mutopia-index.py index f56ab3bca2..a79e99cc6e 100755 --- a/buildscripts/mutopia-index.py +++ b/buildscripts/mutopia-index.py @@ -3,7 +3,35 @@ name = 'mutopia-index' -import find +# find.py -- deprecated in python 2.0 +import fnmatch +import os + +_debug = 0 + +_prune = ['(*)'] + +def find(pattern, dir = os.curdir): + list = [] + names = os.listdir(dir) + names.sort() + for name in names: + if name in (os.curdir, os.pardir): + continue + fullname = os.path.join(dir, name) + if fnmatch.fnmatch(name, pattern): + list.append(fullname) + if os.path.isdir(fullname) and not os.path.islink(fullname): + for p in _prune: + if fnmatch.fnmatch(name, p): + if _debug: print "skip", `fullname` + break + else: + if _debug: print "descend into", `fullname` + list = list + find(pattern, fullname) + return list + + import re import os import sys @@ -154,7 +182,7 @@ for opt in options: dirs = [] for f in files: - dirs = dirs + find.find ('out-www', f); + dirs = dirs + find ('out-www', f) if not dirs: dirs = ['.'] @@ -162,7 +190,7 @@ if not dirs: allfiles = [] for d in dirs: - allfiles = allfiles + find.find ('*.ly.txt', d) + allfiles = allfiles + find ('*.ly.txt', d) print allfiles diff --git a/configure b/configure index 143b7e2aba..84d71f9896 100755 --- a/configure +++ b/configure @@ -1151,7 +1151,7 @@ fi PATHSEP=':' INSTALL="\$(SHELL) \$(stepdir)/../bin/install-dot-exe.sh -c" else - ROOTSEP='/' + ROOTSEP=':' DIRSEP='/' PATHSEP=':' LN=ln diff --git a/input/bugs/grace-dynamic.ly b/input/bugs/grace-dynamic.ly new file mode 100644 index 0000000000..3f0767d537 --- /dev/null +++ b/input/bugs/grace-dynamic.ly @@ -0,0 +1,2 @@ + +\score { \notes {\grace {c'_\f} d e f g}} diff --git a/input/bugs/ss.ly b/input/bugs/ss.ly deleted file mode 100644 index f0585ae086..0000000000 --- a/input/bugs/ss.ly +++ /dev/null @@ -1,14 +0,0 @@ -\version "1.3.129" -\include "paper16.ly" -\score{ - \notes \context Staff = pr { - \context Voice < a b c' e'> - } - \paper{ - \translator { - \StaffContext - StaffSymbol \override #'staff-space = #1.3 - } - } -} - diff --git a/input/regression/lyrics-multi-stanza.ly b/input/regression/lyrics-multi-stanza.ly index a7dee3a6a4..9d879a06ea 100644 --- a/input/regression/lyrics-multi-stanza.ly +++ b/input/regression/lyrics-multi-stanza.ly @@ -1,154 +1,16 @@ -\version "1.3.117"; -\include "english.ly" - -\header{ -texidoc=" -Multiple stanzas - - Tests a number of features: - * Lyric_phrasing_engraver - * Stanza_number_engraver - * Automatic melismata on beamed notes - -"; - - title = "Crowned with Honour"; - composer = "Oliver Holden (1765-1844)"; - poet = "Thomas Kelly (1769-1855)"; -} - -allup = \notes{ - \stemUp - \slurUp - \tieUp - \property Voice.DynamicLineSpanner \override #'direction = #1 - \autoBeamOff -} - -alldown = \notes{ - \stemDown - \slurDown - \tieDown - \property Voice.DynamicLineSpanner \override #'direction = #-1 - \autoBeamOff -} - -Global = \notes{ - \key g \major; - \time 4/4; - \partial 4; -} - -Soprano = \notes \relative c' { - \allup - d4 | g g b b a g a b a g b a g( a )g % modified to test melisma align right - - [a8 b] | b4 % modified to test melisma align left - a g b [d16 d c8] [b a] b4 % modified to test beam melisma -% a4 | b a g b [d8 \melisma c] \melismaEnd [b \melisma a] \melismaEnd b4 - - d d2 d e d4( cs8 ~ )cs d2. - - b4 | d b g b [a8 g] [a b] a4 -% b4 | d b g b [a8 \melisma g] \melismaEnd [a \melisma b] \melismaEnd a4 - - g d'2 c b4.( c8 )a4 a g2. -} -Alto = \notes \relative c'{ - \alldown - d4 | d d g g fs g fs g fs e g fs d2. - d4 | g d b g' [b8 a] [g fs] g4 fs g2 a g fs4( e8 )g fs2. - d4 | g g d g [fs8 e] [fs g] fs4 g f2 e d4.( d8 )d4 fs4 d2. -} -Tenor = \notes \relative c{ - \allup - d4 | b' b d d c b c d c b d c b2. - a4 | b a g b [d8 c] [b a] b4 a b2 c b a a2. - g4 | b d b d [c8 b] [c d] c4 b g2 g g4.( a8 [fs )a] c4 b2. + +\score { +\addlyrics + \notes \relative c'' \context Voice = duetto { \time 3/4; g2 e4 a2 f4 g2. } + \lyrics \context Lyrics < + \context LyricsVoice = "duet-1" { + \property LyricsVoice . stanza = "Bert" + Hi, my name is bert. } + \context LyricsVoice = "duet-2" { + \property LyricsVoice . stanza = "Ernie" + Ooooo, ch\'e -- ri, je t'aime. } + > + \paper { linewidth = -1.0;} } -Bass = \notes \relative c{ - \alldown - d4 | g g g g d d d g d e d d g,2. - d'4 | g d b g' [b8 a] [g fs] g4 d g2 fs e a d,2. - g4 | g g g g d d d e b2 c d2. d4 g,2. -} - -TheLyrics = \lyrics < - { - \context LyricsVoice = "Soprano-1" - \property LyricsVoice .stanza = "1:" - \property LyricsVoice .stz = "(1)" - The4 head that once was crowned with thorns - Is crowned with glo -- ry now; - A roy -- al di -- a -- dem a -- dorns - The might -- y Vic -- tor's brow. - A roy -- al di -- a -- dem a -- dorns - The might -- y Vic -- tor's brow. - } - { - \context LyricsVoice = "Soprano-2" - \property LyricsVoice .stanza = "2:" - \property LyricsVoice .stz = "(2)" - The4 high -- est place that heav'n af -- fords - Is His by sov -- 'reign right; - The King of kings, the Lord of lords, - He reigns in glo -- ry bright, - The King of kings, the Lord of lords, - He reigns in glo -- ry bright. - } - { - \context LyricsVoice = "Soprano-3" - \property LyricsVoice .stanza = "3:" - \property LyricsVoice .stz = "(3)" - The joy of all who dwell a -- bove, - The joy of saints be -- low, - To4 whom He man -- i -- fests His love, - And grants His name to know, - To4 whom He man -- i -- fests His love, - And grants His name to4 know. - } -> - -\score{ - \context ChoirStaff - \notes - < - \property Score.barNumberScriptPadding = #10.0 - \context Staff = "treblestaff"{ - < - \context Voice = "Soprano" { } - \context Voice = "Alto" { } - > - } - \context Lyrics = mainlyrics { } - \context Staff = "treblestaff"{ - < - \Global - \addlyrics { \context Voice = "Soprano" \Soprano } - { \context Lyrics = mainlyrics \TheLyrics } - \context Voice = "Alto" \Alto - > - \bar "|."; - } - \context Staff = "bassstaff"{ - \clef "bass"; - < - \context Voice = "Tenor" { \Tenor } - \context Voice = "Bass" { \Bass } - > - \bar "|."; - } - > - - \paper { - \translator{ - \VoiceContext - automaticMelismata = ##t; - noAutoBeaming = ##t; - \remove "Auto_beam_engraver"; - } - - } -} diff --git a/lily/align-interface.cc b/lily/align-interface.cc index dfb79e812b..5df19061aa 100644 --- a/lily/align-interface.cc +++ b/lily/align-interface.cc @@ -26,7 +26,7 @@ Align_interface::alignment_callback (SCM element_smob, SCM axis) Grob * par = me->parent_l (ax); if (par && !to_boolean (par->get_grob_property ("alignment-done"))) { - Align_interface::align_to_extents (par, ax); + Align_interface::align_elements_to_extents (par, ax); } return gh_double2scm (0.0); } @@ -81,7 +81,7 @@ Align_interface::align_to_fixed_distance (Grob *me , Axis a) from the outside by setting minimum-space and extra-space in its children */ void -Align_interface::align_to_extents (Grob * me, Axis a) +Align_interface::align_elements_to_extents (Grob * me, Axis a) { me->set_grob_property ("alignment-done", SCM_BOOL_T); @@ -139,15 +139,30 @@ Align_interface::align_to_extents (Grob * me, Axis a) } - Real where_f=0; + /* + Read self-alignment-X and self-alignment-Y. This may seem like + code duplication. (and really: it is), but this is necessary to + prevent ugly cyclic dependencies that arise when you combine + self-alignment on a child with alignment of children. + */ + + String s ("self-alignment-"); + + s += (a == X_AXIS) ? "X" : "Y"; + + SCM align (me->get_grob_property (s.ch_C())); + Array translates ; + Interval total; + Real where_f=0; + for (int j=0 ; j < elems.size(); j++) { Real dy = 0.0; dy = - stacking_dir * dims[j][-stacking_dir]; if (j) dy += stacking_dir * dims[j-1][stacking_dir]; - + if (j) { dy = (dy >? threshold[SMALLER] ) @@ -155,12 +170,19 @@ Align_interface::align_to_extents (Grob * me, Axis a) } where_f += stacking_dir * dy; + total.unite ( dims[j] + where_f); translates.push (where_f); } + + + Grob * align_center = unsmob_grob (align); + Real center_offset = 0.0; + /* also move the grobs that were empty, to maintain spatial order. */ + Array all_translates; if (translates.size ()) { int i =0; @@ -172,11 +194,20 @@ Align_interface::align_to_extents (Grob * me, Axis a) { w = translates[i++]; } - all_grobs[j]->translate_axis (w, a); - + if (all_grobs[j] == align_center) + center_offset = w; + all_translates .push (w); j++; } } + + if (isdir_b (align)) + { + center_offset = total.linear_combination (gh_scm2double (align)); + } + + for (int j = 0 ; j < all_grobs.size (); j++) + all_grobs[j]->translate_axis (all_translates[j] - center_offset, a); } Axis diff --git a/lily/break-align-engraver.cc b/lily/break-align-engraver.cc index 057ea36945..f17922a017 100644 --- a/lily/break-align-engraver.cc +++ b/lily/break-align-engraver.cc @@ -110,12 +110,7 @@ Break_align_engraver::acknowledge_grob (Grob_info inf) SCM edge_sym = ly_symbol2scm ("Left_edge_item"); Item * edge = new Item (get_property ("LeftEdge")); - /* - We must have left-edge in the middle. Instrument-names - are left to left-edge, so they don't enter the staff. - */ - align_l_->set_grob_property ("self-alignment-X", edge->self_scm ()); - + /* If the element is empty, it will be ignored in the break @@ -125,8 +120,12 @@ Break_align_engraver::acknowledge_grob (Grob_info inf) */ edge->set_extent_callback (Grob::point_dimension_callback_proc, X_AXIS); + /* + We must have left-edge in the middle. Instrument-names + are left to left-edge, so they don't enter the staff. + */ align_l_->set_grob_property ("self-alignment-X", edge->self_scm ()); - + announce_grob (edge, 0); column_alist_ = scm_assoc_set_x (column_alist_, edge_sym, edge->self_scm ()); } diff --git a/lily/break-align-item.cc b/lily/break-align-item.cc index 36f536ba0f..4318f0b78d 100644 --- a/lily/break-align-item.cc +++ b/lily/break-align-item.cc @@ -64,6 +64,11 @@ Break_align_interface::self_align_callback (SCM element_smob, SCM axis) me->set_grob_property ("self-alignment-X", gh_int2scm (RIGHT)); } + /* + Force break alignment itself to be done first, in the case + */ + + return Side_position::aligned_on_self (element_smob, axis); } @@ -169,7 +174,7 @@ Break_align_interface::do_alignment (Grob *me) /* Force callbacks for alignment to be called */ - Align_interface::align_to_extents (me, X_AXIS); + Align_interface::align_elements_to_extents (me, X_AXIS); Real pre_space = elems[0]->relative_coordinate (column, X_AXIS); @@ -199,10 +204,33 @@ Break_align_interface::do_alignment (Grob *me) stretch_distance = spring_len; } + /* Hint the spacing engine how much space to put in. The pairs are in the format of an interval (ie. CAR < CDR). + */ + /* + UGH UGH UGH + + This is a side effect, and there is no guarantee that this info is + computed at a "sane" moment. + + (just spent some time tracking a bug that was caused by this info + being written halfway: + + self_alignment_callback (*) + -> child->relative_coordinate (self) + -> break_alignment + -> child->relative_coordinate (column) + + the last call incorporates the value that should've been computed + in (*), but--of course-- is not yet. + + The result is that an offsets of align_elements_to_extents () are + not compensated for, and spring_len is completely off. + + */ column->set_grob_property ("extra-space", scm_cons (gh_double2scm (pre_space), diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 223a7303bb..2aee3603d1 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -117,7 +117,6 @@ Dynamic_engraver::try_music (Music * m) It will disappear by itself when stop_translation_timestep () finds that there is nothing to support anymore. */ - line_spanner_ = 0; if (cresc_p_) cresc_p_->suicide (); cresc_p_ = 0; diff --git a/lily/include/align-interface.hh b/lily/include/align-interface.hh index 94d60926c0..643bd53175 100644 --- a/lily/include/align-interface.hh +++ b/lily/include/align-interface.hh @@ -18,7 +18,7 @@ struct Align_interface { DECLARE_SCHEME_CALLBACK(alignment_callback, (SCM element, SCM axis)); DECLARE_SCHEME_CALLBACK(fixed_distance_alignment_callback, (SCM element, SCM axis)); static void align_to_fixed_distance (Grob*,Axis a); - static void align_to_extents (Grob*,Axis a); + static void align_elements_to_extents (Grob*,Axis a); static void set_axis (Grob*,Axis); static Axis axis (Grob*) ; static void add_element (Grob*,Grob*, SCM callback); diff --git a/lily/parser.yy b/lily/parser.yy index b35335cc71..cad76eb68d 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -1138,7 +1138,7 @@ shorthand_command_req: verbose_command_req: - COMMANDSPANREQUEST bare_int STRING { + COMMANDSPANREQUEST bare_int STRING { /*TODO: junkme */ Span_req * sp_p = new Span_req; sp_p-> set_span_dir ( Direction($2)); sp_p->set_mus_property ("span-type",$3); diff --git a/lily/stem.cc b/lily/stem.cc index 7633af05f4..f144ba137e 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -458,8 +458,6 @@ Stem::dim_callback (SCM e, SCM ax) } -const Real ANGLE = 20* (2.0*M_PI/360.0); // ugh! Should be settable. - MAKE_SCHEME_CALLBACK(Stem,brew_molecule,1); @@ -479,10 +477,15 @@ Stem::brew_molecule (SCM smob) Real dy = Staff_symbol_referencer::staff_space (me)/2.0; Real head_wid = 0; - + + Real angle =0.0; if (Grob *hed = support_head (me)) - head_wid = hed->extent (hed,X_AXIS).length (); - stem_y[Direction(-d)] += d * head_wid * tan(ANGLE)/(2*dy); + { + head_wid = hed->extent (hed,X_AXIS).length (); + + angle = gh_scm2double (hed->get_grob_property ("attachment-angle")); + } + stem_y[Direction(-d)] += d * head_wid * tan(angle)/(2*dy); if (!invisible_b (me)) { @@ -502,6 +505,9 @@ Stem::brew_molecule (SCM smob) return mol.smobbed_copy (); } +/* + move the stem to right of the notehead if it is up. + */ MAKE_SCHEME_CALLBACK(Stem,off_callback,2); SCM Stem::off_callback (SCM element_smob, SCM ) @@ -518,7 +524,7 @@ Stem::off_callback (SCM element_smob, SCM ) Real rule_thick = gh_scm2double (me->get_grob_property ("thickness")) * me->paper_l ()->get_var ("stafflinethickness"); Direction d = get_direction (me); - r = head_wid[d] - d * rule_thick ; + r = head_wid[d] - d * rule_thick * 0.5; } return gh_double2scm (r); } diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 9190111b34..cebdb1a282 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,15 +1,15 @@ Begin3 Title: LilyPond -Version: 1.3.131 -Entered-date: 24FEB01 +Version: 1.3.132 +Entered-date: 26FEB01 Description: @BLURB@ Keywords: music notation typesetting midi fonts engraving 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.3.131.tar.gz + 1000k lilypond-1.3.132.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 1000k lilypond-1.3.131.tar.gz + 1000k lilypond-1.3.132.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index 08f2e52e8b..db222e14ef 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,11 +1,11 @@ %define info yes Name: lilypond -Version: 1.3.131 +Version: 1.3.132 Release: 1 License: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.131.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.132.tar.gz Summary: A program for printing sheet music. URL: http://www.cs.uu.nl/~hanwen/lilypond # Icon: lilypond-icon.gif diff --git a/mutopia/Coriolan/clarinetti.ly b/mutopia/Coriolan/clarinetti.ly index 34eb038cba..d1a656133d 100644 --- a/mutopia/Coriolan/clarinetti.ly +++ b/mutopia/Coriolan/clarinetti.ly @@ -11,9 +11,6 @@ clarinettiStaff = \context Staff = clarinetti < "2 Clarinetti" (rows "(B" ,text-flat ")")) \property Staff.instr = #`(lines "Cl." (rows "(B" ,text-flat ")")) - - % urg: can't; only My_midi_lexer: () parses pitch? - %\property Staff.transposing = "bes" \property Staff.transposing = #-2 \Time diff --git a/mutopia/Coriolan/corni.ly b/mutopia/Coriolan/corni.ly index 0bdc166596..b4fe792cc6 100644 --- a/mutopia/Coriolan/corni.ly +++ b/mutopia/Coriolan/corni.ly @@ -11,9 +11,6 @@ corniStaff = \context Staff = corni < "2 Corni" (rows "(E" ,text-flat ")")) \property Staff.instr = #`(lines "Cor." (rows "(E" ,text-flat ")")) - - % urg: can't; only My_midi_lexer: () parses pitch? - %\property Staff.transposing = "es" \property Staff.transposing = #3 \Time \notes { \key c \major; } diff --git a/scm/grob-description.scm b/scm/grob-description.scm index 7e814f0439..5c9e37c151 100644 --- a/scm/grob-description.scm +++ b/scm/grob-description.scm @@ -87,7 +87,6 @@ (breakable . #t) (stacking-dir . 1) (axes 0) - (X-offset-callbacks . (,Break_align_interface::self_align_callback)) (space-alist . ,default-break-align-space-alist) (meta . ,(grob-description "BreakAlignment" axis-group-interface align-interface @@ -324,7 +323,8 @@ (NoteHead . ( (style . default) (molecule-callback . ,Note_head::brew_molecule) - (Y-offset-callbacks . (,Staff_symbol_referencer::callback)) + (Y-offset-callbacks . (,Staff_symbol_referencer::callback)) + (attachment-angle . ,(* 20/360 3.14159)) (meta . ,(grob-description "NoteHead" rhythmic-head-interface font-interface note-head-interface )) diff --git a/scm/grob-property-description.scm b/scm/grob-property-description.scm index 67f74adc87..0430b0f73e 100644 --- a/scm/grob-property-description.scm +++ b/scm/grob-property-description.scm @@ -37,6 +37,8 @@ This procedure is called (using dependency resolution) after line breaking. Retu (grob-property-description 'arithmetic-multiplier number? "see @ref{spacing-spanner-interface}.") (grob-property-description 'attachment pair? "cons of symbols, '(LEFT-TYPE . RIGHT-TYPE), where both types may be alongside-stem, stem, head or loose-end.") +(grob-property-description 'attachment-angle number? "Where does the stem +attach to the notehead?") (grob-property-description 'attachment-offset pair? "cons of offsets, '(LEFT-offset . RIGHT-offset). This offset is added to the attachments to prevent ugly slurs. [fixme: we need more documentation here]. @@ -115,7 +117,11 @@ Align_interface::center_on_element). .") (grob-property-description 'expand-limit integer? "maximum number of measures expanded in church rests.") (grob-property-description 'extra-extent-X number-pair? "enlarge in X dimension by this much, measured in staff space.") (grob-property-description 'extra-extent-Y number-pair? "see @code{extra-extent-Y}.") -(grob-property-description 'extra-offset number-pair? "pair of reals (a cons) forcing an extra offset before outputting.") +(grob-property-description 'extra-offset number-pair? "pair of reals +(a cons) forcing an extra offset before outputting. +@code{extra-offset} is added just before `printing' the grob, so the +typesetting engine is completely oblivious to it. +") (grob-property-description 'extra-space number-pair? "pair of distances (cons LEFT RIGHT).") (grob-property-description 'extremity-offset-alist list? "an alist (attachment stem-dir*dir slur-dir*dir) -> offset. The offset adds to the centre of the notehead, or stem.") diff --git a/scm/interface-description.scm b/scm/interface-description.scm index e7253de63f..d6571b3a80 100644 --- a/scm/interface-description.scm +++ b/scm/interface-description.scm @@ -217,7 +217,7 @@ object." 'note-head-interface "Note head" '( - style + style attachment-angle ) )) diff --git a/scm/translator-description.scm b/scm/translator-description.scm index 1f0e15218c..754ab1cc00 100644 --- a/scm/translator-description.scm +++ b/scm/translator-description.scm @@ -744,12 +744,8 @@ either unison, unisilence or soloADue is set" (engraver-description "Tuplet_engraver" "Catch Time_scaled_music and generate appropriate bracket " - '( - TupletBracket) - '( - tupletSpannerDuration - tupletInvisible - ))) + '( TupletBracket) + '(tupletNumberFormatFunction tupletSpannerDuration tupletInvisible))) (cons diff --git a/scm/translator-property-description.scm b/scm/translator-property-description.scm index 610f63a298..3c62246ac1 100644 --- a/scm/translator-property-description.scm +++ b/scm/translator-property-description.scm @@ -152,7 +152,13 @@ Staff.defaultBarType will have no effect. if they change. ") (translator-property-description 'explicitClefVisibility procedure? "visibility-lambda function for clef changes.") -(translator-property-description 'explicitKeySignatureVisibility procedure? "visibility-lambda function for explicit Key changes.") + +(translator-property-description 'explicitKeySignatureVisibility +procedure? "visibility-lambda function for explicit Key changes; +\override of #'visibility-lambda will set the visibility for normal +(ie. at the start of the line) key signatures.") + + (translator-property-description 'followThread boolean? "if set, note heads are tracked across staff switches by a thin line") (translator-property-description 'forceClef boolean? "Show clef symbol, even if it hasn't changed.") diff --git a/stepmake/configure b/stepmake/configure index 0655a4f84e..5586f5f36d 100755 --- a/stepmake/configure +++ b/stepmake/configure @@ -1137,7 +1137,7 @@ fi PATHSEP=':' INSTALL="\$(SHELL) \$(stepdir)/../bin/install-dot-exe.sh -c" else - ROOTSEP='/' + ROOTSEP=':' DIRSEP='/' PATHSEP=':' LN=ln -- 2.39.2