From: Han-Wen Nienhuys Date: Mon, 20 Dec 1999 00:22:01 +0000 (+0100) Subject: release: 1.3.15 X-Git-Tag: release/1.3.15 X-Git-Url: https://git.donarmstrong.com/lilypond.git?a=commitdiff_plain;h=refs%2Ftags%2Frelease%2F1.3.15;p=lilypond.git release: 1.3.15 --- diff --git a/CHANGES b/CHANGES index 87bebcbd4b..f0747050e8 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,3 @@ -pl 14.hwn1jcn1 - - chord-name uses scm members - - bfs: knee with different mults, interstaff knee, auto-knee - pl 14.hwn1 - specialize duration.cc for lily, move out of lib/ - stem cleanup diff --git a/INSTALL.txt b/INSTALL.txt index cb25f178c1..847984f75a 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -120,7 +120,7 @@ Website The website is the most convenient form to use for reading the documentation on-line documentation. It is made by entering - make website + make htmldoc This does require a functioning LilyPond. The binary doesn't have to be installed. diff --git a/TODO b/TODO index fe36f4a168..7a30b25a86 100644 --- a/TODO +++ b/TODO @@ -30,6 +30,29 @@ Grep -i for TODO, FIXME and ugh/ugr/urg. . * acc at tied note after linebreak. . * fix font-naming and selecting . * sparse ties. +. * +- in the melody contex I have: + + d8 d, d' d, | + +- in the bass context I have: + + + r8 d4. d4 | + +The problem is with 3rd note from melody / 2nd note from the bass. +lilypond prints them as 2 separate notes, while the original score uses +the same note circle, and draws both up and down stems. Like for the 5th +melody / 3rd bass note. Is there any way to solve this ? It looks like +lilypond doesn't like that the bass note is "4." If I make it "4", then +lilypond will draw it like I want. + +Also, another problem is the midi output. Those bass notes are doubled. +Is there any way to mute one of "them" ? + +Probably this is not a problem with lilypond, but with my lack of +knowledge of music theory and/or lilypond. Anyhow, any help is highly +appreciated, like always :-) . * chord tonic: placement of accidental C#, Cb (from scm and C++) . * note head on stem err msg in dutch. . * why need to run -C mf twice? diff --git a/VERSION b/VERSION index 54c56fb42d..531ec79331 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 -PATCH_LEVEL=14 -MY_PATCH_LEVEL=hwn1jcn1 +PATCH_LEVEL=15 +MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/flower/include/acursor.hh b/flower/include/acursor.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flower/include/full-storage.icc b/flower/include/full-storage.icc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flower/include/handle.hh b/flower/include/handle.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flower/include/iterate.hh b/flower/include/iterate.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flower/include/nscalar.hh b/flower/include/nscalar.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flower/include/priorities.hh b/flower/include/priorities.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flower/include/varray.icc b/flower/include/varray.icc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flower/nscalar.cc b/flower/nscalar.cc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/input/test/auto-isknee.ly b/input/test/auto-isknee.ly deleted file mode 100644 index f2b30b932a..0000000000 --- a/input/test/auto-isknee.ly +++ /dev/null @@ -1,26 +0,0 @@ - -\score { - \notes \context PianoStaff < - \context Staff = "up" { - \autochange Staff \relative c' { - [c8 e'] [c' c,,] - \stemdown - c'8 c c g, - g8 d' d d - \stemup - b8 c d e - } - } - \context Staff = "down" { - \clef bass; - s1*2 - } - > - \paper{ - \translator{ - \StaffContext - autoKneeGap = #13.0 - autoInterstaffKneeGap = #4.0 - } - } -} diff --git a/input/test/auto-knee.ly b/input/test/auto-knee.ly index 3a3fbf55d2..e6541ec2ef 100644 --- a/input/test/auto-knee.ly +++ b/input/test/auto-knee.ly @@ -1,13 +1,26 @@ \score { - \context Staff \notes\relative c'{ -% \property Voice.autoKneeGap = #13 - [c8 e'] [c' c,,] - } + \notes \context PianoStaff < + \context Staff = "up" { + \autochange Staff \relative c' { + [c8 e'] [c' c,,] + \stemdown + c'8 c c g, + g8 d' d d + \stemup + b8 c d e + } + } + \context Staff = "down" { + \clef bass; + s1*2 + } + > \paper{ \translator{ \StaffContext - autoKneeGap = #13 + autoKneeGap = "13.0"; + autoInterstaffKneeGap = "4.0"; } } } diff --git a/lib/duration-convert.cc b/lib/duration-convert.cc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/duration-iter.cc b/lib/duration-iter.cc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/duration.cc b/lib/duration.cc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/include/duration-convert.hh b/lib/include/duration-convert.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/include/duration-iter.hh b/lib/include/duration-iter.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/include/duration.hh b/lib/include/duration.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/include/plet.hh b/lib/include/plet.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/include/thank-you-cygnus.hh b/lib/include/thank-you-cygnus.hh deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/plet.cc b/lib/plet.cc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/thank-you-cygnus.cc b/lib/thank-you-cygnus.cc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lily/beam.cc b/lily/beam.cc index 8620f8747c..3358453076 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -207,9 +207,9 @@ Beam::auto_knee (String gap_str, bool interstaff_b) { bool is_b = (bool)(calc_interstaff_dist (stem (i), this) - calc_interstaff_dist (stem (i-1), this)); - int l_y = (int)(stem (i-1)->head_positions()[get_direction ()]) + int l_y = (int)(stem (i-1)->chord_start_f ()) + (int)calc_interstaff_dist (stem (i-1), this); - int r_y = (int)(stem (i)->head_positions()[get_direction ()]) + int r_y = (int)(stem (i)->chord_start_f ()) + (int)calc_interstaff_dist (stem (i), this); int gap_i = r_y - l_y; @@ -225,7 +225,7 @@ Beam::auto_knee (String gap_str, bool interstaff_b) { for (int i=0; i < stem_count (); i++) { - int y = (int)(stem (i)->head_positions()[get_direction ()]) + int y = (int)(stem (i)->chord_start_f ()) + (int)calc_interstaff_dist (stem (i), this); stem (i)->set_direction (y < knee_y ? UP : DOWN); stem (i)->set_elt_property ("dir-forced", SCM_BOOL_T); @@ -317,9 +317,8 @@ Beam::do_post_processing () set_stem_length (y, dy); y_shift = check_stem_length_f (y, dy); - Staff_symbol_referencer_interface st (this); - Real half_space = st.staff_space () / 2; - if (y_shift > half_space / 4) + Real internote_f = paper_l ()->get_var ("interline") / 2; + if (y_shift > internote_f / 4) { y += y_shift; @@ -328,7 +327,7 @@ Beam::do_post_processing () request quanting the other way. */ int quant_dir = 0; - if (abs (y_shift) > half_space / 2) + if (abs (y_shift) > internote_f / 2) quant_dir = sign (y_shift) * get_direction (); y = quantise_y_f (y, dy, quant_dir); set_stem_length (y, dy); @@ -422,11 +421,11 @@ Beam::calc_slope_damping_f (Real dy) const Real Beam::calc_stem_y_f (Stem* s, Real y, Real dy) const { - Real thick = gh_scm2double (get_elt_property ("beam-thickness")); - int beam_multiplicity = get_multiplicity (); - int stem_multiplicity = (s->flag_i () - 2) >? 0; + Real beam_f = gh_scm2double (get_elt_property ("beam-thickness")); + int multiplicity = get_multiplicity (); + - Real interbeam_f = paper_l ()->interbeam_f (beam_multiplicity); + Real interbeam_f = paper_l ()->interbeam_f (multiplicity); Real x0 = first_visible_stem ()->hpos_f (); Real dx = last_visible_stem ()->hpos_f () - x0; Real stem_y = (s->hpos_f () - x0) / dx * dy + y; @@ -434,9 +433,8 @@ Beam::calc_stem_y_f (Stem* s, Real y, Real dy) const /* knee */ if (get_direction () != s->get_direction ()) { - stem_y -= get_direction () - * (thick / 2 + (beam_multiplicity - 1 - stem_multiplicity)) - * interbeam_f; + stem_y -= get_direction () * (beam_f / 2 + + (multiplicity - 1) * interbeam_f); Staff_symbol_referencer_interface me (s); Staff_symbol_referencer_interface last (last_visible_stem ()); @@ -444,7 +442,7 @@ Beam::calc_stem_y_f (Stem* s, Real y, Real dy) const if ((s != first_visible_stem ()) && me.staff_symbol_l () != last.staff_symbol_l ()) stem_y += get_direction () - * (beam_multiplicity - stem_multiplicity) * interbeam_f; + * (multiplicity - (s->flag_i () - 2) >? 0) * interbeam_f; } return stem_y; } @@ -485,8 +483,7 @@ Beam::check_stem_length_f (Real y, Real dy) const void Beam::set_stem_length (Real y, Real dy) { - Staff_symbol_referencer_interface st (this); - Real half_space = st.staff_space ()/2; + Real internote_f = paper_l ()->get_var ("interline") / 2; for (int i=0; i < stem_count (); i++) { Stem* s = stem (i); @@ -496,7 +493,7 @@ Beam::set_stem_length (Real y, Real dy) Real stem_y = calc_stem_y_f (s, y, dy); /* caution: stem measures in staff-positions */ - s->set_stemend ((stem_y + calc_interstaff_dist (s, this)) / half_space); + s->set_stemend ((stem_y - calc_interstaff_dist (s, this)) / internote_f); } } @@ -504,9 +501,9 @@ Beam::set_stem_length (Real y, Real dy) [Ross] (simplification of) Try to set dy complying with: - zero - - thick / 2 + staffline_f / 2 - - thick + staffline_f - + n * staff_space + - beam_f / 2 + staffline_f / 2 + - beam_f + staffline_f + + n * interline TODO: get allowed-positions as scm list (aarg: from paper block) */ @@ -519,17 +516,17 @@ Beam::quantise_dy_f (Real dy) const return dy; Staff_symbol_referencer_interface st (this); - Real staff_space = st.staff_space (); + Real interline_f = st.staff_space (); Real staffline_f = paper_l ()->get_var ("stafflinethickness"); - Real thick = gh_scm2double (get_elt_property ("beam-thickness"));; + Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));; Array allowed_fraction (3); allowed_fraction[0] = 0; - allowed_fraction[1] = (thick / 2 + staffline_f / 2); - allowed_fraction[2] = (thick + staffline_f); + allowed_fraction[1] = (beam_f / 2 + staffline_f / 2); + allowed_fraction[2] = (beam_f + staffline_f); - allowed_fraction.push (staff_space); + allowed_fraction.push (interline_f); Interval iv = quantise_iv (allowed_fraction, abs (dy)); Real q = (abs (dy) - iv[SMALLER] <= iv[BIGGER] - abs (dy)) ? iv[SMALLER] @@ -567,14 +564,14 @@ Beam::quantise_y_f (Real y, Real dy, int quant_dir) hang straddle sit inter hang */ - Staff_symbol_referencer_interface st (this); - Real staff_space = st.staff_space (); + Staff_symbol_referencer_interface sinf (this); + Real space = sinf.staff_space (); Real staffline_f = paper_l ()->get_var ("stafflinethickness"); - Real thick = gh_scm2double (get_elt_property ("beam-thickness"));; + Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));; Real straddle = 0; - Real sit = thick / 2 - staffline_f / 2; - Real hang = staff_space - thick / 2 + staffline_f / 2; + Real sit = beam_f / 2 - staffline_f / 2; + Real hang = space - beam_f / 2 + staffline_f / 2; /* Put all allowed positions into an array. @@ -608,7 +605,7 @@ Beam::quantise_y_f (Real y, Real dy, int quant_dir) allowed_position.push (hang); } - allowed_position.push (staff_space); + allowed_position.push (space); Real up_y = get_direction () * y; Interval iv = quantise_iv (allowed_position, up_y); @@ -655,7 +652,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const Real interbeam_f = paper_l ()->interbeam_f (multiplicity); - Real thick = gh_scm2double (get_elt_property ("beam-thickness"));; + Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));; Real dy = interbeam_f; Real stemdx = staffline_f; @@ -690,7 +687,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const w = w/2 beam (dydx, w, thick); + a = lookup_l ()->beam (dydx, w, beam_f); a.translate (Offset (-w, -w * dydx)); for (int j = 0; j < lhalfs; j++) { @@ -706,7 +703,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const int rwholebeams= here->beam_count (RIGHT) beam_count (LEFT) ; Real w = next->hpos_f () - here->hpos_f (); - Molecule a = lookup_l ()->beam (dydx, w + stemdx, thick); + Molecule a = lookup_l ()->beam (dydx, w + stemdx, beam_f); a.translate_axis( - stemdx/2, X_AXIS); int j = 0; Real gap_f = 0; @@ -726,7 +723,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const // TODO: notehead widths differ for different types gap_f = nw_f / 2; w -= 2 * gap_f; - a = lookup_l ()->beam (dydx, w + stemdx, thick); + a = lookup_l ()->beam (dydx, w + stemdx, beam_f); } for (; j < rwholebeams; j++) @@ -741,7 +738,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const w = w/2 beam (dydx, w, thick); + a = lookup_l ()->beam (dydx, w, beam_f); for (; j < rwholebeams + rhalfs; j++) { diff --git a/lily/beaming-info.cc b/lily/beaming-info.cc index ef0bb29041..8e16c50988 100644 --- a/lily/beaming-info.cc +++ b/lily/beaming-info.cc @@ -23,7 +23,7 @@ Beaming_info::Beaming_info(Moment m, int i) beams_i_drul_[RIGHT] = i; } -const int infinity_i = 1000; // guh. +const int infinity_i = INT_MAX; // guh. int Beaming_info_list::min_denominator_index () const diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index c22fd18a5b..fcc6031cbb 100644 --- a/lily/chord-name-engraver.cc +++ b/lily/chord-name-engraver.cc @@ -72,8 +72,7 @@ Chord_name_engraver::do_process_requests () if (gh_boolean_p (chord_inversion)) find_inversion_b = gh_scm2bool (chord_inversion); - chord_name_p_ = new Chord_name; - chord_name_p_->set (to_chord (pitch_arr_, tonic_req_, inversion_req_, bass_req_, find_inversion_b)); + chord_name_p_ = new Chord_name (to_chord (pitch_arr_, tonic_req_, inversion_req_, bass_req_, find_inversion_b)); announce_element (Score_element_info (chord_name_p_, 0)); } diff --git a/lily/chord-name.cc b/lily/chord-name.cc index a202812d32..b190520b74 100644 --- a/lily/chord-name.cc +++ b/lily/chord-name.cc @@ -15,59 +15,14 @@ #include "lookup.hh" SCM -to_scm (Musical_pitch p) +pitch2scm (Musical_pitch p) { - return gh_list (gh_int2scm (p.notename_i_), gh_int2scm (p.accidental_i_), gh_int2scm (p.octave_i_), SCM_UNDEFINED); -} - -Musical_pitch -from_scm (SCM s) -{ - return Musical_pitch (gh_scm2int (gh_car (s)), - gh_scm2int (gh_cadr (s)), - gh_scm2int (gh_caddr (s))); -} - -templateSCM -array_to_scm (Array arr) -{ - SCM list = SCM_EOL; - for (int i = arr.size (); i--;) - list = gh_cons (to_scm (arr[i]), list); - return list; -} - -/* - Silly templates - Array scm_to_array (SCM s) - */ -templatevoid -scm_to_array (SCM s, Array* arr) -{ - for (; gh_pair_p (s); s= gh_cdr (s)) - arr->push (from_scm (gh_car (s))); -} - -/* - ugh, move to chord-name-engraver - - Hmm, why not represent complete chord as list? - ((tonic third fifth) (inversion bass)) - */ -void -Chord_name::set (Chord const& c) -{ - set_elt_property ("pitches", array_to_scm (c.pitch_arr_)); - if (c.inversion_b_) - set_elt_property ("inversion", to_scm (c.inversion_pitch_)); - if (c.bass_b_) - set_elt_property ("bass", to_scm (c.bass_pitch_)); + return gh_cons (gh_int2scm (p.notename_i_), gh_int2scm (p.accidental_i_)); } -SCM -notename2scm (Musical_pitch p) +Chord_name::Chord_name (Chord const& c) { - return gh_cons (gh_int2scm (p.notename_i_), gh_int2scm (p.accidental_i_)); + chord_ = c; } /* @@ -115,7 +70,7 @@ Chord_name::ly_text2molecule (SCM scm) const Molecule Chord_name::pitch2molecule (Musical_pitch p) const { - SCM name = scm_eval (gh_list (ly_symbol2scm ("user-pitch-name"), ly_quote_scm (notename2scm (p)), SCM_UNDEFINED)); + SCM name = scm_eval (gh_list (ly_symbol2scm ("user-pitch-name"), ly_quote_scm (pitch2scm (p)), SCM_UNDEFINED)); if (name != SCM_UNSPECIFIED) { @@ -166,7 +121,7 @@ Chord_name::user_chord_name (Array pitch_arr, Chord_mol* name_p) Chord::rebuild_transpose (&chord_type, diff_pitch (pitch_arr[0], Musical_pitch (0)), false); for (int i= chord_type.size (); i--; ) - chord = gh_cons (notename2scm (chord_type[i]), chord); + chord = gh_cons (pitch2scm (chord_type[i]), chord); SCM name = scm_eval (gh_list (ly_symbol2scm ("user-chord-name"), ly_quote_scm (chord), SCM_UNDEFINED)); if (gh_pair_p (name)) @@ -190,7 +145,7 @@ Chord_name::banter (Array pitch_arr, Chord_mol* name_p) const scale.push (Musical_pitch (i)); Musical_pitch tonic = pitch_arr[0]; - Chord::rebuild_transpose (&scale, tonic, true); + chord_.rebuild_transpose (&scale, tonic, true); /* Does chord include this step? -1 if flat @@ -259,16 +214,10 @@ Chord_name::banter (Array pitch_arr, Chord_mol* name_p) const } } -/* - TODO: - fix silly to-and-fro scm conversions - */ Molecule* Chord_name::do_brew_molecule_p () const { - Array pitch_arr; - scm_to_array (get_elt_property ("pitches"), &pitch_arr); - Musical_pitch tonic = pitch_arr[0]; + Musical_pitch tonic = chord_.pitch_arr_[0]; Chord_mol name; name.tonic_mol = pitch2molecule (tonic); @@ -281,17 +230,17 @@ Chord_name::do_brew_molecule_p () const maybe we should check all sub-lists of pitches, not just full list and base triad? */ - if (!user_chord_name (pitch_arr, &name)) + if (!user_chord_name (chord_.pitch_arr_, &name)) { /* else, check if user has listed base triad use user base name and add banter for remaining part */ - if ((pitch_arr.size () > 2) - && user_chord_name (pitch_arr.slice (0, 3), &name)) + if ((chord_.pitch_arr_.size () > 2) + && user_chord_name (chord_.pitch_arr_.slice (0, 3), &name)) { Array base = Chord::base_arr (tonic); - base.concat (pitch_arr.slice (3, pitch_arr.size ())); + base.concat (chord_.pitch_arr_.slice (3, chord_.pitch_arr_.size ())); banter (base, &name); } /* @@ -299,23 +248,22 @@ Chord_name::do_brew_molecule_p () const */ else { - banter (pitch_arr, &name); + banter (chord_.pitch_arr_, &name); } } - SCM s = get_elt_property ("inversion"); - if (s != SCM_UNDEFINED) + if (chord_.inversion_b_) { name.inversion_mol = lookup_l ()->text ("", "/", paper_l ()); - Molecule mol = pitch2molecule (from_scm (s)); + // zucht const& + Molecule mol = pitch2molecule (chord_.inversion_pitch_); name.inversion_mol.add_at_edge (X_AXIS, RIGHT, mol, 0); } - s = get_elt_property ("bass"); - if (s != SCM_UNDEFINED) + if (chord_.bass_b_) { name.bass_mol = lookup_l ()->text ("", "/", paper_l ()); - Molecule mol = pitch2molecule (from_scm (s)); + Molecule mol = pitch2molecule (chord_.bass_pitch_); name.bass_mol.add_at_edge (X_AXIS, RIGHT, mol, 0); } diff --git a/lily/duration.cc b/lily/duration.cc index ea63899a49..03c769ec32 100644 --- a/lily/duration.cc +++ b/lily/duration.cc @@ -26,8 +26,8 @@ Duration::Duration () void Duration::compress (Rational m) { - tuplet_type_i_ *= m.num_i (); - tuplet_iso_i_ *= m.den_i (); + tuplet_iso_i_ *= m.num_i (); + tuplet_type_i_ *= m.den_i (); } Rational diff --git a/lily/include/chord-name.hh b/lily/include/chord-name.hh index 04c20ffb18..0089445694 100644 --- a/lily/include/chord-name.hh +++ b/lily/include/chord-name.hh @@ -33,7 +33,13 @@ public: bool user_chord_name (Array pitch_arr, Chord_mol* name_p) const; void banter (Array pitch_arr, Chord_mol* name_p) const; - void set (Chord const& c); + Chord_name (Chord const& c); + + /* + ugh. Junkme, I must be elt property. + */ + + Chord chord_; protected: virtual Molecule* do_brew_molecule_p () const; diff --git a/lily/include/plet.hh b/lily/include/plet.hh deleted file mode 100644 index 3a3b234781..0000000000 --- a/lily/include/plet.hh +++ /dev/null @@ -1,25 +0,0 @@ -/* - plet.hh -- declare Plet - - source file of the GNU LilyPond music typesetter - - (c) 1997--1999 Han-Wen Nienhuys -*/ - - -#ifndef PLET_HH -#define PLET_HH -#include "rational.hh" - -/** - The type and replacement value of a plet (triplet, quintuplet.) Conceptually the same as a rational, but 4/6 != 2/3. - - (plet) - */ -struct Plet { - Plet (); - Rational mom () const; - bool unit_b () const; -}; - -#endif // PLET_HH diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 3a32c03d69..21723f7713 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -197,7 +197,6 @@ index_set_cell (SCM s, Direction d, SCM v) return s; } -#if 0 SCM array_to_list (SCM *a , int l) { @@ -208,7 +207,6 @@ array_to_list (SCM *a , int l) } return list; } -#endif SCM ly_warning (SCM str) diff --git a/lily/score-element.cc b/lily/score-element.cc index 55f2b92c6f..6d3be5981c 100644 --- a/lily/score-element.cc +++ b/lily/score-element.cc @@ -367,6 +367,9 @@ Score_element::add_dependency (Score_element*e) SCM Score_element::handle_broken_smobs (SCM s, SCM criterion) { + again: + + Score_element *sc = unsmob_element ( s); if (sc) { @@ -402,16 +405,25 @@ Score_element::handle_broken_smobs (SCM s, SCM criterion) /* UGH! breaks on circular lists. */ - gh_set_car_x (s, handle_broken_smobs (gh_car (s), criterion)); - gh_set_cdr_x (s, handle_broken_smobs (gh_cdr (s), criterion)); - - SCM c = gh_cdr(s); - - // gh_list_p () is linear, this is O(1) - bool list = gh_pair_p (c) || c == SCM_EOL; + SCM car = handle_broken_smobs (gh_car (s), criterion); + SCM cdr = gh_cdr (s); - if (gh_car (s) == SCM_UNDEFINED && list) - return c; + if (car == SCM_UNDEFINED + && (gh_pair_p (cdr) || cdr == SCM_EOL)) + { + /* + This is tail-recursion, ie. + + return handle_broken_smobs (cdr, criterion); + + We don't want to rely on the compiler to do this. */ + s = cdr; + goto again; + } + + gh_set_car_x (s, car); + gh_set_cdr_x (s, handle_broken_smobs (cdr, criterion)); + return s; } return s; } diff --git a/lily/stem.cc b/lily/stem.cc index ef6e10a501..b86b38c2d6 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -92,6 +92,8 @@ Stem::stem_end_position () const { Stem * me = (Stem*) this; len = get_default_stemlen (); + + // FIXME: len != position me->set_elt_property ("stem-end-position", gh_double2scm (len)); } else @@ -561,7 +563,7 @@ Stem::calc_stem_info () const if (gh_number_p (s)) info.idealy_f_ -= gh_double2scm (s); - Real interstaff_f = -beam_dir* calc_interstaff_dist (this, beam_l ()); + Real interstaff_f = beam_dir* calc_interstaff_dist (this, beam_l ()); info.idealy_f_ += interstaff_f; info.miny_f_ += interstaff_f; diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 028c343a16..73fdd902a0 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,15 +1,15 @@ Begin3 Title: LilyPond -Version: 1.3.14 -Entered-date: 19DEC99 +Version: 1.3.15 +Entered-date: 20DEC99 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.14.tar.gz + 1000k lilypond-1.3.15.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 1000k lilypond-1.3.14.tar.gz + 1000k lilypond-1.3.15.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index d616aaa06d..056d2d1cb3 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,9 +1,9 @@ Name: lilypond -Version: 1.3.14 +Version: 1.3.15 Release: 1 Copyright: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.14.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.15.tar.gz Summary: A program for printing sheet music. URL: http://www.cs.uu.nl/~hanwen/lilypond # get Packager from (undocumented?) ~/.rpmmacros!