<a href="http://appel.lilypond.org/wiki?LilyPondFaqs">Full FAQ</a><br>
<a href="@TOP@Documentation/user/out-www/lilypond/lilypond.html">User manual</a><br>
<a href="@TOP@Documentation/out-www/regression-test.html">Regression Test</a><br>
- <a href="http://appel.lilypond.org/wiki?LilyPondToDo">To do</a><br>
+ <a href="@TOP@Documentation/user/out-www/lilypond-internals/lilypond-internals.html">Documentation of internals</a><br>
<br>
</td></tr>
<tr><td bgcolor="#e8e8ff">
@lilypondfile[printfilename]{staccato-pos.ly}
-@lilypondfile[printfilename]{dyn-line.ly}
+@lilypondfile[printfilename]{dynamics-line.ly}
@lilypondfile[printfilename]{arpeggio.ly}
@item -f,--format=
Output format for sheet music. Choices are tex (for @TeX{}
output), ps (for PostScript) and scm (for a Scheme
-dump)
+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
+containing LilyPond metafont and .tex files. For processing the
+PostScript with Ghostscript, you have to set @var{GS_FONTPATH} to
+point to the directory containing LilyPond @file{pfa} files.
+
+Scripts to do this are included in
+@file{buildscripts/out/lilypond-profile} (for sh shells) and
+@file{buildscripts/out/lilypond-login} (for C-shells), and should
+normally be run as part of your login process.
+
@item -h,--help
Show a summary of usage.
@end ifinfo
+@ifhtml
+
+This document is also available as a @uref{../lilypond.ps.gz,gzipped
+postscript file}.
+
+@end ifhtml
+
@ifnottex
@node Top
@c FIXME: this should not be necessary...
fix all FIXMEs
Rhythm staff (clef, x-notehead)
- \partcombine: -> orchestral part-HOWTO.
+
markup text
+
postscript, scheme output?
+
(links to?) using/existance of ly2dvi, lilypond-book
+
@end ignore
* Lyrics::
* Chords::
* Writing parts::
+* Custodes::
* Page layout::
* Sound::
* Music entry::
tasks. With each concept will be explained to which of the three parts
it belongs.
-LilyPond input can be classified into three types:
+LilyPond input can be classified into three types:
@itemize @bullet
@item musical expressions: a musical expression is some combination of
rest, notes, lyrics
-@c . {Repeat}
+@c . {Repeats}
@node Repeats
@section Repeats
As you can see, LilyPond doesn't remember the timing information, nor
-are slurs or ties repeated. We hope to fix this after 1.4.
+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 nested repeats.
+meaningful for unfolded repeats.
@node Manual repeat commands
@subsection Manual repeat commands
@code{\ionian}, @code{\locrian}, @code{\aeolian}, @code{\mixolydian},
@code{\lydian}, @code{\phrygian}, and @code{\dorian} are also defined.
+This command sets @code{Staff.keySignature}.
+
+@cindex @code{keySignature}
@c . {Clef changes}
@subsubsection Clef changes
Supported clef-names include
-[todo]
+@itemize @bullet
+@item treble, violin, G, G2: G clef on 2nd line
+@item french: G clef on 1st line
+@item soprano: C clef on 1st line
+@item mezzosoprano: C clef on 2nd line
+@item alto: C clef on 3rd line
+@item tenor: C clef on 4th line
+@item baritone: C clef on 5th line
+@item varbaritone: F clef on 3rd line
+@item bass, F: F clef on 4th line
+@item subbass: F clef on 5th line
+@item percussion: percussion clef
+@end itemize
+[todo: ancient clefs]
+
+Supported associated symbols (for Staff.clefGlyph) are:
+
+@itemize @bullet
+@item clefs-C: modern style C clef
+@item clefs-F: modern style F clef
+@item clefs-G: modern style G clef
+@item clefs-vaticana_do: Editio Vaticana style do clef
+@item clefs-vaticana_fa: Editio Vaticana style fa clef
+@item clefs-medicaea_do: Editio Medicaea style do clef
+@item clefs-medicaea_fa: Editio Medicaea style fa clef
+@item clefs-mensural1_c: modern style mensural C clef
+@item clefs-mensural2_c: historic style small mensural C clef
+@item clefs-mensural3_c: historic style big mensural C clef
+@item clefs-mensural1_f: historic style traditional mensural F clef
+@item clefs-mensural2_f: historic style new mensural F clef
+@item clefs-mensural_g: historic style mensural G clef
+@item clefs-hufnagel_do: historic style hufnagel do clef
+@item clefs-hufnagel_fa: historic style hufnagel fa clef
+@item clefs-hufnagel_do_fa: historic style hufnagel combined do/fa clef
+@item clefs-percussion: modern style percussion clef
+@end itemize
+
+@emph{Modern style} means "as is typeset in current editions".
+@emph{Historic style} means "as was typeset or written in contemporary
+historic editions". @emph{Editio XXX style} means "as is/was printed in
+Editio XXX".
@c . {Time signature}
@node Time signature
@menu
* Beam::
* Slur ::
+* Phrasing slur::
* Ornaments::
* Grace notes::
* Bar check::
@menu
* Slur attachments::
-* Tie::
-* Tuplets::
-* Text spanner::
-* Ottava::
-* Span requests::
@end menu
A slur connects chords and is used to indicate legato. Slurs avoid
@c . {Tie}
+@menu
+* Tie::
+* Tuplets::
+* Text spanner::
+* Ottava::
+* Span requests::
+@end menu
+
@node Tie
@subsubsection Tie
tranposing midi property.
+instrument names
+
]
@c . {Rehearsal marks}
@cindex Rehearsal marks
@cindex mark
@cindex @code{\mark}
+@cindex @code{Mark_engraver}
@example
\mark @var{unsigned};
-@cindex @code{Mark_engraver}
\mark @var{string};
+ \mark ;
@end example
-Prints a mark over or under the staff.
+With this command, you can print a rehearsal mark above the system. You
+can provide a number, a string or a markup text as argument. If there is
+no argument, the property @code{rehearsalMark} is used and automatically
+incremented.
-[TODO: automatic increments]
+@lilypond[fragment,verbatim]
+\relative c'' {
+ c1 \mark "A2";
+ c1 \mark ;
+ c1 \mark ;
+ c1 \mark "12";
+ c1 \mark #'(music "scripts-segno") ;
+ c1
+}
+@end lilypond
@node Transpose
@subsection Transpose
@cindex condensing rests
+@c . {Custodes}
+@node Custodes
+@section Custodes
+@cindex Custos
+@cindex Custodes
+
+A @emph{custos} (plural: @emph{custodes}; latin word for "guard") is a
+staff context symbol that appears at the end of a staff line. It
+anticipates the pitch of the first note(s) of the following line and
+thus helps the player or singer to manage line breaks during
+performance, thus enhancing readability of a score.
+
+@quotation
+@lilypond[verbatim]
+\score {
+ \notes { c'1 d' e' d' \break c' d' e' d' }
+ \paper {
+ \translator {
+ \StaffContext
+ \consists Custos_engraver;
+ Custos \override #'style = #'mensural;
+ }
+ }
+}
+@end lilypond
+@end quotation
+
+Custodes were frequently used in music notation until the 16th century.
+There were different appearences for different notation styles.
+Nowadays, they have survived only in special forms of musical notation
+such as via the editio vaticana dating back to the beginning of the 20th
+century.
+
+For typesetting custodes, just put a @code{Custos_engraver} into the
+@code{StaffContext} when declaring the @code{\paper} block. In this
+block, you can also globally control the appearance of the custos symbol
+by setting the custos @code{style} property. Currently supported styles
+are @code{vaticana}, @code{medicaea}, @code{hufnagel} and
+@code{mensural}.
+
+@quotation
+\paper @{
+ \translator @{
+ \StaffContext
+ \consists Custos_engraver;
+ Custos \override #'style = #'mensural;
+ @}
+@}
+@end quotation
+
+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 . {Page layout}
@node Page layout
@lilypond[fragment,verbatim]
\relative c'' { c4
- \context Staff \outputproperty
- #(make-type-checker 'note-head-interface)
- #'extra-offset = #'(0.5 . 0.75)
-<c8 e g> }
+ \context Staff \outputproperty
+ #(make-type-checker 'note-head-interface)
+ #'extra-offset = #'(0.5 . 0.75)
+ <c8 e g> }
@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.
+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,
MAJOR_VERSION=1
MINOR_VERSION=3
PATCH_LEVEL=129
-MY_PATCH_LEVEL=jcn2
+MY_PATCH_LEVEL=jcn3
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
MFINPUTS="@datadir@/mf:"${MFINPUTS:=":"}
TEXINPUTS="@datadir@/tex:@datadir@/ps:"${TEXINPUTS:=":"}
+
+## gs_lib ???
export LILYINCLUDE LILYPONDPREFIX MFINPUTS TEXINPUTS GS_LIB GS_FONTPATH
+lilypond1.3 (1.3.129-1) unstable; urgency=low
+
+ * In memory of Werner Icking + (August 26, 1943 - February 8, 2001),
+ a dear friend, a kind educator, and a hard worker in sharing beautiful
+ typeset music to the world. (Maintainer of the GMD Music Archive,
+ http://www.gmd.de/Misc/Music/).
+
+ * New upstream release.
+ * Upstream has changed from "lilypond-mode" to the "studly caps name"
+ "LilyPond-mode". Fixed /etc/emacs/site-start.d/50lilypond1.3.el
+ (debian/emacsen-startup). Thanks to Christophe Rhodes for the bug
+ report. Closes: Bug#83732.
+ * Added "Build-Conflicts: lilypond, lilypond1.3" to prevent old
+ lilypond font files from potentially interfering with the build on
+ other Debian ports autobuilders.
+ * Built with libguile-dev (1:1.4-9) or newer to ensure correct
+ linkage to libqthreads.so.9. Also updated the Build-Depends and
+ Depends fields accordingly. Thanks to guile1.4 package maintainer
+ Rob Browning for his notification and to Daniel Burrows for his bug
+ report. Closes: Bug#85896.
+
+ -- Anthony Fok <foka@debian.org> Sat, 10 Feb 2001 01:38:36 -0700
+
lilypond1.3 (1.3.121-1) unstable; urgency=low
* New upstream release.
Source: lilypond1.3
-Build-Depends: debhelper (>= 2.0.72), python-base (>= 1.5.2-4), libguile9-dev, tetex-bin, libkpathsea-dev, tetex-extra, flex, bison, texinfo (>= 4.0-1), bibtex2html, groff, gs, netpbm, pnmtopng, m4, gettext (>= 0.10.35-13)
+Build-Depends: debhelper (>= 2.0.72), python-base (>= 1.5.2-4), libguile-dev (>= 1:1.4-9), tetex-bin, libkpathsea-dev, tetex-extra, flex, bison, texinfo (>= 4.0-1), bibtex2html, groff, gs, netpbm, pnmtopng, m4, gettext (>= 0.10.35-13)
+Build-Conflicts: lilypond, lilypond1.3
Section: tex
Priority: optional
Maintainer: Anthony Fok <foka@debian.org>
Architecture: any
Replaces: lilypond
Provides: lilypond
-Depends: ${shlibs:Depends}, tetex-bin (>= 1.0.5-1), python-base (>= 1.5.2-4), guile
+Depends: ${shlibs:Depends}, tetex-bin (>= 1.0.5-1), python-base (>= 1.5.2-4), guile1.4
Recommends: tetex-extra (>= 1.0-1)
Conflicts: lilypond, musixtex-fonts
Description: A program for printing sheet music.
-(autoload 'lilypond-mode "lilypond-mode" nil t)
-(setq auto-mode-alist (cons '("\\.ly$" . lilypond-mode) auto-mode-alist))
-(add-hook 'lilypond-mode-hook (lambda () (turn-on-font-lock)))
+(autoload 'LilyPond-mode "lilypond-mode" nil t)
+(setq auto-mode-alist (append '(("\\.ly$" . LilyPond-mode) auto-mode-alist)))
+(add-hook 'LilyPond-mode-hook (lambda () (turn-on-font-lock)))
\score{
\context Staff <
- \context Voice=one\skip 1;
- \context Voice=two\skip 1;
+ \context Voice=one \skip 1;
+ \context Voice=two \skip 1;
\context Voice=one \partcombine Voice
\context Thread=one \notes\relative c'' {
c2 \clef bass; c2
-
-% y-pos of f is wrong
-
-\score {
- \notes \relative c' \context Voice = viola {
- <c4-\f g' c>
- \stemDown g'8. b,16
- s1 s2. r4
- g }
-}
--- /dev/null
+%{
+instrument names on grandstaffs. GR is centered on entire score
+%}
+
+\version "1.3.129"
+\include "paper20.ly"
+\header{
+ latexpackages = "amsmath";
+}
+
+\score{
+ \notes <
+ \context Staff = sa {\property Staff.instrument = "A" g,2 c''''2}
+ \context Staff = sb {\property Staff.instrument = "B" g,2 c''''2}
+ \context GrandStaff=gs <
+ \property GrandStaff.instrument = "Gr"
+ \context Staff = ga {\property Staff.instrument = "" c''1 }
+ \context Staff = gb {\property Staff.instrument = "" c''1 }
+ >
+ \context Staff = sc {\property Staff.instrument = "foobar"
+% "\small$\mathrm{\genfrac{}{}{0pt}{0}{C}{D}}$"
+
+<g'1 c''> }
+ \context Staff = sd {\property Staff.instrument = "E" c''1 }
+
+ >
+ \paper{
+ \translator {
+ \StaffContext
+ \consists "Instrument_name_engraver";
+ }
+ \translator {
+ \GrandStaffContext
+ \consists "Instrument_name_engraver";
+ }
+
+ }
+}
+
+
+
+
-\header{
-texidoc="
-Adding a @code{Bar_engraver} to the LyricsVoice context makes sure that
-lyrics don't collide with barlines.
-";
-}
-
-\score {
- \context StaffGroup <
- \notes \context Staff {
- b1 b1 \bar "|.";
- }
- \lyrics\context Lyrics <
- \context LyricsVoiceWithBars {
-% thisContextHasSpanBarEngraver1 added
- ThisContextCertainlyHasSpanBarEngraverAddedButTheresSomethingFunny1. Here.
- }
- \context LyricsVoice {
- this4 one has no SpanBarEngraverAddedToContext1
- }
- >
- \notes \context Staff = SB { b1 b1 }
- >
- \paper {
- linewidth = -1.0\cm;
- \translator {
- \LyricsContext
- \consists "Span_bar_engraver";
- \accepts "LyricsVoiceWithBars";
- }
- \translator {
- \LyricsVoiceContext
- \name "LyricsVoiceWithBars";
- }
- \translator {
- \LyricsVoiceContext
- }
- }
-}
-% dynamics collide with staff
+% dynamics should not collide with staff
+% dynamics (of two voices) should not collide with eachother
\header {
texidoc="Template for part-combining orchestral scores";
}
-End = { \skip 1*6; }
+End = { \skip 1*8; }
violoncello = \notes\relative c'' {
c1\ff d e \break
c1\ff d e \break
+
+ \property Voice.crescendoText = #"cresc."
+ \property Voice.crescendoSpanner = #'dashed-line
+ g4\p\< r r r8 g(|
+ )c,4 r r r8 c|
+ [\!f8\sf(\>as f as][f g d)\!g]|
}
contrabasso = \notes\relative c'' {
c1\pp d e
c2\pp c d1 e
+
+ \property Voice.crescendoText = #"cresc."
+ \property Voice.crescendoSpanner = #'dashed-line
+ g4\p\< r r r8 g(|
+ )c,4 r r r8 c|
+ [\!f8\sf(\>as f as][f g d)\!g]|
}
flautiStaff = \notes \context Staff = flauti <
--- /dev/null
+\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
+ }
+ }
+}
+
-\header{
-texidoc="
-Dynamics appear below or above the staff. If multiple dynamics are
-linked with (de)crescendi, they should be on the same line.
-";
-}
-\score{
-\notes\relative c''{
-a1\fff\> \!c,,\pp a'' a\p
-
-
-% We need this to test if we get two Dynamic line spanners
-a
-
-% because do_removal_processing ()
-% doesn't seem to post_process elements
-d\f
-
-a
-
-}
-\paper{
-}
-\midi{
-\tempo 1 = 60;
-}
-}
--- /dev/null
+\header{
+texidoc=" Dynamics appear below or above the staff. If multiple
+dynamics are linked with (de)crescendi, they should be on the same
+line. Isolated dynamics may be forced up or down. ";
+}
+
+\version "1.3.122";
+
+\score{
+\notes\relative c''{
+a1^\sfz
+a1-\fff\> \!c,,-\pp a'' a-\p
+
+% We need this to test if we get two Dynamic line spanners
+a
+
+% because do_removal_processing ()
+% doesn't seem to post_process elements
+d\f
+
+a
+
+}
+\paper{
+}
+\midi{
+\tempo 1 = 60;
+}
+}
-\score {
- \context Voice \notes\relative c {
- c''4 \p c \ff c^\ff
- \property Voice.dynamicPadding = 10
- c \p \< \! c \ff\> c \!c-\p
-
- }
- \paper { }
- \midi { }
-}
--- /dev/null
+\header{
+texidoc="
+Adding a @code{Bar_engraver} to the LyricsVoice context makes sure that
+lyrics don't collide with barlines.
+";
+}
+
+\score {
+ \context StaffGroup <
+ \notes \context Staff {
+ b1 b1 \bar "|.";
+ }
+ \lyrics\context Lyrics <
+ \context LyricsVoiceWithBars {
+% thisContextHasSpanBarEngraver1 added
+ ThisContextCertainlyHasSpanBarEngraverAddedButTheresSomethingFunny1. Here.
+ }
+ \context LyricsVoice {
+ this4 one has no SpanBarEngraverAddedToContext1
+ }
+ >
+ \notes \context Staff = SB { b1 b1 }
+ >
+ \paper {
+ linewidth = -1.0\cm;
+ \translator {
+ \LyricsContext
+ \accepts "LyricsVoiceWithBars";
+ }
+ \translator {
+ \LyricsVoiceContext
+ \consists "Bar_engraver";
+ \name "LyricsVoiceWithBars";
+ }
+
+ }
+}
global = \notes {
s1 | \mark "A";
s1 | \mark ;
+ s1 | \mark ;
s1 | \mark "12";
s1 | \mark ;
s1 | \mark "A2";
--- /dev/null
+
+\header {
+
+ texidoc = "By splitting the grouping (Axis_group_engraver) and
+creation functionality into separate contexts, you can override
+interesting things. You can also drop the \consistsend feature.";
+
+}
+
+
+\score {
+ \notes <
+ \context StaffContainer = SA { \property StaffContainer.StaffSymbol \set
+ #'staff-space = #0.8
+ \context Staff { c4 c4 } }
+ \context StaffContainer =SB { \context Staff { d f } }
+ >
+
+\paper {
+ \translator {
+ \ScoreContext
+ \accepts StaffContainer;
+ \denies Staff;
+ }
+ \translator {
+ \type Engraver_group_engraver;
+ \consists "Axis_group_engraver";
+ \accepts "Staff";
+ \name StaffContainer;
+
+ }
+ \translator {
+ \StaffContext
+ \remove Axis_group_engraver;
+ }
+}
|| Slur::has_interface (i.elem_l_)
/*
Usually, dynamics are removed by *_devnull_engravers for the
- second voice. We don't want all dynamics for the first voice
- to be placed above the staff. */
+ second voice. On the one hand, we don't want all dynamics for
+ the first voice to be placed above the staff. On the other
+ hand, colliding of scripts may be worse */
#if 0
|| i.elem_l_->has_interface (ly_symbol2scm ("dynamic-interface"))
|| i.elem_l_->has_interface (ly_symbol2scm ("text-interface"))
Link_array<Grob> elems;
Link_array<Grob> all_grobs
- = Pointer_group_interface__extract_elements ( me, (Grob*) 0, "elements");
+ = Pointer_group_interface__extract_elements (me, (Grob*) 0, "elements");
for (int i=0; i < all_grobs.size(); i++)
{
Interval y = all_grobs[i]->extent(me, a);
&& gh_number_p (gh_cdr (min_dims)))
{
y.unite (ly_scm2interval (min_dims));
-
}
SCM extra_dims = e->remove_grob_property ("extra-space");
SCM size = me->get_grob_property ("bar-size");
if (gh_number_p (size))
return gh_double2scm (gh_scm2double(size)*ss);
- else
+ else if (Staff_symbol_referencer::staff_symbol_l (me))
{
+ /*
+ If there is no staff-symbol, we get -1 from the next
+ calculation. That's a nonsense value, which would collapse the
+ barline so we return 0.0 in the next alternative.
+ */
return gh_double2scm ((Staff_symbol_referencer::line_count (me) -1) * ss);
}
+ else
+ return gh_int2scm (0);
}
virtual void acknowledge_grob (Grob_info);
virtual bool try_music (Music *req_l);
virtual void stop_translation_timestep ();
-
- virtual void create_grobs ();
+ virtual void process_music ();
virtual void start_translation_timestep ();
};
}
void
-Dynamic_engraver::create_grobs ()
+Dynamic_engraver::process_music ()
{
if (accepted_spanreqs_drul_[START] || accepted_spanreqs_drul_[STOP] || script_req_l_)
{
/*
finish side position alignment if the (de)cresc ends here, and
there are no new dynamics.
-
- */
+ */
if ( !cresc_p_)
{
cresc_p_->set_bound (RIGHT, script_p_
? script_p_
: unsmob_grob (get_property ("currentMusicalColumn")));
+ add_bound_item (line_spanner_, cresc_p_->get_bound (RIGHT));
+
finished_cresc_p_ = cresc_p_;
cresc_p_ = 0;
current_cresc_req_ = 0;
}
}
+
if (accepted_spanreqs_drul_[START])
{
if (current_cresc_req_)
/*
TODO: Use symbols.
- */
+ */
String start_type = ly_scm2string (accepted_spanreqs_drul_[START]->get_mus_property ("span-type"));
/*
ugh. Use push/pop?
- */
+ */
SCM s = get_property ((start_type + "Spanner").ch_C());
if (!gh_symbol_p (s) || s == ly_symbol2scm ("hairpin"))
{
cresc_p_ = new Spanner (get_property ("Hairpin"));
cresc_p_->set_grob_property ("grow-direction",
- gh_int2scm ((start_type == "crescendo")
- ? BIGGER : SMALLER));
+ gh_int2scm ((start_type == "crescendo")
+ ? BIGGER : SMALLER));
}
/*
This is a convenient (and legacy) interface to TextSpanners
for use in (de)crescendi.
Hmm.
- */
+ */
else
{
cresc_p_ = new Spanner (get_property ("TextSpanner"));
if (gh_string_p (s))
{
cresc_p_->set_grob_property ("edge-text",
- gh_cons (s, ly_str02scm ("")));
+ gh_cons (s, ly_str02scm ("")));
daddy_trans_l_->set_property (start_type + "Text",
SCM_UNDEFINED);
}
: unsmob_grob (get_property ("currentMusicalColumn")));
Axis_group_interface::add_element (line_spanner_, cresc_p_);
+
+ add_bound_item (line_spanner_, cresc_p_->get_bound (LEFT));
+
announce_grob (cresc_p_, accepted_spanreqs_drul_[START]);
}
}
- script_req_l_ = 0;
- accepted_spanreqs_drul_[START] = 0;
- accepted_spanreqs_drul_[STOP] = 0;
}
void
Dynamic_engraver::stop_translation_timestep ()
{
typeset_all ();
+ if (script_req_l_ && !current_cresc_req_)
+ {
+ finished_line_spanner_ = line_spanner_;
+ line_spanner_ =0;
+ typeset_all ();
+ }
}
void
{
if (finished_cresc_p_)
{
-#if 1
- finished_cresc_p_->set_bound (RIGHT, script_p_
- ? script_p_
- : unsmob_grob (get_property ("currentMusicalColumn")));
-#endif
+ if (!finished_cresc_p_->get_bound (RIGHT))
+ {
+ finished_cresc_p_->set_bound (RIGHT, script_p_
+ ? script_p_
+ : unsmob_grob (get_property ("currentMusicalColumn")));
+
+ if (finished_line_spanner_)
+ add_bound_item (finished_line_spanner_,
+ finished_cresc_p_->get_bound (RIGHT));
+ }
typeset_grob (finished_cresc_p_);
finished_cresc_p_ =0;
}
}
if (finished_line_spanner_)
{
+ /*
+ To make sure that this works
+ */
Side_position::add_staff_support (finished_line_spanner_);
- extend_spanner_over_elements (finished_line_spanner_);
+ /*
+ We used to have
+
+ extend_spanner_over_elements (finished_line_spanner_);
+
+ but this is rather kludgy, since finished_line_spanner_
+ typically has a staff-symbol field set , extending it over the
+ entire staff.
+
+ */
+
+ if (!finished_line_spanner_->get_bound (RIGHT))
+ finished_line_spanner_->set_bound (RIGHT, finished_line_spanner_->get_bound (LEFT));
+
typeset_grob (finished_line_spanner_);
finished_line_spanner_ = 0;
}
Paper_column *
Item::column_l () const
{
- return dynamic_cast<Item*> (parent_l (X_AXIS))->column_l ();
+ Item *parent = dynamic_cast<Item*> (parent_l (X_AXIS));
+ return parent ? parent->column_l () : 0;
}
Line_of_score *
virtual bool try_music (Music *req_l);
virtual void start_translation_timestep ();
virtual void initialize ();
- virtual void create_grobs ();
+ virtual void process_music ();
private:
Mark_req * mark_req_l_;
return false;
}
+
+/*
+
+ TODO: make the increment function in Scheme.
+
+*/
void
-Mark_engraver::create_grobs ()
+Mark_engraver::process_music ()
{
if (mark_req_l_)
{
(c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
+#include <math.h>
#include "misc.hh"
#include "dots.hh"
Real inter_f = Staff_symbol_referencer::staff_space (me)/2;
int sz = Staff_symbol_referencer::line_count (me)-1;
- int p = (int)Staff_symbol_referencer::position_f (me);
+ int p = (int) rint (Staff_symbol_referencer::position_f (me));
int streepjes_i = abs (p) < sz
? 0
: (abs(p) - sz) /2;
sp->set_bound (RIGHT, it);
}
+/*
+ Extends EXTREMAL_PAIR to include IT
+ */
static void
extend_spanner_over_item (Item *it, SCM extremal_pair)
{
}
}
+/*
+ Extends EXTREMAL_PAIR to include every grob in VALUE
+ */
static void
extend_spanner_over_elements (SCM value, SCM extremal_pair)
{
#include "staff-symbol-referencer.hh"
#include "staff-symbol.hh"
#include "paper-def.hh"
-
+
bool
Staff_symbol_referencer::has_interface (Grob*e)
{
bool
Staff_symbol_referencer::on_staffline (Grob*me)
{
- return on_staffline (me, (int) position_f (me));
+ return on_staffline (me, (int) rint (position_f (me)));
}
bool
+\version "1.3.122"
-\version "1.3.110"
- %
+%
% setup for Request->Element conversion. Guru-only
%
\consists "Local_key_engraver";
\consists "Piano_pedal_engraver";
- \consistsend "Axis_group_engraver";
-
%{
The Instrument_name_engraver puts the name of the instrument
(\property Staff.instrument; Staff.instr for subsequent lines)
\consists "Instrument_name_engraver";
%}
+ \consistsend "Axis_group_engraver";
\accepts "Voice";
}
+
+StaffContainerContext = \translator {
+ \type Engraver_group_engraver;
+ \consists "Axis_group_engraver";
+ \accepts Staff;
+ \name StaffContainer;
+}
+
ChoirStaffContext = \translator {
\type "Engraver_group_engraver";
\name ChoirStaff;
\consists "Output_property_engraver";
\consists "Arpeggio_engraver";
- \consists "Dynamic_engraver"; % must come before text_engraver.
\consists "Text_spanner_engraver";
\consists "Property_engraver";
\consists "Chord_tremolo_engraver";
\consists "Melisma_engraver";
+
+%{
+ Must come before text_engraver, but after note_column engraver.
+
+%}
+ \consists "Dynamic_engraver";
\consists "Text_engraver";
- \consists "A2_engraver";
- \consists "Voice_devnull_engraver";
\consists "Script_engraver";
\consists "Script_column_engraver";
\consists "Tie_engraver";
\consists "Tuplet_engraver";
\consists "Grace_position_engraver";
+ \consists "A2_engraver";
+ \consists "Voice_devnull_engraver";
+
\consists "Skip_req_swallow_translator";
\accepts Thread; % bug if you leave out this!
\accepts Grace;
\consists "Bar_number_engraver";
\consists "Span_arpeggio_engraver";
-
- \accepts "Staff";
+ \accepts "Staff";
+ \accepts "StaffContainer";
\accepts "StaffGroup";
\accepts "RhythmicStaff";
\accepts "Lyrics";
\translator { \ThreadContext}
\translator { \PianoStaffContext}
\translator { \LyricsVoiceContext }
-
+\translator { \StaffContainerContext }
chmod -w $@
# don't do ``cd $(outdir)'', and assume that $(outdir)/.. is the src dir.
-# it is not, for --scrdir builds
+# it is not, for --srcdir builds
$(outdir)/%.texi: %.tely
rm -f $@
LILYPONDPREFIX=$(LILYPONDPREFIX)/.. $(PYTHON) $(script-dir)/lilypond-book.py --outdir=$(outdir) -I $(pwd) -I $(input-dir)/tricks/ -I $(input-dir)/regression/ -I $(input-dir)/test/ --dependencies --format=texi $<
(direction . 1)
(font-family . roman)
(font-relative-size . -1)
+ (Y-offset-callbacks . (,Side_position::aligned_side))
(meta . ,(grob-description "BarNumber"
+ side-position-interface
text-interface font-interface break-aligned-interface))
))
#'thickness= weight of beams, in staffspace
"
- '(
+ '(auto-knee-gap
staff-position
height
flag-width-function