<a name="other-users">
@end html
-@unnumberedsubsec Information for other users
+@unnumberedsubsec Information for users
@itemize @bullet
@c download sites?
-@c NEWS
-
@c archives?
@item @uref{../user/out-www/lilypond-internals/lilypond-internals.html,lilypond-internals}
-Documentation of internals, generated from the sources.
-
+Documentation of internals, generated from the sources. If you want to
+fine-tune output, you need the information in this document.
@item @uref{../user/out-www/lilypond/lilypond.html,lilypond}
The user manual, (in @uref{../user/out-www/lilypond.ps.gz,PostScript})
@item @uref{../user/out-www/glossary.html,glossary} A glossary of musical
@itemize @bullet
@item @uref{../topdocs/out-www/AUTHORS.html, Authors} documents who did
what on LilyPond.
-
-@item @uref{../misc/out-www/CHANGES-0.0.html, Change logs from 0.0 till 0.1 }
-@item @uref{../misc/out-www/CHANGES-0.1.html, Change logs from 0.1 till 1.0 }
-@item @uref{../misc/out-www/CHANGES-1.0.html, Change logs from 1.0 till 1.1 }
-@item @uref{../misc/out-www/CHANGES-1.1.html, Change logs from 1.1 till
-1.2 }
-@item @uref{../misc/out-www/CHANGES-1.2.html, Change logs from 1.2 till 1.3 }
-@item @uref{../misc/out-www/NEWS-1.2.html, summary of changes from 1.1 till 1.2 }
-@item @uref{../misc/out-www/ANNOUNCE-0.1.html, Announcement of 0.1 (includes summary of
-changes)}
-@item @uref{../misc/out-www/ANNOUNCE-1.0.html, Announcement of 1.0 (includes summary of
-changes)}
-@item @uref{../misc/out-www/ANNOUNCE-1.2.html, Announcement of 1.2 (includes summary of changes)}
-@item @uref{../misc/out-www/AIMS.html, Why LilyPond?}
-@item @uref{../misc/out-www/interview.html, Answers} to the Brave GNU world standard questions.
-@item @uref{../windows/out-www/lily-wins.html, Lily Wins}
+@item @uref{../out-www/NEWS.txt,NEWS} summary of changes for 1.4
+@item @uref{../misc/out-www/CHANGES-0.0.html, CHANGES-0.0} Change logs from 0.0 till 0.1
+@item @uref{../misc/out-www/CHANGES-0.1.html, CHANGES-0.1} Change logs from 0.1 till 1.0
+@item @uref{../misc/out-www/CHANGES-1.0.html, CHANGES-1.0} Change logs from 1.0 till 1.1
+@item @uref{../misc/out-www/CHANGES-1.1.html, CHANGES-1.1} Change logs from 1.1 till
+1.2
+@item @uref{../misc/out-www/CHANGES-1.2.html, CHANGES-1.2} Change logs from 1.2 till 1.3
+@item @uref{../misc/out-www/NEWS-1.2.html, NEWS-1.2} summary of changes from 1.1 till 1.2
+@item @uref{../misc/out-www/ANNOUNCE-0.1.html, ANNOUNCE-0.1} Announcement of 0.1 (includes summary of
+changes)
+@item @uref{../misc/out-www/ANNOUNCE-1.0.html, ANNOUNCE-1.0} Announcement of 1.0 (includes summary of
+changes)
+@item @uref{../misc/out-www/ANNOUNCE-1.2.html, ANNOUNCE-1.2} Announcement of 1.2 (includes summary of changes)
+@item @uref{../misc/out-www/AIMS.html, AIMS} Why LilyPond?
+@item @uref{../misc/out-www/interview.html, interview} Answers to the Brave GNU world standard questions.
+@item @uref{../windows/out-www/lily-wins.html, lily-wins} musings on the
+Windows installer
@end itemize
@unnumberedsubsec Literature
Ending a staff or score with grace notes may also generate a run-time
error, since there will be no main note to attach the grace notes to.
-Combining grace notes and clef changes will prints note heads on
-erroneous vertical positions.
-
The present implementation of grace notes is not robust and generally
kludgey. We expect it to change after LilyPond 1.4. Syntax changes might
also be implemented.
-
-
@menu
* Glissando ::
* Dynamics::
is to be expected that more functionality -- especially for the MIDI
backend -- will be implemented at some point in the future.
+Volta repeats are printed over all staffs in a score. You must turn them
+off explicitly, for example by doing
+@example
+ \property Staff.VoltaBracket = \turnOff
+@end example
+
@node Manual repeat commands
@subsection Manual repeat commands
New features in 1.4
-* Finale (.etf), PMX, Musedata and Mup import tools.
-
-* Point and click functionality using emacs and Xdvi.
-
-* Comprehensive documentation, including tutorial.
-
-* Self-documenting: generated internal documentation.
-* Includes an extensive glossary of musical terms.
+DESIGN
-* Improved design and implementation: Complete rewrite of the
-internals: LilyPond is smaller, cleaner, more flexible, etc.
- - More pervasive GUILE integration resulting in:
+* More pervasive GUILE integration resulting in improved design and
+implementation. LilyPond is smaller, cleaner, more flexible, etc.
- Improved speed with comparable memory footprint
- Improved robustness: Lily almost never crashes.
+ - Access to internal music representation
+
* New font selection scheme similar to Latex-NFSS.
-* Medieval notation features: clefs, custodes
+* Flexible formatting mechanism for musical texts.
+
+* Chordnames are now configurable in every respect
+
+* Part combining for orchestral scores and hymns: two voices are
+ combined into a staff automatically, including Solo/a2
+ indications as appropriate.
-* Piano pedal support, Arpeggios, Glissandi
-* MIDI: dynamics, tempo changes
+ERGONOMICS
-* Typography: More elegant slurs, aligned dynamics, text crescendos,
+* Point and click functionality using emacs and Xdvi.
+
+* Rewritten Emacs mode
+
+* Cleaned up syntax details
+
+* Comprehensive documentation, including a rewritten tutorial.
+
+* All properties have doc strings, and internal documentation is
+generated automatically.
+
+* Windows point-and-click installer
+
+
+NOTATION FEATURES
+
+* Piano pedals, Arpeggios, Glissandi, many more note head
+shapes, Medieval clefs, custodes.
* Better lyrics placement: Automatical phrasing, melisma alignment,
and stanza numbering.
-* Part combining for orchestral scores and hymns: two voices are
- combined into a staff automatically, including Solo/a2
- indications as appropriate.
+* Typography: More elegant slurs, aligned dynamics, text crescendos,
-* Chordnames are now configurable in every respect
+* Easy-play note heads
-* Easy-play notation
-* Finished ouverture Coriolan as full orchestral score example.
+MIDI
+
+* dynamics, tempo changes in the MIDI output
+
+
+MISC
+
+* Finale (.etf), PMX, Musedata and Mup import tools.
* Mutopia ports collection: easy accessible music archive.
* ASCIIScript: ASCII-art output
-* Translations into Japanese, French and Russian
-
-* Many bugfixes.
+* Improved standalone postscript layout.
+* Translations into Japanese, French and Russian
-Removed features
+* Many many many bugfixes.
-* margin shape
SCM prev_cpos_;
SCM prev_octavation_;
void create_clef ();
- void set_central_c (SCM, SCM, SCM);
void set_glyph ();
void inspect_clef_properties ();
};
prev_cpos_ = prev_glyph_ = SCM_BOOL_F;
}
-void
-Clef_engraver::set_central_c (SCM glyph,SCM clefpos, SCM octavation)
-{
- prev_cpos_ = clefpos;
- prev_glyph_ = glyph;
- prev_octavation_ = octavation;
-
- SCM p = get_property ("clefPitches");
- int c0_position = 0;
- if (gh_list_p (p))
- {
- SCM found = scm_assoc (glyph, p);
- if (found == SCM_BOOL_F)
- {
- c0_position =0;
- }
- else
- {
- c0_position = gh_scm2int (gh_cdr (found));
-
- if (gh_number_p (octavation))
- c0_position -= gh_scm2int (octavation);
-
- if (gh_number_p (clefpos))
- c0_position += gh_scm2int (clefpos);
- }
-
- }
- daddy_trans_l_->set_property ("centralCPosition", gh_int2scm (c0_position));
-}
-
void
Clef_engraver::set_glyph ()
{
)
{
set_glyph ();
- set_central_c (glyph, clefpos, octavation);
-
create_clef ();
clef_p_->set_grob_property ("non-default", SCM_BOOL_T);
+
+ prev_cpos_ = clefpos;
+ prev_glyph_ = glyph;
+ prev_octavation_ = octavation;
+
}
if (to_boolean (force_clef))
}
}
+
void
Clef_engraver::stop_translation_timestep ()
{
{
public:
static void add_spacing_unit (Grob*me, Item*);
+ static void find_rods (Item*, SCM);
static void set_interface (Grob*);
+ static bool has_interface (Grob*);
DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM ));
};
#include "dimensions.hh"
#include "group-interface.hh"
-static void
-do_rod (Item *l, Item *r)
+void
+Separating_group_spanner::find_rods (Item * r, SCM next)
{
- Rod rod;
-
- Interval li (Separation_item::my_width (l));
Interval ri (Separation_item::my_width (r));
+ if (ri.empty_b ())
+ return;
+
+ /*
+ This is an inner loop, however, in most cases, the interesting L
+ will just be the first entry of NEXT, making it linear in most of
+ the cases. */
+ for(; gh_pair_p (next); next = gh_cdr (next))
+ {
+ Item *l = dynamic_cast<Item*> (unsmob_grob (gh_car( next)));
+ Item *lb = l->find_prebroken_piece (RIGHT);
+
+ if (lb)
+ {
+ Interval li (Separation_item::my_width (lb));
- rod.item_l_drul_[LEFT] =l;
- rod.item_l_drul_[RIGHT]=r;
+ if (!li.empty_b ())
+ {
+ Rod rod;
- if (li.empty_b () || ri.empty_b ())
- rod.distance_f_ = 0;
- else
- rod.distance_f_ = li[RIGHT] - ri[LEFT];
+ rod.item_l_drul_[LEFT] = lb;
+ rod.item_l_drul_[RIGHT] = r;
- rod.columnize ();
- rod.add_to_cols ();
+ rod.distance_f_ = li[RIGHT] - ri[LEFT];
+
+ rod.columnize ();
+ rod.add_to_cols ();
+ }
+ }
+
+ Interval li (Separation_item::my_width (l));
+ if (!li.empty_b ())
+ {
+ Rod rod;
+
+ rod.item_l_drul_[LEFT] =l;
+ rod.item_l_drul_[RIGHT]=r;
+
+ rod.distance_f_ = li[RIGHT] - ri[LEFT];
+
+ rod.columnize ();
+ rod.add_to_cols ();
+
+ break;
+ }
+ else
+ /*
+ this grob doesn't cause a constraint. We look further until we
+ find one that does. */
+ ;
+ }
}
-
+
MAKE_SCHEME_CALLBACK (Separating_group_spanner,set_spacing_rods,1);
SCM
Separating_group_spanner::set_spacing_rods (SCM smob)
/*
Order of elements is reversed!
*/
- SCM elt = gh_cadr (s);
- SCM next_elt = gh_car (s);
+ SCM elt = gh_car (s);
+ Item *r = dynamic_cast<Item*> (unsmob_grob (elt));
- Item *l = dynamic_cast<Item*> (unsmob_grob (elt));
- Item *r = dynamic_cast<Item*> (unsmob_grob (next_elt));
-
- if (!r || !l)
+ if (!r)
continue;
-
- Item *lb
- = dynamic_cast<Item*> (l->find_prebroken_piece (RIGHT));
Item *rb
= dynamic_cast<Item*> (r->find_prebroken_piece (LEFT));
- do_rod (l, r);
- if (lb)
- {
- do_rod (lb, r);
- }
-
+ find_rods (r, gh_cdr (s));
if (rb)
- {
- do_rod (l, rb);
- }
-
- if (lb && rb)
- {
- do_rod (lb, rb);
-
- }
+ find_rods (rb, gh_cdr (s));
}
/*
void
Separating_group_spanner::set_interface (Grob*)
{
+}
+bool
+Separating_group_spanner::has_interface (Grob*)
+{//todo
+ assert (false);
}
Separating_line_group_engraver::initialize ()
{
sep_span_p_ = new Spanner (get_property ("SeparatingGroupSpanner"));
- Separating_group_spanner::set_interface (sep_span_p_);
+
announce_grob (sep_span_p_, 0);
sep_span_p_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
}
voltaVisibility = ##t
% name, glyph id, clef position
% where is c0 in this clef?
- clefPitches = #'(("clefs-G" . -4)
- ("clefs-C" . 0)
- ("clefs-F" . 4)
- ("clefs-vaticana_do" . 0)
- ("clefs-vaticana_fa" . 4)
- ("clefs-medicaea_do" . 0)
- ("clefs-medicaea_fa" . 4)
- ("clefs-hufnagel_do" . 0)
- ("clefs-hufnagel_fa" . 4)
- ("clefs-hufnagel_do_fa" . 0)
- ("clefs-mensural1_c" . 0)
- ("clefs-mensural2_c" . 0)
- ("clefs-mensural3_c" . 0)
- ("clefs-mensural1_f" . 4)
- ("clefs-mensural2_f" . 4)
- ("clefs-mensural_g" . -4))
clefGlyph = #"clefs-G"
clefPosition = #-2
-
+ centralCPosition = #-6
+
automaticPhrasing = ##t
alignmentReference = #-1 % \down
defaultBarType = #"|"
-;;
+
;; (name . (glyph clef-position octavation))
-;; -- the name clefOctavation is misleading the value 7 is 1 octave not 7 Octaves.
;;
+;; -- the name clefOctavation is misleading. The value 7 is 1 octave, not 7 Octaves.
+
(define supported-clefs '(
("treble" . ("clefs-G" -2 0))
("violin" . ("clefs-G" -2 0))
)
)
+; "an alist mapping GLYPHNAME to the position of the central C for that symbol")
+(define c0-pitch-alist
+ '(("clefs-G" . -4)
+ ("clefs-C" . 0)
+ ("clefs-F" . 4)
+ ("clefs-vaticana_do" . 0)
+ ("clefs-vaticana_fa" . 4)
+ ("clefs-medicaea_do" . 0)
+ ("clefs-medicaea_fa" . 4)
+ ("clefs-hufnagel_do" . 0)
+ ("clefs-hufnagel_fa" . 4)
+ ("clefs-hufnagel_do_fa" . 0)
+ ("clefs-mensural1_c" . 0)
+ ("clefs-mensural2_c" . 0)
+ ("clefs-mensural3_c" . 0)
+ ("clefs-mensural1_f" . 4)
+ ("clefs-mensural2_f" . 4)
+ ("clefs-mensural_g" . -4))
+ )
+
(define (clef-name-to-properties cl)
(let ((e '())
+ (c0 0)
(oct 0)
(l (string-length cl))
)
(set! e (assoc cl supported-clefs))
+
(if (pair? e)
`(((symbol . clefGlyph)
(iterator-ctor . ,Property_iterator::constructor)
(value . ,(cadr e))
)
-; ((symbol . forceClef)
-; (iterator-ctor . ,Property_iterator::constructor)
-; (value . #t)
-; )
-
+ ((symbol . centralCPosition)
+ (iterator-ctor . ,Property_iterator::constructor)
+ (value . ,(+ oct (caddr e) (cdr (assoc (cadr e) c0-pitch-alist))))
+ )
((symbol . clefPosition)
(iterator-ctor . ,Property_iterator::constructor)
(value . ,(caddr e))
(translator-property-description 'clefGlyph string? "Name of the symbol within the music font")
(translator-property-description 'clefOctavation integer? "Add
this much extra octavation. Values of 7 and -7 are common.")
-(translator-property-description 'clefPitches list? "an alist mapping GLYPHNAME to the position of the central C for that symbol")
(translator-property-description 'clefPosition number? "Where should the center of the symbol go?")
(translator-property-description 'combineParts boolean? "try to combine parts?")
(translator-property-description 'connectArpeggios boolean? " If
according to values of @code{defaultBarType}, @code{barAlways},
@code{barNonAuto} and @code{measurePosition}.
-Legal values are described in @ref{(lilypond-internals)bar-line-interface}.
+Valid values are described in @ref{(lilypond-internals)bar-line-interface}.
.")