From b0064942493df77833e6e41e05d362850f4874b0 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 29 May 2000 00:12:41 +0200 Subject: [PATCH] release: 1.3.56 =========== * Molecules are now generated via callbacks exclusively; most calls to set_elt_property ("transparent) have been replaced by suicide(). 1.3.54.h --- CHANGES | 5 +- Documentation/user/refman.itely | 9 +- VERSION | 4 +- input/bugs/bug1.ly | 5 + lily/axis-group-engraver.cc | 2 +- lily/axis-group-interface.cc | 2 +- lily/bar.cc | 6 +- lily/beam.cc | 3 +- lily/bezier.cc | 7 + lily/breathing-sign.cc | 4 + lily/chord-name-engraver.cc | 2 +- lily/chord-name.cc | 2 + lily/chord-tremolo-engraver.cc | 2 +- lily/chord.cc | 1 - lily/clef-engraver.cc | 3 +- lily/clef-item.cc | 23 ++- lily/crescendo.cc | 3 +- lily/dots.cc | 29 ++- lily/dynamic-engraver.cc | 3 +- lily/extender-engraver.cc | 40 +++- lily/hara-kiri-vertical-group-spanner.cc | 5 +- lily/hyphen-engraver.cc | 3 +- lily/hyphen-spanner.cc | 1 + lily/include/bar.hh | 2 + lily/include/beam.hh | 2 + lily/include/breathing-sign.hh | 4 +- lily/include/chord-name.hh | 4 +- lily/include/crescendo.hh | 4 +- lily/include/dots.hh | 2 + lily/include/extender-engraver.hh | 50 ----- lily/include/extender-spanner.hh | 6 +- lily/include/hyphen-engraver.hh | 1 - lily/include/hyphen-spanner.hh | 2 + lily/include/key-item.hh | 2 + lily/include/local-key-item.hh | 4 +- lily/include/molecule.hh | 5 + lily/include/multi-measure-rest.hh | 2 + lily/include/note-head.hh | 2 + lily/include/rest.hh | 4 +- lily/include/score-element.hh | 26 ++- lily/include/script.hh | 2 + lily/include/slur.hh | 2 + lily/include/spanner.hh | 1 + lily/include/staff-symbol.hh | 2 + lily/include/stem-tremolo.hh | 4 +- lily/include/stem.hh | 6 +- lily/include/sustain-pedal.hh | 4 +- lily/include/system-start-delimiter.hh | 4 +- lily/include/text-item.hh | 4 +- lily/include/tie.hh | 2 + lily/include/time-signature.hh | 2 + lily/include/tuplet-spanner.hh | 4 +- lily/include/volta-spanner.hh | 2 +- lily/interpretation-context-handle.cc | 1 + lily/item.cc | 12 +- lily/key-item.cc | 3 +- lily/line-number-engraver.cc | 2 +- lily/line-of-score.cc | 8 +- lily/local-key-item.cc | 3 +- lily/molecule.cc | 26 +++ lily/multi-measure-rest.cc | 6 +- lily/note-head.cc | 1 + lily/note-heads-engraver.cc | 4 +- lily/repeat-engraver.cc | 2 +- lily/rest-collision.cc | 5 +- lily/rest-engraver.cc | 5 +- lily/rest.cc | 1 + lily/score-element.cc | 37 +++- lily/script-engraver.cc | 2 +- lily/script.cc | 1 + lily/slur-engraver.cc | 2 +- lily/slur.cc | 8 +- lily/spacing-spanner.cc | 1 - lily/span-bar.cc | 9 +- lily/spanner.cc | 13 +- lily/staff-symbol.cc | 3 +- lily/stem-engraver.cc | 2 +- lily/stem-tremolo.cc | 1 + lily/stem.cc | 10 +- lily/system-start-delimiter.cc | 9 +- lily/text-item.cc | 2 + lily/tie-column.cc | 1 - lily/tie-engraver.cc | 8 +- lily/tie.cc | 5 +- lily/time-signature.cc | 1 + lily/tuplet-engraver.cc | 2 +- lily/tuplet-spanner.cc | 5 +- lily/volta-spanner.cc | 1 + ly/engraver.ly | 222 +++++++++++++++-------- make/out/lilypond.lsm | 8 +- make/out/lilypond.spec | 4 +- 91 files changed, 485 insertions(+), 276 deletions(-) create mode 100644 input/bugs/bug1.ly delete mode 100644 lily/include/extender-engraver.hh diff --git a/CHANGES b/CHANGES index 182c393813..e449b6cabd 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,8 @@ -1.3.55.jcn1 +1.3.55.hwn1 =========== -* Made bugfix for Stem_tremolo +* Molecules are now generated via callbacks exclusively; most calls to +set_elt_property ("transparent) have been replaced by suicide(). 1.3.54.hwn2 =========== diff --git a/Documentation/user/refman.itely b/Documentation/user/refman.itely index 62540f2636..f7e64d0e28 100644 --- a/Documentation/user/refman.itely +++ b/Documentation/user/refman.itely @@ -694,11 +694,10 @@ r1 r2 r4 r8 r16 r32 r64 r64 loose_column_distance = 2.5 * \interline; linewidth = -1.0; \translator { - \type "Score_engraver"; - \name "Score"; - \consists "Rest_engraver"; - \consists "Stem_engraver"; - \consists "Rhythmic_column_engraver"; + \StaffContext + \remove "Clef_engraver"; + \remove "Staff_symbol_engraver"; + \remove "Bar_engraver"; } } } diff --git a/VERSION b/VERSION index 05abb00e49..1693e6225a 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 -PATCH_LEVEL=55 -MY_PATCH_LEVEL=jcn1 +PATCH_LEVEL=56 +MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/input/bugs/bug1.ly b/input/bugs/bug1.ly new file mode 100644 index 0000000000..124fa81af4 --- /dev/null +++ b/input/bugs/bug1.ly @@ -0,0 +1,5 @@ +\score { + \notes \relative c'' { + c4 f + } +} diff --git a/lily/axis-group-engraver.cc b/lily/axis-group-engraver.cc index 2038f51e8a..52fc80484a 100644 --- a/lily/axis-group-engraver.cc +++ b/lily/axis-group-engraver.cc @@ -31,7 +31,7 @@ Axis_group_engraver::do_creation_processing () Spanner* Axis_group_engraver::get_spanner_p () const { - return new Spanner (SCM_EOL); + return new Spanner (get_property ("basicVerticalAxisGroupProperties")); } void diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index fc9e5fe128..00c4c8d32c 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -81,7 +81,7 @@ Axis_group_interface::set_interface () if (!has_interface_b ()) { elt_l_->set_elt_pointer ("elements", SCM_EOL); - elt_l_->set_elt_property ("transparent", SCM_BOOL_T); // junk this? + Group_interface (elt_l_, "interfaces").add_thing (ly_symbol2scm ("Axis_group")); } diff --git a/lily/bar.cc b/lily/bar.cc index ec2b812b3e..80c964c1a5 100644 --- a/lily/bar.cc +++ b/lily/bar.cc @@ -44,6 +44,7 @@ Bar::do_brew_molecule () const return Molecule (); } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Bar); Molecule Bar::compound_barline (String str, Real h) const @@ -144,8 +145,9 @@ Bar::before_line_breaking () if (!gh_string_p (g)) { - set_elt_property ("transparent", SCM_BOOL_T); - set_extent_callback (0, X_AXIS); + set_elt_property ("molecule-callback", SCM_BOOL_T); + set_extent_callback (0, X_AXIS); + // leave y_extent for spanbar? } else if (! gh_equal_p (g, orig)) set_elt_property ("glyph", g); diff --git a/lily/beam.cc b/lily/beam.cc index 108f543bc6..e131cbc17c 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -88,7 +88,7 @@ Beam::before_line_breaking () if (visible_stem_count () < 2) { warning (_ ("beam has less than two stems")); - // set_elt_property ("transparent", SCM_BOOL_T); + } if (!directional_element (this).get ()) @@ -719,6 +719,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const return leftbeams; } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS (Beam); Molecule Beam::do_brew_molecule () const diff --git a/lily/bezier.cc b/lily/bezier.cc index 3e1e875a6d..02f2f055e3 100644 --- a/lily/bezier.cc +++ b/lily/bezier.cc @@ -153,6 +153,9 @@ Bezier::solve_point (Axis ax, Real coordinate) const return filter_solutions (sol); } +/** + Compute the bounding box dimensions in direction of A. + */ Interval Bezier::extent (Axis a)const { @@ -171,6 +174,10 @@ Bezier::extent (Axis a)const return iv; } +/** + Flip around axis A + */ + void Bezier::flip (Axis a) { diff --git a/lily/breathing-sign.cc b/lily/breathing-sign.cc index d1473eb214..8870334229 100644 --- a/lily/breathing-sign.cc +++ b/lily/breathing-sign.cc @@ -26,6 +26,10 @@ Breathing_sign::Breathing_sign (SCM s) { } + + +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Breathing_sign); + Molecule Breathing_sign::do_brew_molecule () const { diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index b074cd8b75..b33e0f04de 100644 --- a/lily/chord-name-engraver.cc +++ b/lily/chord-name-engraver.cc @@ -73,7 +73,7 @@ Chord_name_engraver::do_process_music () if (gh_boolean_p (chord_inversion)) find_inversion_b = gh_scm2bool (chord_inversion); - chord_name_p_ = new Chord_name (SCM_EOL); + chord_name_p_ = new Chord_name (get_property ("basicChordNameProperties")); Chord chord = to_chord (pitch_arr_, tonic_req_, inversion_req_, bass_req_, find_inversion_b); diff --git a/lily/chord-name.cc b/lily/chord-name.cc index e8500f9c6c..90b81c57fd 100644 --- a/lily/chord-name.cc +++ b/lily/chord-name.cc @@ -137,6 +137,8 @@ Chord_name::ly_text2molecule (SCM text) const return mol; } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Chord_name); + Molecule Chord_name::do_brew_molecule () const { diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc index 4148b2bb62..86707e1d8f 100644 --- a/lily/chord-tremolo-engraver.cc +++ b/lily/chord-tremolo-engraver.cc @@ -90,7 +90,7 @@ Chord_tremolo_engraver::do_process_music () { if (repeat_ && !beam_p_) { - beam_p_ = new Beam (SCM_EOL); + beam_p_ = new Beam (get_property ("basicBeamProperties")); beam_p_->set_elt_property ("chord-tremolo", SCM_BOOL_T); diff --git a/lily/chord.cc b/lily/chord.cc index cd4e3e0d87..330ac1b417 100644 --- a/lily/chord.cc +++ b/lily/chord.cc @@ -14,7 +14,6 @@ #include "paper-def.hh" #include "lookup.hh" - /* construct from parser output */ diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc index cfc26a629c..e333906625 100644 --- a/lily/clef-engraver.cc +++ b/lily/clef-engraver.cc @@ -108,7 +108,6 @@ Clef_engraver::set_type (String s) c0_position_i_ -= (int) octave_dir_ * 7; - current_settings_ = gh_cons (gh_cons (ly_symbol2scm ("glyph"), clef_glyph_), basic_properties_); current_settings_ = gh_cons (gh_cons (ly_symbol2scm ("c0-position"), @@ -193,7 +192,7 @@ Clef_engraver::create_clef() clef_p_ = c; } Staff_symbol_referencer_interface si(clef_p_); - clef_p_->set_elt_property ("glyph", clef_glyph_); + si.set_position (clef_position_i_); if (octave_dir_) { diff --git a/lily/clef-item.cc b/lily/clef-item.cc index ce7c057be4..770694061d 100644 --- a/lily/clef-item.cc +++ b/lily/clef-item.cc @@ -16,6 +16,12 @@ Clef_item::Clef_item (SCM s) : Item (s) {} + +/* +FIXME: should use symbol. + +FIXME: this should be schemified. +*/ void Clef_item::before_line_breaking () { @@ -26,9 +32,6 @@ Clef_item::before_line_breaking () SCM glyph = get_elt_property ("glyph"); - /* - FIXME: should use symbol. - */ if (gh_string_p (glyph)) { String s = ly_scm2string (glyph); @@ -36,21 +39,23 @@ Clef_item::before_line_breaking () /* FIXME: should use fontsize property to set clef changes. */ - if (break_status_dir() != RIGHT && style != "fullSizeChanges") + if (get_elt_property ("non-default") && + break_status_dir() != RIGHT && style != "fullSizeChanges") { s += "_change"; + set_elt_property ("glyph", ly_str02scm (s.ch_C())); } - s = "clefs-" + s; - set_elt_property ("glyph", ly_str02scm (s.ch_C())); } else { - set_elt_property ("transparent", SCM_BOOL_T); + suicide (); + return; } - + + // ugh. if (style == "transparent") // UGH. JUNKME { - set_elt_property ("transparent", SCM_BOOL_T); + set_elt_property ("molecule-callback", SCM_BOOL_T); set_extent_callback (0, X_AXIS); } } diff --git a/lily/crescendo.cc b/lily/crescendo.cc index fd390e0826..d119ca9a04 100644 --- a/lily/crescendo.cc +++ b/lily/crescendo.cc @@ -24,6 +24,7 @@ Crescendo::Crescendo (SCM s) +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Crescendo) Molecule Crescendo::do_brew_molecule () const { @@ -36,7 +37,7 @@ Crescendo::do_brew_molecule () const if (!isdir_b (dir) || !gh_pair_p (dyns)) { Crescendo * me = (Crescendo*)this; - me->set_elt_property ("transparent", SCM_BOOL_T); + me->suicide (); Molecule m; return m; diff --git a/lily/dots.cc b/lily/dots.cc index a658d838e7..ebc5c366a0 100644 --- a/lily/dots.cc +++ b/lily/dots.cc @@ -23,13 +23,7 @@ void Dots::after_line_breaking () { SCM d= get_elt_property ("dot-count"); - if (!gh_number_p (d) || !gh_scm2int (d)) - { - set_elt_property ("transparent", SCM_BOOL_T); - set_extent_callback (0, X_AXIS); - set_extent_callback (0, Y_AXIS); - } - else + if (gh_number_p (d) && gh_scm2int (d)) { if (!directional_element (this).get ()) directional_element (this).set (UP); @@ -41,23 +35,28 @@ Dots::after_line_breaking () } } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Dots); Molecule Dots::do_brew_molecule () const { Molecule mol (lookup_l ()->blank (Box (Interval (0,0), Interval (0,0)))); - Molecule d = lookup_l ()->afm_find (String ("dots-dot")); - Real dw = d.extent (X_AXIS).length (); - d.translate_axis (-dw, X_AXIS); + SCM c = get_elt_property ("dot-count"); + if (!gh_number_p (c)) + { + Molecule d = lookup_l ()->afm_find (String ("dots-dot")); + + Real dw = d.extent (X_AXIS).length (); + d.translate_axis (-dw, X_AXIS); - for (int i = gh_scm2int (get_elt_property ("dot-count")); i--; ) - { - d.translate_axis (2*dw,X_AXIS); - mol.add_molecule (d); + for (int i = gh_scm2int (c); i--; ) + { + d.translate_axis (2*dw,X_AXIS); + mol.add_molecule (d); + } } - return mol; } diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 15592c6c78..273aa10568 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -48,7 +48,6 @@ public: Dynamic_line_spanner::Dynamic_line_spanner (SCM s) : Spanner (s) { - set_elt_property ("transparent", SCM_BOOL_T); Side_position_interface (this).set_axis (Y_AXIS); Axis_group_interface (this).set_interface (); Axis_group_interface (this).set_axes (X_AXIS, Y_AXIS); @@ -304,7 +303,7 @@ Dynamic_engraver::do_process_music () else { span_start_req_l_ = span_req_l_drul_[START]; - cresc_p_ = new Crescendo (SCM_EOL); + cresc_p_ = new Crescendo (get_property ("basicCrescendoProperties")); cresc_p_->set_elt_property ("grow-direction", gh_int2scm ((span_req_l_drul_[START]->span_type_str_ == "crescendo") diff --git a/lily/extender-engraver.cc b/lily/extender-engraver.cc index 9e869dc9c2..8dab340163 100644 --- a/lily/extender-engraver.cc +++ b/lily/extender-engraver.cc @@ -8,11 +8,45 @@ #include "proto.hh" #include "musical-request.hh" -#include "extender-engraver.hh" #include "extender-spanner.hh" #include "paper-column.hh" #include "text-item.hh" -#include "extender-engraver.hh" +#include "engraver.hh" +#include "drul-array.hh" +#include "extender-spanner.hh" +#include "pqueue.hh" + + +/** + Generate an centred extender. Should make a Extender_spanner that + typesets a nice centred extender of varying length depending on the + gap between syllables. + + We remember the last Text_item that come across. When we get a + request, we create the spanner, and attach the left point to the + last lyrics, and the right point to any lyrics we receive by + then. */ +class Extender_engraver : public Engraver +{ + Text_item * last_lyric_l_; + Text_item * current_lyric_l_; + Extender_req* req_l_; + Lyric_extender* extender_spanner_p_; +public: + Extender_engraver (); + VIRTUAL_COPY_CONS (Translator); + +protected: + virtual void acknowledge_element (Score_element_info); + virtual void do_removal_processing(); + virtual void do_process_music(); + virtual bool do_try_music (Music*); + virtual void do_pre_move_processing(); + virtual void do_post_move_processing (); +private: + +}; + ADD_THIS_TRANSLATOR (Extender_engraver); @@ -75,7 +109,7 @@ Extender_engraver::do_process_music () return; } - extender_spanner_p_ = new Extender_spanner (SCM_EOL); + extender_spanner_p_ = new Lyric_extender (get_property ("basicLyricExtenderProperties")); extender_spanner_p_->set_textitem (LEFT, last_lyric_l_); announce_element (Score_element_info (extender_spanner_p_, req_l_)); } diff --git a/lily/hara-kiri-vertical-group-spanner.cc b/lily/hara-kiri-vertical-group-spanner.cc index d028ed5ef9..c01b068cba 100644 --- a/lily/hara-kiri-vertical-group-spanner.cc +++ b/lily/hara-kiri-vertical-group-spanner.cc @@ -40,10 +40,7 @@ Hara_kiri_group_spanner::after_line_breaking () if ( line_l () != s->line_l ()) programming_error ("Killing other children too"); - s->set_elt_property ("transparent", SCM_BOOL_T); - s->set_extent_callback (0, X_AXIS); - s->set_extent_callback (0, Y_AXIS); - + s->suicide (); } set_extent_callback (0, X_AXIS); set_extent_callback (0, Y_AXIS); diff --git a/lily/hyphen-engraver.cc b/lily/hyphen-engraver.cc index 071526f89a..6193fa81dc 100644 --- a/lily/hyphen-engraver.cc +++ b/lily/hyphen-engraver.cc @@ -10,7 +10,6 @@ #include "hyphen-spanner.hh" #include "paper-column.hh" #include "text-item.hh" -#include "extender-engraver.hh" ADD_THIS_TRANSLATOR (Hyphen_engraver); @@ -73,7 +72,7 @@ Hyphen_engraver::do_process_music () return; } - hyphen_spanner_p_ = new Hyphen_spanner (SCM_EOL); + hyphen_spanner_p_ = new Hyphen_spanner (get_property ("basicHyphenSpannerProperties")); hyphen_spanner_p_->set_textitem (LEFT, last_lyric_l_); announce_element (Score_element_info (hyphen_spanner_p_, req_l_)); } diff --git a/lily/hyphen-spanner.cc b/lily/hyphen-spanner.cc index d0b58fc3bd..a4ddc8c750 100644 --- a/lily/hyphen-spanner.cc +++ b/lily/hyphen-spanner.cc @@ -30,6 +30,7 @@ Hyphen_spanner::Hyphen_spanner (SCM s) set_extent_callback (Score_element::point_dimension_callback,Y_AXIS); } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Hyphen_spanner) Molecule Hyphen_spanner::do_brew_molecule () const { diff --git a/lily/include/bar.hh b/lily/include/bar.hh index f770c3aac2..6673cea6f9 100644 --- a/lily/include/bar.hh +++ b/lily/include/bar.hh @@ -18,6 +18,8 @@ public: Molecule compound_barline (String, Real height) const; Molecule simple_barline (Real wid, Real height) const; + static SCM scheme_molecule (SCM); + protected: virtual void before_line_breaking (); diff --git a/lily/include/beam.hh b/lily/include/beam.hh index 27a19a1769..99eac088af 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -26,6 +26,8 @@ class Beam : public Spanner { public: + static SCM scheme_molecule (SCM); + int stem_count () const; Stem* stem (int) const; diff --git a/lily/include/breathing-sign.hh b/lily/include/breathing-sign.hh index fb212868b5..a2b0181d2b 100644 --- a/lily/include/breathing-sign.hh +++ b/lily/include/breathing-sign.hh @@ -20,6 +20,8 @@ class Breathing_sign : public Item { public: + static SCM scheme_molecule (SCM); + VIRTUAL_COPY_CONS(Score_element); Breathing_sign (SCM s); protected: @@ -27,6 +29,4 @@ protected: virtual Molecule do_brew_molecule () const; }; - - #endif // BREATHING_SIGN_HH diff --git a/lily/include/chord-name.hh b/lily/include/chord-name.hh index 2f77bb4b1d..f2c930c031 100644 --- a/lily/include/chord-name.hh +++ b/lily/include/chord-name.hh @@ -22,7 +22,9 @@ class Chord_name : public Item { public: - VIRTUAL_COPY_CONS (Score_element); + static SCM scheme_molecule (SCM); + +VIRTUAL_COPY_CONS (Score_element); Molecule ly_word2molecule (SCM scm) const; Molecule ly_text2molecule (SCM scm) const; Chord_name(SCM s); diff --git a/lily/include/crescendo.hh b/lily/include/crescendo.hh index b5a46c8433..e43f005e61 100644 --- a/lily/include/crescendo.hh +++ b/lily/include/crescendo.hh @@ -18,7 +18,9 @@ */ class Crescendo : public Spanner { public: - Crescendo(SCM); + static SCM scheme_molecule (SCM); + +Crescendo(SCM); protected: VIRTUAL_COPY_CONS(Score_element); virtual Molecule do_brew_molecule() const; diff --git a/lily/include/dots.hh b/lily/include/dots.hh index e1bf806390..8f33241c68 100644 --- a/lily/include/dots.hh +++ b/lily/include/dots.hh @@ -29,7 +29,9 @@ protected: virtual Molecule do_brew_molecule () const; virtual void after_line_breaking (); public: + static SCM scheme_molecule (SCM); + Dots (SCM); }; diff --git a/lily/include/extender-engraver.hh b/lily/include/extender-engraver.hh deleted file mode 100644 index 9973f41d31..0000000000 --- a/lily/include/extender-engraver.hh +++ /dev/null @@ -1,50 +0,0 @@ -/* - extender-engraver.hh -- declare Extender_engraver - - source file of the GNU LilyPond music typesetter - - (c) 1999 Glen Prideaux , - Han-Wen Nienhuys, Jan Nieuwenhuizen. -*/ - -#ifndef EXTENDER_ENGRAVER_HH -#define EXTENDER_ENGRAVER_HH - -#include "engraver.hh" -#include "drul-array.hh" -#include "extender-spanner.hh" -#include "pqueue.hh" -#include "extender-engraver.hh" - - -/** - Generate an centred extender. Should make a Extender_spanner that - typesets a nice centred extender of varying length depending on the - gap between syllables. - - We remember the last Text_item that come across. When we get a - request, we create the spanner, and attach the left point to the - last lyrics, and the right point to any lyrics we receive by - then. */ -class Extender_engraver : public Engraver -{ - Text_item * last_lyric_l_; - Text_item * current_lyric_l_; - Extender_req* req_l_; - Extender_spanner* extender_spanner_p_; -public: - Extender_engraver (); - VIRTUAL_COPY_CONS (Translator); - -protected: - virtual void acknowledge_element (Score_element_info); - virtual void do_removal_processing(); - virtual void do_process_music(); - virtual bool do_try_music (Music*); - virtual void do_pre_move_processing(); - virtual void do_post_move_processing (); -private: - -}; - -#endif // EXTENDER_ENGRAVER_HH diff --git a/lily/include/extender-spanner.hh b/lily/include/extender-spanner.hh index 862318e7ea..b921217dbe 100644 --- a/lily/include/extender-spanner.hh +++ b/lily/include/extender-spanner.hh @@ -27,11 +27,13 @@ extend beond, lasting the whole duration of the melissima (as in MUP, urg). */ -class Extender_spanner : public Spanner +class Lyric_extender : public Spanner { public: - Extender_spanner (SCM); + Lyric_extender (SCM); void set_textitem (Direction, Item*); + static SCM scheme_molecule (SCM); + protected: virtual Molecule do_brew_molecule () const; diff --git a/lily/include/hyphen-engraver.hh b/lily/include/hyphen-engraver.hh index 4db4d25bff..160b9e2673 100644 --- a/lily/include/hyphen-engraver.hh +++ b/lily/include/hyphen-engraver.hh @@ -13,7 +13,6 @@ #include "drul-array.hh" #include "hyphen-spanner.hh" #include "pqueue.hh" -#include "extender-engraver.hh" /** diff --git a/lily/include/hyphen-spanner.hh b/lily/include/hyphen-spanner.hh index 24c1ab7299..1270bce805 100644 --- a/lily/include/hyphen-spanner.hh +++ b/lily/include/hyphen-spanner.hh @@ -23,6 +23,8 @@ class Hyphen_spanner : public Spanner public: Hyphen_spanner (SCM); void set_textitem (Direction, Item*); + static SCM scheme_molecule (SCM); + protected: virtual Molecule do_brew_molecule () const; diff --git a/lily/include/key-item.hh b/lily/include/key-item.hh index b8430c4272..2c7f396ab4 100644 --- a/lily/include/key-item.hh +++ b/lily/include/key-item.hh @@ -31,6 +31,8 @@ public: Key_item (SCM); void add (int pitch, int acc); void add_old (int pitch, int acc); + static SCM scheme_molecule (SCM); + protected: virtual Molecule do_brew_molecule() const; diff --git a/lily/include/local-key-item.hh b/lily/include/local-key-item.hh index db072f0dfe..ca368dc30a 100644 --- a/lily/include/local-key-item.hh +++ b/lily/include/local-key-item.hh @@ -41,7 +41,9 @@ class Local_key_item : public Item Molecule accidental (int,bool,bool) const; public: Local_key_item (SCM ); - void add_pitch (Musical_pitch, bool cautionary, bool natural); + static SCM scheme_molecule (SCM); + +void add_pitch (Musical_pitch, bool cautionary, bool natural); protected: virtual void before_line_breaking (); virtual Molecule do_brew_molecule() const; diff --git a/lily/include/molecule.hh b/lily/include/molecule.hh index d9cd2bb11a..b8153c72a0 100644 --- a/lily/include/molecule.hh +++ b/lily/include/molecule.hh @@ -71,11 +71,16 @@ public: void translate_axis (Real,Axis); Interval extent (Axis) const; + /** + codify THIS into a Scheme expression. + */ + SCM create_scheme () const; bool empty_b() const; }; SCM fontify_atom (Font_metric*, SCM atom); +Molecule create_molecule (SCM scheme_molecule); diff --git a/lily/include/multi-measure-rest.hh b/lily/include/multi-measure-rest.hh index 0258c9a7ee..eba41029b2 100644 --- a/lily/include/multi-measure-rest.hh +++ b/lily/include/multi-measure-rest.hh @@ -17,6 +17,8 @@ class Multi_measure_rest : public Spanner { public: Multi_measure_rest (SCM); + static SCM scheme_molecule (SCM); + void add_column (Item*); Molecule compound_rest (int)const; diff --git a/lily/include/note-head.hh b/lily/include/note-head.hh index 85442c0b00..0ce36022fc 100644 --- a/lily/include/note-head.hh +++ b/lily/include/note-head.hh @@ -23,6 +23,8 @@ class Note_head : public Rhythmic_head { public: static int compare (Note_head * const &a, Note_head *const &b) ; + static SCM scheme_molecule (SCM); + Molecule ledger_line (Interval) const; Note_head (SCM); diff --git a/lily/include/rest.hh b/lily/include/rest.hh index cb62ce3883..0b0ebef383 100644 --- a/lily/include/rest.hh +++ b/lily/include/rest.hh @@ -25,6 +25,8 @@ protected: virtual void after_line_breaking (); virtual Molecule do_brew_molecule () const; public: - Rest (SCM s); + static SCM scheme_molecule (SCM); + +Rest (SCM s); }; #endif // REST_HH diff --git a/lily/include/score-element.hh b/lily/include/score-element.hh index 16a0d8b39a..276fe75e3e 100644 --- a/lily/include/score-element.hh +++ b/lily/include/score-element.hh @@ -162,7 +162,7 @@ public: /// generate rods & springs virtual void do_space_processing (); virtual void discretionary_processing (); - + virtual void do_derived_mark (); /// do calculations before determining horizontal spacing virtual void before_line_breaking (); /// do calculations after determining horizontal spacing @@ -182,17 +182,16 @@ protected: be handled by GUILE gc. */ virtual ~Score_element (); - /// generate the molecule - virtual Molecule do_brew_molecule () const; ///executed directly after the item is added to the Paper_score virtual void do_add_processing (); - + virtual Molecule do_brew_molecule ()const; + static Interval dim_cache_callback (Dimension_cache const*); public: static SCM ly_set_elt_property (SCM, SCM,SCM); static SCM ly_get_elt_property (SCM, SCM); - + static SCM scheme_molecule (SCM); virtual void handle_broken_dependencies (); virtual void handle_prebroken_dependencies (); @@ -246,6 +245,23 @@ public: Score_element * unsmob_element (SCM); +#define MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(TYPE) \ +SCM \ +TYPE::scheme_molecule (SCM smob) \ +{ \ + TYPE * b = dynamic_cast (unsmob_element (smob)); \ + return b ? b->do_brew_molecule ().create_scheme () : SCM_EOL; \ +} \ + \ +void \ +TYPE ## __init_functions () \ +{ \ + scm_make_gsubr (#TYPE "::scheme_molecule", 1, 0, 0, \ + (SCM(*)(...))TYPE::scheme_molecule); \ +} \ + \ +ADD_SCM_INIT_FUNC(TYPE ## _molecule, TYPE ## __init_functions); \ + #endif // STAFFELEM_HH diff --git a/lily/include/script.hh b/lily/include/script.hh index 4d8441584d..0204e81112 100644 --- a/lily/include/script.hh +++ b/lily/include/script.hh @@ -23,7 +23,9 @@ class Script : public Item Molecule get_molecule (Direction d) const; public: Script (SCM); + static SCM scheme_molecule (SCM); + protected: virtual void before_line_breaking (); virtual void after_line_breaking (); diff --git a/lily/include/slur.hh b/lily/include/slur.hh index 3ab1dff6bd..a44f1f4bd4 100644 --- a/lily/include/slur.hh +++ b/lily/include/slur.hh @@ -20,6 +20,8 @@ public: VIRTUAL_COPY_CONS(Score_element); void add_column (Note_column*); + static SCM scheme_molecule (SCM); + protected: diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh index b3e894804d..34339a18f9 100644 --- a/lily/include/spanner.hh +++ b/lily/include/spanner.hh @@ -49,6 +49,7 @@ public: virtual Array get_rods () const; virtual Array get_springs () const; virtual Score_element* find_broken_piece (Line_of_score*) const; + virtual void do_derived_mark (); protected: void set_my_columns (); VIRTUAL_COPY_CONS(Score_element); diff --git a/lily/include/staff-symbol.hh b/lily/include/staff-symbol.hh index 676886c7ec..4ed5b22af0 100644 --- a/lily/include/staff-symbol.hh +++ b/lily/include/staff-symbol.hh @@ -22,7 +22,9 @@ public: int steps_i() const; int line_count () const; Staff_symbol (SCM s); + static SCM scheme_molecule (SCM); + protected: VIRTUAL_COPY_CONS(Score_element); virtual Molecule do_brew_molecule() const; diff --git a/lily/include/stem-tremolo.hh b/lily/include/stem-tremolo.hh index 11c1c93af8..ec2e7b4426 100644 --- a/lily/include/stem-tremolo.hh +++ b/lily/include/stem-tremolo.hh @@ -20,7 +20,9 @@ protected: static Interval dim_callback (Score_element*, Axis); public: - Stem_tremolo (SCM); + static SCM scheme_molecule (SCM); + +Stem_tremolo (SCM); void set_stem (Stem *); }; diff --git a/lily/include/stem.hh b/lily/include/stem.hh index 8ae9771fca..44d054f011 100644 --- a/lily/include/stem.hh +++ b/lily/include/stem.hh @@ -43,6 +43,10 @@ class Stem : public Item { public: + static SCM scheme_molecule (SCM); + + + /// log of the duration. Eg. 4 -> 16th note -> 2 flags int flag_i () const; @@ -83,10 +87,8 @@ protected: Real get_default_stem_end_position () const; void position_noteheads(); - Real stem_end_position () const; static Real off_callback (Score_element const*, Axis); -protected: Molecule flag () const; virtual void before_line_breaking(); diff --git a/lily/include/sustain-pedal.hh b/lily/include/sustain-pedal.hh index 9f17f20361..505723c316 100644 --- a/lily/include/sustain-pedal.hh +++ b/lily/include/sustain-pedal.hh @@ -31,7 +31,9 @@ class Sustain_pedal : public Item { public: - VIRTUAL_COPY_CONS (Score_element); + static SCM scheme_molecule (SCM); + +VIRTUAL_COPY_CONS (Score_element); Sustain_pedal (SCM); protected: virtual Molecule do_brew_molecule () const; diff --git a/lily/include/system-start-delimiter.hh b/lily/include/system-start-delimiter.hh index d84acd97d0..b3f545daf7 100644 --- a/lily/include/system-start-delimiter.hh +++ b/lily/include/system-start-delimiter.hh @@ -19,7 +19,9 @@ class System_start_delimiter : public Spanner { public: System_start_delimiter (SCM); - VIRTUAL_COPY_CONS (Score_element); + static SCM scheme_molecule (SCM); + +VIRTUAL_COPY_CONS (Score_element); protected: virtual void after_line_breaking(); virtual Molecule do_brew_molecule () const; diff --git a/lily/include/text-item.hh b/lily/include/text-item.hh index 818a5a3139..d70347307a 100644 --- a/lily/include/text-item.hh +++ b/lily/include/text-item.hh @@ -19,7 +19,9 @@ class Text_item : public Item { public: VIRTUAL_COPY_CONS (Score_element); - Text_item (SCM s); + static SCM scheme_molecule (SCM); + +Text_item (SCM s); protected: virtual Molecule do_brew_molecule () const; }; diff --git a/lily/include/tie.hh b/lily/include/tie.hh index 7de2697cfa..71e0e86c87 100644 --- a/lily/include/tie.hh +++ b/lily/include/tie.hh @@ -25,7 +25,9 @@ public: Note_head* head (Direction) const; Real position_f () const; + static SCM scheme_molecule (SCM); + virtual Direction get_default_dir() const; protected: diff --git a/lily/include/time-signature.hh b/lily/include/time-signature.hh index 6744bff15e..ac4a49f237 100644 --- a/lily/include/time-signature.hh +++ b/lily/include/time-signature.hh @@ -27,6 +27,8 @@ protected: virtual Molecule do_brew_molecule() const; public: Time_signature (SCM); + static SCM scheme_molecule (SCM); + /* TODO: make this SCM! diff --git a/lily/include/tuplet-spanner.hh b/lily/include/tuplet-spanner.hh index 51789988b6..e7390afbf2 100644 --- a/lily/include/tuplet-spanner.hh +++ b/lily/include/tuplet-spanner.hh @@ -21,7 +21,9 @@ class Tuplet_spanner : public Spanner { public: Tuplet_spanner (SCM); - + static SCM scheme_molecule (SCM); + + void add_column (Note_column*); void add_beam (Beam*); protected: diff --git a/lily/include/volta-spanner.hh b/lily/include/volta-spanner.hh index a1f9b0ebfe..a9a05605da 100644 --- a/lily/include/volta-spanner.hh +++ b/lily/include/volta-spanner.hh @@ -17,7 +17,7 @@ class Volta_spanner : public Spanner { public: Volta_spanner (SCM); - + static SCM scheme_molecule (SCM); void add_column (Note_column*); void add_bar (Bar*); diff --git a/lily/interpretation-context-handle.cc b/lily/interpretation-context-handle.cc index ca1071ae0f..b6a403ea2d 100644 --- a/lily/interpretation-context-handle.cc +++ b/lily/interpretation-context-handle.cc @@ -1,4 +1,5 @@ /* + interpretation-context-handle.cc -- implement Interpretation_context_handle source file of the GNU LilyPond music typesetter diff --git a/lily/item.cc b/lily/item.cc index ea8fde5d84..f601a947dd 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -17,7 +17,6 @@ Item::Item (SCM s) : Score_element (s) - { broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0; } @@ -155,13 +154,16 @@ Item::handle_prebroken_dependencies () SCM result = gh_apply (vis, args); bool trans = gh_scm2bool (gh_car (result)); bool empty = gh_scm2bool (gh_cdr (result)); - - if (empty) + + if (empty && trans) + suicide (); + else if (empty) { set_extent_callback (0, X_AXIS); set_extent_callback (0, Y_AXIS); } - if (trans) - set_elt_property ("transparent", SCM_BOOL_T); + else if (trans) + set_elt_property ("molecule-callback", SCM_BOOL_T); } } + diff --git a/lily/key-item.cc b/lily/key-item.cc index c9b74955b7..5b179e5747 100644 --- a/lily/key-item.cc +++ b/lily/key-item.cc @@ -86,8 +86,9 @@ Key_item::calculate_position(SCM pair) const */ +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Key_item) Molecule -Key_item::do_brew_molecule() const +Key_item::do_brew_molecule () const { Molecule mol; diff --git a/lily/line-number-engraver.cc b/lily/line-number-engraver.cc index afde3217cd..7a9e48a6f1 100644 --- a/lily/line-number-engraver.cc +++ b/lily/line-number-engraver.cc @@ -36,7 +36,7 @@ Line_number_engraver::process_acknowledged () { if (!text_item_p_ && interesting_.size ()) { - text_item_p_ = new Text_item (SCM_EOL); + text_item_p_ = new Text_item (get_property ("basicTextProperties") ); Side_position_interface si (text_item_p_); si.set_axis (Y_AXIS); text_item_p_->set_parent (interesting_[0].elem_l_, Y_AXIS); diff --git a/lily/line-of-score.cc b/lily/line-of-score.cc index 2ca094bab9..1c8f59d34c 100644 --- a/lily/line-of-score.cc +++ b/lily/line-of-score.cc @@ -324,13 +324,13 @@ Line_of_score::broken_col_range (Item const*l, Item const*r) const r = r->column_l (); SCM s = get_elt_pointer ("columns"); - while (gh_car (s) != r->self_scm_) + while (gh_pair_p (s) && gh_car (s) != r->self_scm_) s = gh_cdr (s); - - s = gh_cdr (s); + if (gh_pair_p (s)) + s = gh_cdr (s); - while (gh_car (s) != l->self_scm_) + while (gh_pair_p (s) && gh_car (s) != l->self_scm_) { Paper_column *c = dynamic_cast (unsmob_element (gh_car (s))); diff --git a/lily/local-key-item.cc b/lily/local-key-item.cc index e730ad4ea0..4b77e00fd3 100644 --- a/lily/local-key-item.cc +++ b/lily/local-key-item.cc @@ -61,8 +61,9 @@ Local_key_item::accidental (int j, bool cautionary, bool natural) const /* UGH. clean me up */ +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Local_key_item) Molecule -Local_key_item::do_brew_molecule() const +Local_key_item::do_brew_molecule () const { Molecule mol; Staff_symbol_referencer_interface si (this); diff --git a/lily/molecule.cc b/lily/molecule.cc index 538edc4f9b..0eec7dd813 100644 --- a/lily/molecule.cc +++ b/lily/molecule.cc @@ -133,3 +133,29 @@ Molecule::get_expr () const { return expr_; } + +Molecule +create_molecule (SCM scm_mol) +{ + if (!gh_pair_p (scm_mol)) + return Molecule (); + + SCM exp = gh_car (scm_mol); + scm_mol = gh_cdr (scm_mol); + Box b ; + if (gh_pair_p (scm_mol)) + { + Interval i1 = ly_scm2interval (gh_car (scm_mol)); + Interval i2 = ly_scm2interval (gh_cdr (scm_mol)); + b = Box (i1,i2); + } + return Molecule (b, exp); +} + +SCM +Molecule::create_scheme () const +{ + return gh_cons (expr_, + gh_cons (ly_interval2scm (dim_[X_AXIS]), + ly_interval2scm (dim_[Y_AXIS]))); +} diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index cd770d0d04..eb12c9f9b2 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -31,6 +31,7 @@ Multi_measure_rest::Multi_measure_rest (SCM s) [TODO] 17 * variable-sized multi-measure rest symbol: |====| ?? */ +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Multi_measure_rest) Molecule Multi_measure_rest::do_brew_molecule () const { @@ -155,7 +156,10 @@ void Multi_measure_rest::after_line_breaking () { if (!gh_pair_p (get_elt_pointer ("columns"))) - set_elt_property ("transparent", SCM_BOOL_T); + { + suicide (); + } + } diff --git a/lily/note-head.cc b/lily/note-head.cc index d5fa47e7ff..4f8934ab37 100644 --- a/lily/note-head.cc +++ b/lily/note-head.cc @@ -71,6 +71,7 @@ Note_head::before_line_breaking () +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Note_head); Molecule Note_head::do_brew_molecule() const diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc index 3090a6d111..431c637b84 100644 --- a/lily/note-heads-engraver.cc +++ b/lily/note-heads-engraver.cc @@ -60,7 +60,7 @@ Note_heads_engraver::do_process_music() for (int i=0; i < note_req_l_arr_.size (); i++) { - Note_head *note_p = new Note_head (SCM_EOL); + Note_head *note_p = new Note_head (get_property ("basicNoteHeadProperties")); Staff_symbol_referencer_interface si (note_p); si.set_interface (); @@ -73,7 +73,7 @@ Note_heads_engraver::do_process_music() if (note_req_l->duration_.dots_i_) { - Dots * d = new Dots (SCM_EOL); + Dots * d = new Dots (get_property ("basicDotsProperties")); Staff_symbol_referencer_interface sd (d); sd.set_interface (); diff --git a/lily/repeat-engraver.cc b/lily/repeat-engraver.cc index 8c838c3474..72572c3891 100644 --- a/lily/repeat-engraver.cc +++ b/lily/repeat-engraver.cc @@ -180,7 +180,7 @@ Repeat_engraver::do_process_music () else { assert (!volta_span_p_); - volta_span_p_ = new Volta_spanner (SCM_EOL); + volta_span_p_ = new Volta_spanner (get_property ("basicVoltaSpannerProperties")); announce_element (Score_element_info (volta_span_p_,0)); volta_span_p_->set_elt_property ("text", ly_str02scm (t.ch_C())); diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc index 34d39fbe3b..f5be97061c 100644 --- a/lily/rest-collision.cc +++ b/lily/rest-collision.cc @@ -48,6 +48,9 @@ rhythmic_head2mom (Rhythmic_head* r) return to_duration (r->balltype_i (), r->dot_count ()).length_mom (); } +/* + ugh + */ static Rhythmic_head* col2rhythmic_head (Note_column* c) { @@ -109,7 +112,7 @@ Rest_collision::before_line_breaking () display_count = gh_scm2int (s); for (; i > display_count; i--) col2rhythmic_head (rest_l_arr[i-1]) - ->set_elt_property ("transparent", SCM_BOOL_T); + ->set_elt_property ("molecule-callback", SCM_BOOL_T); } else display_count = rest_l_arr.size (); diff --git a/lily/rest-engraver.cc b/lily/rest-engraver.cc index 37b3e6ee1f..aefefc453a 100644 --- a/lily/rest-engraver.cc +++ b/lily/rest-engraver.cc @@ -10,6 +10,7 @@ #include "musical-request.hh" #include "dots.hh" #include "rest.hh" + /* Should merge with Note_head_engraver */ @@ -46,7 +47,7 @@ Rest_engraver::do_process_music () { if (rest_req_l_ && !rest_p_) { - rest_p_ = new Rest (SCM_EOL); + rest_p_ = new Rest (get_property ("basicRestProperties")); Staff_symbol_referencer_interface si (rest_p_); si.set_interface (); @@ -55,7 +56,7 @@ Rest_engraver::do_process_music () if (rest_req_l_->duration_.dots_i_) { - dot_p_ = new Dots (SCM_EOL); + dot_p_ = new Dots (get_property ("basicDotsProperties")); Staff_symbol_referencer_interface si (dot_p_); si.set_interface (); diff --git a/lily/rest.cc b/lily/rest.cc index b01d47896d..5270a355e3 100644 --- a/lily/rest.cc +++ b/lily/rest.cc @@ -36,6 +36,7 @@ Rest::after_line_breaking () } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Rest) Molecule Rest::do_brew_molecule () const { diff --git a/lily/score-element.cc b/lily/score-element.cc index ea3ac9cbac..327cffe787 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -153,7 +153,6 @@ Score_element::set_elt_property (String k, SCM val) property_alist_ = gh_cons (gh_cons (sym, val), property_alist_); } - void Score_element::set_elt_pointer (const char* k, SCM v) { @@ -165,7 +164,7 @@ Score_element::set_elt_pointer (const char* k, SCM v) Interval Score_element::molecule_extent (Score_element const *s, Axis a ) { - Molecule m = s->do_brew_molecule(); + Molecule m = s->get_molecule (); return m.extent(a); } @@ -253,10 +252,11 @@ Score_element::calculate_dependencies (int final, int busy, Molecule Score_element::get_molecule () const { - if (to_boolean (get_elt_property ("transparent"))) - return Molecule (); + SCM proc = get_elt_property ("molecule-callback"); + if (gh_procedure_p (proc)) + return create_molecule (gh_apply (proc, gh_list (this->self_scm_, SCM_UNDEFINED))); - return do_brew_molecule (); + return Molecule (); } @@ -292,17 +292,19 @@ Score_element::do_add_processing() } -/* +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Score_element) + + /* ugh. */ + Molecule -Score_element::do_brew_molecule() const +Score_element::do_brew_molecule () const { SCM glyph = get_elt_property ("glyph"); if (gh_string_p (glyph)) { return lookup_l ()->afm_find (String (ly_scm2string (glyph))); - } else { @@ -471,15 +473,18 @@ Score_element::suicide () pointer_alist_ = SCM_EOL; set_extent_callback (0, Y_AXIS); set_extent_callback (0, X_AXIS); -} + for (int a= X_AXIS; a <= Y_AXIS; a++) + { + dim_cache_[a].off_callbacks_.clear (); + } +} void Score_element::handle_prebroken_dependencies() { } - Score_element* Score_element::find_broken_piece (Line_of_score*) const { @@ -720,6 +725,13 @@ Score_element::mark_smob (SCM ses) return SCM_EOL; } scm_gc_mark (s->pointer_alist_); + + s->do_derived_mark (); + if (s->parent_l (Y_AXIS)) + scm_gc_mark (s->parent_l (Y_AXIS)->self_scm_); + if (s->parent_l (X_AXIS)) + scm_gc_mark (s->parent_l (X_AXIS)->self_scm_); + return s->property_alist_; } @@ -738,6 +750,11 @@ Score_element::print_smob (SCM s, SCM port, scm_print_state *) return 1; } +void +Score_element::do_derived_mark () +{ +} + void Score_element::do_smobify_self () { diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index 7136ba6841..d53c47648f 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -71,7 +71,7 @@ Script_engraver::do_process_music() continue; } // todo -> use result of articulation-to-scriptdef directly as basic prop list. - Script *p =new Script (SCM_EOL); + Script *p =new Script (get_property ("basicScriptProperties")); Side_position_interface stafy (p); diff --git a/lily/script.cc b/lily/script.cc index 20c799cd96..6c51f6ac5e 100644 --- a/lily/script.cc +++ b/lily/script.cc @@ -60,6 +60,7 @@ Script::after_line_breaking () i.set_direction (d); } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Script) Molecule Script::do_brew_molecule () const { diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 89edf59ca9..ccb3a9a360 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -106,7 +106,7 @@ Slur_engraver::do_process_music() { // push a new slur onto stack. //(use temp. array to wait for all slur STOPs) - Slur * s_p =new Slur (SCM_EOL); + Slur * s_p =new Slur (get_property ("basicSlurProperties")); requests_arr_.push (slur_req_l); start_slur_l_arr_.push (s_p); diff --git a/lily/slur.cc b/lily/slur.cc index f15b9a3bb8..118bae506c 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -30,8 +30,6 @@ #include "group-interface.hh" #include "staff-symbol-referencer.hh" - - class Slur_bezier_bow : public Bezier_bow { public: @@ -362,9 +360,7 @@ Slur::set_extremities () if (!encompass_arr.size ()) { - set_elt_property ("transparent", SCM_BOOL_T); - set_extent_callback (0, X_AXIS); - set_extent_callback (0, Y_AXIS); + suicide(); return; } @@ -607,6 +603,8 @@ Slur::get_rods () const +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Slur); + /* Ugh should have dash-length + dash-period */ diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index d9de35e5f3..827213d9fd 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -21,7 +21,6 @@ Spacing_spanner::Spacing_spanner (SCM s) { set_extent_callback (0, X_AXIS); set_extent_callback (0, Y_AXIS); - set_elt_property ("transparent", SCM_BOOL_T); } /* diff --git a/lily/span-bar.cc b/lily/span-bar.cc index 741d7c00f0..da89393ba6 100644 --- a/lily/span-bar.cc +++ b/lily/span-bar.cc @@ -60,17 +60,14 @@ Span_bar::evaluate_empty () { if (!gh_pair_p (get_elt_pointer ("elements"))) { - set_elt_property ("transparent", SCM_BOOL_T); - set_extent_callback (0, X_AXIS); - set_extent_callback (0, Y_AXIS); + suicide (); } SCM gl = get_elt_property ("glyph"); if (!gh_string_p (gl)) { - set_elt_property ("transparent", SCM_BOOL_T); - set_extent_callback (0, X_AXIS); - set_extent_callback (0, Y_AXIS); + suicide (); + return ; } else { String type_str = ly_scm2string (gl); diff --git a/lily/spanner.cc b/lily/spanner.cc index 01ae90892c..3360422090 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -142,7 +142,7 @@ Spanner::spanned_rank_iv () { iv[LEFT] = spanned_drul_[LEFT]->column_l ()->rank_i (); } - if ( spanned_drul_[RIGHT]) + if (spanned_drul_[RIGHT]) { iv[RIGHT] = spanned_drul_[RIGHT]->column_l ()->rank_i (); } @@ -295,3 +295,14 @@ Spanner::get_broken_left_end_align () const return 0.0; } + +void +Spanner::do_derived_mark () +{ + Direction d = LEFT; + do + if (spanned_drul_[d]) + scm_gc_mark (spanned_drul_[d]->self_scm_); + while (flip (&d) != LEFT); +} + diff --git a/lily/staff-symbol.cc b/lily/staff-symbol.cc index 50399d33b5..b791b707fd 100644 --- a/lily/staff-symbol.cc +++ b/lily/staff-symbol.cc @@ -15,8 +15,9 @@ +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Staff_symbol) Molecule -Staff_symbol::do_brew_molecule() const +Staff_symbol::do_brew_molecule () const { Score_element * common = get_bound (LEFT)->common_refpoint (get_bound (RIGHT), X_AXIS); diff --git a/lily/stem-engraver.cc b/lily/stem-engraver.cc index d4d92a7a4f..207fda4489 100644 --- a/lily/stem-engraver.cc +++ b/lily/stem-engraver.cc @@ -76,7 +76,7 @@ Stem_engraver::acknowledge_element(Score_element_info i) int duration_log = r->duration_.durlog_i_; if (!stem_p_) { - stem_p_ = new Stem (SCM_EOL); + stem_p_ = new Stem (get_property ("basicStemProperties")); Staff_symbol_referencer_interface st(stem_p_); st.set_interface (); diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index 4a23d14c35..ee39f337ad 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -48,6 +48,7 @@ Stem_tremolo::dim_callback (Score_element * se, Axis ) } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Stem_tremolo) Molecule Stem_tremolo::do_brew_molecule () const { diff --git a/lily/stem.cc b/lily/stem.cc index 583d777c5c..6c111feee1 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -385,11 +385,10 @@ Stem::before_line_breaking () if (invisible_b ()) { - set_elt_property ("transparent", SCM_BOOL_T); - set_extent_callback (0, Y_AXIS); - set_extent_callback (0, X_AXIS); + remove_elt_property ("molecule-callback"); + // suicide(); } - + set_spacing_hints (); } @@ -454,8 +453,9 @@ Stem::dim_callback (Score_element const *se, Axis ) } -const Real ANGLE = 20* (2.0*M_PI/360.0); // ugh! +const Real ANGLE = 20* (2.0*M_PI/360.0); // ugh! Should be settable. +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Stem) Molecule Stem::do_brew_molecule () const { diff --git a/lily/system-start-delimiter.cc b/lily/system-start-delimiter.cc index aeb2bfd9c1..1977615919 100644 --- a/lily/system-start-delimiter.cc +++ b/lily/system-start-delimiter.cc @@ -59,12 +59,11 @@ System_start_delimiter::after_line_breaking () if (scm_ilength (get_elt_pointer ("elements")) <= 1 && gl == ly_symbol2scm ("bar-line")) { - set_elt_property ("transparent", SCM_BOOL_T); - set_extent_callback (0, X_AXIS); - set_extent_callback (0, Y_AXIS); + suicide (); } } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(System_start_delimiter); Molecule System_start_delimiter::do_brew_molecule ()const { @@ -76,9 +75,7 @@ System_start_delimiter::do_brew_molecule ()const if (gh_number_p (s) && l < gh_scm2double (s)) { System_start_delimiter * me = (System_start_delimiter*)this; - me->set_elt_property ("transparent", SCM_BOOL_T); - me->set_extent_callback (0, X_AXIS); - me->set_extent_callback (0, Y_AXIS); + me->suicide (); return m; } diff --git a/lily/text-item.cc b/lily/text-item.cc index 9e3be5ce81..35e5aa5c3d 100644 --- a/lily/text-item.cc +++ b/lily/text-item.cc @@ -20,6 +20,8 @@ Text_item::Text_item (SCM s) } +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Text_item) + Molecule Text_item::do_brew_molecule () const { diff --git a/lily/tie-column.cc b/lily/tie-column.cc index 146e94d3a1..5ef23866d2 100644 --- a/lily/tie-column.cc +++ b/lily/tie-column.cc @@ -19,7 +19,6 @@ Tie_column::Tie_column (SCM s) set_elt_pointer ("ties", SCM_EOL); set_extent_callback (0, X_AXIS); set_extent_callback (0, Y_AXIS); - set_elt_property ("transparent", SCM_BOOL_T); } void diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index b507048eed..6d07edd453 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -162,7 +162,7 @@ Tie_engraver::process_acknowledged () } } - + SCM basic = get_property ("basicTieProperties"); SCM sparse = get_property ("sparseTies"); if (to_boolean (sparse)) { @@ -173,7 +173,7 @@ Tie_engraver::process_acknowledged () SCM pair = gh_list_ref (head_list, gh_int2scm (i/2)); - Tie * p = new Tie (SCM_EOL); + Tie * p = new Tie (basic); p->set_head (LEFT, dynamic_cast (unsmob_element (gh_car (pair)))); p->set_head (RIGHT, dynamic_cast (unsmob_element (gh_cdr (pair)))); @@ -182,7 +182,7 @@ Tie_engraver::process_acknowledged () } else for (SCM s = head_list; gh_pair_p (s); s = gh_cdr (s)) { - Tie * p = new Tie (SCM_EOL); + Tie * p = new Tie (basic); p->set_head (LEFT, dynamic_cast (unsmob_element (gh_caar (s)))); p->set_head (RIGHT, dynamic_cast (unsmob_element (gh_cdar (s)))); @@ -196,7 +196,7 @@ Tie_engraver::process_acknowledged () } else if (tie_p_arr_.size () > 1 && !tie_column_p_) { - tie_column_p_ = new Tie_column (SCM_EOL); + tie_column_p_ = new Tie_column (get_property ("basicTieColumnProperties")); for (int i = tie_p_arr_.size (); i--; ) tie_column_p_->add_tie (tie_p_arr_ [i]); announce_element (Score_element_info (tie_column_p_, 0)); diff --git a/lily/tie.cc b/lily/tie.cc index daf09ecdab..90debb3079 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -98,9 +98,7 @@ Tie::after_line_breaking () if (!head (LEFT) && !head (RIGHT)) { programming_error ("Tie without heads."); - set_elt_property ("transparent", SCM_BOOL_T); - set_extent_callback (0, X_AXIS); - set_extent_callback (0, Y_AXIS); + suicide (); return; } @@ -192,6 +190,7 @@ Tie::get_rods () const +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Tie) Molecule Tie::do_brew_molecule () const { diff --git a/lily/time-signature.cc b/lily/time-signature.cc index 15d419a94f..bbefb9dcfa 100644 --- a/lily/time-signature.cc +++ b/lily/time-signature.cc @@ -20,6 +20,7 @@ Time_signature::Time_signature (SCM s) } // ugh.! +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Time_signature) Molecule Time_signature::do_brew_molecule () const { diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index 04918610d3..b5f224b51c 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -73,7 +73,7 @@ Tuplet_engraver::do_process_music () if (i < started_span_p_arr_.size () && started_span_p_arr_[i]) continue; - Tuplet_spanner* glep = new Tuplet_spanner (SCM_EOL); + Tuplet_spanner* glep = new Tuplet_spanner (get_property ("basicTupletSpannerProperties")); if (i >= started_span_p_arr_.size ()) started_span_p_arr_.push (glep); else diff --git a/lily/tuplet-spanner.cc b/lily/tuplet-spanner.cc index 70ad67dd4e..fbb5f04872 100644 --- a/lily/tuplet-spanner.cc +++ b/lily/tuplet-spanner.cc @@ -35,6 +35,7 @@ Tuplet_spanner::Tuplet_spanner (SCM s) /* TODO. */ +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Tuplet_spanner) Molecule Tuplet_spanner::do_brew_molecule () const { @@ -207,9 +208,7 @@ Tuplet_spanner::after_line_breaking () if (!column_arr.size ()) { - set_elt_property ("transparent", SCM_BOOL_T); - set_extent_callback (0, X_AXIS); - set_extent_callback (0, Y_AXIS); + suicide (); } Direction d = directional_element (this).get (); diff --git a/lily/volta-spanner.cc b/lily/volta-spanner.cc index 0ad6860ade..4f4880a716 100644 --- a/lily/volta-spanner.cc +++ b/lily/volta-spanner.cc @@ -41,6 +41,7 @@ Volta_spanner::Volta_spanner (SCM s) */ +MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Volta_spanner) Molecule Volta_spanner::do_brew_molecule () const { diff --git a/ly/engraver.ly b/ly/engraver.ly index d3fa0948e5..9e6bbe3bdd 100644 --- a/ly/engraver.ly +++ b/ly/engraver.ly @@ -26,24 +26,25 @@ StaffContext=\translator { % name, glyph id, c0 position supportedClefTypes = #'( - ("treble" . ("G" -2)) - ("violin" . ("G" -2)) - ("G" . ("G" -2)) - ("G2" . ("G" -2)) - ("french" . ("G" -4 )) - ("soprano" . ("C" -4 )) - ("mezzosoprano" . ("C" -2 )) - ("alto" . ("C" 0 )) - ("tenor" . ("C" 2 )) - ("baritone" . ("C" 4 )) - ("varbaritone" . ("F" 0)) - ("bass" . ("F" 2 )) - ("F" . ( "F" 2)) - ("subbass" . ("F" 4)) - ) - clefPitches = #'(("G" . -4) - ("C" . 0) - ("F" . 4)) + ("treble" . ("clefs-G" -2)) + ("violin" . ("clefs-G" -2)) + ("G" . ("clefs-G" -2)) + ("G2" . ("clefs-G" -2)) + ("french" . ("clefs-G" -4 )) + ("soprano" . ("clefs-C" -4 )) + ("mezzosoprano" . ("clefs-C" -2 )) + ("alto" . ("clefs-C" 0 )) + ("tenor" . ("clefs-C" 2 )) + ("baritone" . ("clefs-C" 4 )) + ("varbaritone" . ("clefs-F" 0)) + ("bass" . ("clefs-F" 2 )) + ("F" . ( "clefs-F" 2)) + ("subbass" . ("clefs-F" 4)) + ) + % where is c0 in this clef? + clefPitches = #'(("clefs-G" . -4) + ("clefs-C" . 0) + ("clefs-F" . 4)) \consists "Clef_engraver"; \consists "Key_engraver"; @@ -381,100 +382,173 @@ ScoreContext = \translator { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % default settings, mainly for breakable items + % in alphabetical order %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + basicBarlineProperties = #`( + (break-align-symbol . Staff_bar) + (molecule-callback . ,Bar::scheme_molecule) + (visibility-lambda . ,begin-of-line-invisible) + (breakable . #t) + ) + basicBarNumberProperties = #`( - (breakable . #t) - (visibility-lambda . ,begin-of-line-visible) + (molecule-callback . ,Text_item::scheme_molecule) + (breakable . #t) + (visibility-lambda . ,begin-of-line-visible) ) - basicMarkProperties = #'( - (breakable . #t) - (visibility-lambda . end-of-line-invisible) + + basicBeamProperties = #`( + (molecule-callback . ,Beam::scheme_molecule) + (beam-thickness . 0.42) ; interline! ) - leftEdgeBasicProperties = #'( - (break-align-symbol . Left_edge_item) - (breakable . #t) + + basicBreakAlignProperties = #`( + (breakable . #t) ) - staffSymbolBasicProperties = #'( - (staff-space . 1.0 ) - (line-count . 5 ) - ) - basicTimeSignatureProperties = #`( - (break-align-symbol . Time_signature) - (visibility-lambda . ,all-visible) - (breakable . #t) - ) - basicBarlineProperties = #`( - (break-align-symbol . Staff_bar) - (visibility-lambda . ,begin-of-line-invisible) - (breakable . #t) - ) - basicSystemStartDelimiterProperties = #'( - (collapse-height . 1.0) + + basicBreathingSignProperties = #`( + (break-align-symbol . Breathing_sign) + (breakable . #t ) + (molecule-callback . ,Breathing_sign::scheme_molecule) + (visibility-lambda . ,begin-of-line-invisible) ) - basicKeyProperties = #`( - (break-align-symbol . Key_item) - (visibility-lambda . ,begin-of-line-visible) - (breakable . #t) - ) basicClefItemProperties = #`( + (molecule-callback . ,Score_element::scheme_molecule) (breakable . #t) (break-align-symbol . Clef_item) (visibility-lambda . ,begin-of-line-visible) ) - - basicBeamProperties = #`( - (beam-thickness . 0.42) ; interline! + basicSlurProperties = #`( + (molecule-callback . ,Slur::scheme_molecule) ) - basicStemTremoloProperties = #'( - (beam-width . 4.0) ; interline! - (beam-thickness . 0.42) ; interline! + basicChordNameProperties = #`( + (molecule-callback . ,Chord_name::scheme_molecule) ) - - basicBreathingSignProperties = #'( - (break-align-symbol . Breathing_sign) - (breakable . #t ) - (visibility-lambda . ,begin-of-line-invisible) + basicCollisionProperties = #`( + (axes 0 1) ) - basicOctavateEightProperties = #'( - (self-alignment-X . 0) - (text . "8") - (style . "italic") + basicCrescendoProperties = #`( + (molecule-callback . ,Crescendo::scheme_molecule) + ) + basicDotsProperties = #`( + (molecule-callback . ,Dots::scheme_molecule) ) basicDynamicLineSpannerProperties = #`( - (transparent . #t) + ) basicDynamicTextProperties = # `( (style . "dynamic") + (molecule-callback . ,Text_item::scheme_molecule) (script-priority . 100) (self-alignment-Y . 0) ) + leftEdgeBasicProperties = #`( + (break-align-symbol . Left_edge_item) + (breakable . #t) + ) + basicHyphenSpannerProperties = #`( + (molecule-callback . ,Hyphen_spanner::scheme_molecule) + ) + basicKeyProperties = #`( + (molecule-callback . ,Key_item::scheme_molecule) + (break-align-symbol . Key_item) + (visibility-lambda . ,begin-of-line-visible) + (breakable . #t) + ) + basicLocalKeyProperties = #`( + (molecule-callback . ,Local_key_item::scheme_molecule) + (left-padding . 0.2) + (right-padding . 0.4) + ) + basicLyricExtenderProperties = #`( + (molecule-callback . ,Lyric_extender::scheme_molecule) + ) basicLyricTextProperties = #`( (non-rhythmic . #t) ) - basicRestCollisionProperties = #`( - (transparent . #t) + basicMarkProperties = #`( + (molecule-callback . ,Text_item::scheme_molecule) + (breakable . #t) + (visibility-lambda . ,end-of-line-invisible) ) - basicCollisionProperties = #`( - (transparent . #t) + basicNoteColumnProperties = #`( (axes 0 1) ) - basicSingleMaltGroupingItemProperties = #'( - (transparent . #t) + basicNoteHeadProperties = #`( + (molecule-callback . ,Note_head::scheme_molecule) + ) + + basicOctavateEightProperties = #`( + (self-alignment-X . 0) + (text . "8") + (molecule-callback . ,Text_item::scheme_molecule) + (style . "italic") + ) + basicTextProperties = #`( ) + basicRestProperties = #`( + (molecule-callback . ,Rest::scheme_molecule) + ) + + basicRestCollisionProperties = #`( + ) + basicScriptProperties = #`( + (molecule-callback . ,Script::scheme_molecule) ) - basicBreakAlignProperties = #'( + + basicSlurProperties = #`( + (molecule-callback . ,Slur::scheme_molecule) + ) + + basicSystemStartDelimiterProperties = #`( + (molecule-callback . ,System_start_delimiter::scheme_molecule) + (collapse-height . 1.0) + ) + basicStemProperties = #`( + (molecule-callback . ,Stem::scheme_molecule) + ) + staffSymbolBasicProperties = #`( + (molecule-callback . ,Staff_symbol::scheme_molecule) + (staff-space . 1.0 ) + (line-count . 5 ) + ) + basicTimeSignatureProperties = #`( + (molecule-callback . ,Time_signature::scheme_molecule) + (break-align-symbol . Time_signature) + (visibility-lambda . ,all-visible) (breakable . #t) + ) + basicTieProperties = #`( + (molecule-callback . ,Tie::scheme_molecule) + ) + basicTieColumnProperties = #`( + + ) + basicTupletSpannerProperties = #`( + (molecule-callback . ,Tuplet_spanner::scheme_molecule) + ) + basicStemTremoloProperties = #`( + (molecule-callback . ,Stem_tremolo::scheme_molecule) + (beam-width . 4.0) ; interline! + (beam-thickness . 0.42) ; interline! + ) + + basicSingleMaltGroupingItemProperties = #`( + ) basicInstrumentNameProperties = #`( (breakable . #t) + (molecule-callback . Text_item::scheme_molecule) (break-align-symbol . Instrument_name) (visibility-lambda . ,begin-of-line-visible) ) - basicLocalKeyProperties = #`( - (left-padding . 0.2) - (right-padding . 0.4) + basicVerticalAxisGroupProperties = #`( + (axes 1) ) - + basicVoltaSpannerProperties = #`( + (molecule-callback . ,Volta_spanner::scheme_molecule) + ) + \accepts "Staff"; \accepts "StaffGroup"; \accepts "RhythmicStaff"; diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 0a7749c512..6f2f1bdd76 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,15 +1,15 @@ Begin3 Title: LilyPond -Version: 1.3.55 -Entered-date: 26MAY00 +Version: 1.3.56 +Entered-date: 29MAY00 Description: 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.55.tar.gz + 1000k lilypond-1.3.56.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 1000k lilypond-1.3.55.tar.gz + 1000k lilypond-1.3.56.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index cfc1d1320e..e8efa1de87 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,9 +1,9 @@ Name: lilypond -Version: 1.3.55 +Version: 1.3.56 Release: 1 Copyright: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.55.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.56.tar.gz Summary: A program for printing sheet music. URL: http://www.cs.uu.nl/~hanwen/lilypond # Icon: lilypond-icon.gif -- 2.39.5