From 99242a027c2281ed7674772e9a0ae7fc86024be0 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Tue, 21 Feb 2006 23:53:34 +0000 Subject: [PATCH] * scm/define-music-types.scm (music-descriptions): add RepeatTieEvent * lily/repeat-tie-engraver.cc (acknowledge_note_head): new file. cut & paste froum Laissez_vibrer_engraver. * ly/declarations-init.ly (repeatTie): add \repeatTie * scm/define-grobs.scm (all-grob-descriptions): add RepeatTie, RepeatTieColumn * scm/define-grob-properties.scm (all-user-grob-properties): add head-direction property. * lily/tie-formatting-problem.cc (from_semi_ties): rename from from_lv_ties. Take head direction argument. * lily/semi-tie-column.cc: rename from laissez-vibrer-tie-column.cc. Rename class too. * lily/semi-tie.cc: rename from laissez-vibrer-tie.cc. Rename class too. --- ChangeLog | 21 +++++ input/regression/laissez-vibrer-ties.ly | 12 +-- input/regression/repeat-tie.ly | 16 ++++ ...ibrer-tie-column.hh => semi-tie-column.hh} | 10 +-- .../{laissez-vibrer-tie.hh => semi-tie.hh} | 10 +-- lily/include/tie-formatting-problem.hh | 2 +- lily/repeat-tie-engraver.cc | 84 +++++++++++++++++++ ...ibrer-tie-column.cc => semi-tie-column.cc} | 19 +++-- lily/{laissez-vibrer-tie.cc => semi-tie.cc} | 34 ++++---- lily/tie-formatting-problem.cc | 17 ++-- ly/declarations-init.ly | 1 + ly/engraver-init.ly | 1 + scm/define-grob-properties.scm | 1 + scm/define-grobs.scm | 39 +++++++-- scm/define-music-types.scm | 8 +- 15 files changed, 215 insertions(+), 60 deletions(-) create mode 100644 input/regression/repeat-tie.ly rename lily/include/{laissez-vibrer-tie-column.hh => semi-tie-column.hh} (58%) rename lily/include/{laissez-vibrer-tie.hh => semi-tie.hh} (70%) create mode 100644 lily/repeat-tie-engraver.cc rename lily/{laissez-vibrer-tie-column.cc => semi-tie-column.cc} (73%) rename lily/{laissez-vibrer-tie.cc => semi-tie.cc} (53%) diff --git a/ChangeLog b/ChangeLog index 95945a2203..71dd3c9dea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,26 @@ 2006-02-22 Han-Wen Nienhuys + * scm/define-music-types.scm (music-descriptions): add RepeatTieEvent + + * lily/repeat-tie-engraver.cc (acknowledge_note_head): new file. cut & paste + froum Laissez_vibrer_engraver. + + * ly/declarations-init.ly (repeatTie): add \repeatTie + + * scm/define-grobs.scm (all-grob-descriptions): add RepeatTie, RepeatTieColumn + + * scm/define-grob-properties.scm (all-user-grob-properties): add + head-direction property. + + * lily/tie-formatting-problem.cc (from_semi_ties): rename from + from_lv_ties. Take head direction argument. + + * lily/semi-tie-column.cc: rename from + laissez-vibrer-tie-column.cc. Rename class too. + + * lily/semi-tie.cc: rename from laissez-vibrer-tie.cc. Rename + class too. + * lily/paper-score.cc (find_break_indices): move from Break_algorithm. * lily/break-algorithm.cc (find_break_indices): remove linewidth < diff --git a/input/regression/laissez-vibrer-ties.ly b/input/regression/laissez-vibrer-ties.ly index c02e974b27..aec508ab75 100644 --- a/input/regression/laissez-vibrer-ties.ly +++ b/input/regression/laissez-vibrer-ties.ly @@ -16,16 +16,16 @@ They have fixed size. Their formatting can be tuned with } \relative { - \laissezVibrer - \laissezVibrer - \laissezVibrer - 4.\laissezVibrer + \laissezVibrer r4 + \laissezVibrer r + \laissezVibrer r + 4.\laissezVibrer r - 4\laissezVibrer + 4\laissezVibrer r \override LaissezVibrerTieColumn #'tie-configuration = #'((-7 . -1) (-5 . -1) (-3 . 1) (-1 . 1)) - 4\laissezVibrer + 4\laissezVibrer r } diff --git a/input/regression/repeat-tie.ly b/input/regression/repeat-tie.ly new file mode 100644 index 0000000000..50c7139881 --- /dev/null +++ b/input/regression/repeat-tie.ly @@ -0,0 +1,16 @@ +\header { + + texidoc = "Repeat ties are only connected on the right side to a +note head." + +} + +\version "2.7.35" +\paper { + ragged-right = ##t +} + +\relative c'' { + r4 c4\repeatTie r \repeatTie + +} diff --git a/lily/include/laissez-vibrer-tie-column.hh b/lily/include/semi-tie-column.hh similarity index 58% rename from lily/include/laissez-vibrer-tie-column.hh rename to lily/include/semi-tie-column.hh index 40be6ecd41..cfeb7fc779 100644 --- a/lily/include/laissez-vibrer-tie-column.hh +++ b/lily/include/semi-tie-column.hh @@ -1,5 +1,5 @@ /* - laissez-vibrer-tie-column.hh -- declare Laissez_vibrer_tie_column + semi-tie-column.hh -- declare Laissez_vibrer_tie_column source file of the GNU LilyPond music typesetter @@ -7,14 +7,14 @@ */ -#ifndef TIE_LAISSEZ_VIBRER_COLUMN_HH -#define TIE_LAISSEZ_VIBRER_COLUMN_HH +#ifndef SEMI_TIE_COLUMN_HH +#define SEMI_TIE_COLUMN_HH #include "grob-interface.hh" #include "lily-proto.hh" #include "lily-guile.hh" -struct Laissez_vibrer_tie_column +struct Semi_tie_column { static bool has_interface (Grob *); @@ -22,5 +22,5 @@ struct Laissez_vibrer_tie_column }; -#endif /* TIE_LAISSEZ_VIBRER_COLUMN_HH */ +#endif /* SEMI_TIE_COLUMN_HH */ diff --git a/lily/include/laissez-vibrer-tie.hh b/lily/include/semi-tie.hh similarity index 70% rename from lily/include/laissez-vibrer-tie.hh rename to lily/include/semi-tie.hh index 32d4711789..d0a0baf5b7 100644 --- a/lily/include/laissez-vibrer-tie.hh +++ b/lily/include/semi-tie.hh @@ -1,5 +1,5 @@ /* - laissez-vibrer-tie.hh -- declare Laissez_vibrer_tie + semi-tie.hh -- declare Laissez_vibrer_tie source file of the GNU LilyPond music typesetter @@ -7,14 +7,14 @@ */ -#ifndef TIE_LAISSEZ_VIBRER_HH -#define TIE_LAISSEZ_VIBRER_HH +#ifndef SEMI_TIE_HH +#define SEMI_TIE_HH #include "grob-interface.hh" #include "lily-guile.hh" -struct Laissez_vibrer_tie +struct Semi_tie { static bool has_interface (Grob *); @@ -25,4 +25,4 @@ struct Laissez_vibrer_tie static int get_position (Grob *); }; -#endif /* TIE_LAISSEZ_VIBRER_HH */ +#endif /* SEMI_TIE_HH */ diff --git a/lily/include/tie-formatting-problem.hh b/lily/include/tie-formatting-problem.hh index 18eafec4f0..befb430c5d 100644 --- a/lily/include/tie-formatting-problem.hh +++ b/lily/include/tie-formatting-problem.hh @@ -87,7 +87,7 @@ public: Tie_configuration find_optimal_tie_configuration (Tie_specification const &) const; void from_ties (vector const &ties); void from_tie (Grob *tie); - void from_lv_ties (vector const &); + void from_semi_ties (vector const &, Direction head_dir); void set_chord_outline (vector, Direction); void set_manual_tie_configuration (SCM); Interval get_attachment (Real) const; diff --git a/lily/repeat-tie-engraver.cc b/lily/repeat-tie-engraver.cc new file mode 100644 index 0000000000..4bce211310 --- /dev/null +++ b/lily/repeat-tie-engraver.cc @@ -0,0 +1,84 @@ +/* + repeat-engraver.cc -- implement Repeat_tie_engraver + + source file of the GNU LilyPond music typesetter + + (c) 2005--2006 Han-Wen Nienhuys + +*/ + + +#include "engraver.hh" +#include "item.hh" +#include "pointer-group-interface.hh" + +#include "translator.icc" + +class Repeat_tie_engraver : public Engraver +{ + Music *event_; + Grob *semi_tie_column_; + vector semi_ties_; + + void stop_translation_timestep (); + DECLARE_ACKNOWLEDGER (note_head); + + virtual bool try_music (Music *); +public: + TRANSLATOR_DECLARATIONS (Repeat_tie_engraver); +}; + +Repeat_tie_engraver::Repeat_tie_engraver () +{ + event_ = 0; + semi_tie_column_ = 0; +} + +void +Repeat_tie_engraver::stop_translation_timestep () +{ + event_ = 0; + semi_tie_column_ = 0; + semi_ties_.clear (); +} + +bool +Repeat_tie_engraver::try_music (Music *m) +{ + event_ = m; + return true; +} + +void +Repeat_tie_engraver::acknowledge_note_head (Grob_info inf) +{ + if (!event_) + return; + + if (!semi_tie_column_) + { + semi_tie_column_ = make_item ("RepeatTieColumn", event_->self_scm ()); + } + + Grob *semi_tie = make_item ("RepeatTie", event_->self_scm ()); + semi_tie->set_object ("note-head", inf.grob ()->self_scm ()); + + Pointer_group_interface::add_grob (semi_tie_column_, ly_symbol2scm ("ties"), + semi_tie); + semi_tie->set_parent (semi_tie_column_, Y_AXIS); + semi_ties_.push_back (semi_tie); +} + + + +ADD_ACKNOWLEDGER (Repeat_tie_engraver, note_head); +ADD_TRANSLATOR (Repeat_tie_engraver, + /* doc */ "Create Laissez vibrer items.", + + /* create */ + "RepeatTie " + "RepeatTieColumn ", + + /* accept */ "repeat-tie-event", + /* read */ "", + /* write */ ""); diff --git a/lily/laissez-vibrer-tie-column.cc b/lily/semi-tie-column.cc similarity index 73% rename from lily/laissez-vibrer-tie-column.cc rename to lily/semi-tie-column.cc index 7b99d6e3ce..a7542249b1 100644 --- a/lily/laissez-vibrer-tie-column.cc +++ b/lily/semi-tie-column.cc @@ -1,5 +1,5 @@ /* - laissez-vibrer-tie-column.cc -- implement Laissez_vibrer_tie_column + semi-tie-column.cc -- implement Semi_tie_column source file of the GNU LilyPond music typesetter @@ -7,8 +7,8 @@ */ -#include "laissez-vibrer-tie-column.hh" -#include "laissez-vibrer-tie.hh" +#include "semi-tie-column.hh" +#include "semi-tie.hh" #include "grob.hh" #include "tie-column.hh" #include "tie.hh" @@ -21,12 +21,13 @@ #include "tie-column-format.hh" -ADD_INTERFACE(Laissez_vibrer_tie_column, - "laissez-vibrer-tie-column-interface", +ADD_INTERFACE(Semi_tie_column, + "semi-tie-column-interface", "The interface for a column of l.v. ties.", /* properties */ "positioning-done " + "head-direction " "tie-configuration " ); @@ -35,23 +36,23 @@ ADD_INTERFACE(Laissez_vibrer_tie_column, /* Cut & paste from tie-column.cc */ -MAKE_SCHEME_CALLBACK(Laissez_vibrer_tie_column, calc_positioning_done, 1); +MAKE_SCHEME_CALLBACK(Semi_tie_column, calc_positioning_done, 1); SCM -Laissez_vibrer_tie_column::calc_positioning_done (SCM smob) +Semi_tie_column::calc_positioning_done (SCM smob) { Grob *me = unsmob_grob (smob); extract_grob_set (me, "ties", lv_ro_ties); vector lv_ties (lv_ro_ties); - vector_sort (lv_ties, &Laissez_vibrer_tie::compare); + vector_sort (lv_ties, &Semi_tie::compare); Ties_configuration ties_config; Tie_formatting_problem problem; - problem.from_lv_ties (lv_ties); + problem.from_semi_ties (lv_ties, to_dir (me->get_property ("head-direction"))); SCM manual_configs = me->get_property ("tie-configuration"); problem.set_manual_tie_configuration (manual_configs); diff --git a/lily/laissez-vibrer-tie.cc b/lily/semi-tie.cc similarity index 53% rename from lily/laissez-vibrer-tie.cc rename to lily/semi-tie.cc index b88cb9c45b..bddae0e2b2 100644 --- a/lily/laissez-vibrer-tie.cc +++ b/lily/semi-tie.cc @@ -1,5 +1,5 @@ /* - laissez-vibrer-tie.cc -- implement Laissez_vibrer_tie + semi-tie.cc -- implement Semi_tie source file of the GNU LilyPond music typesetter @@ -7,17 +7,19 @@ */ -#include "laissez-vibrer-tie-column.hh" -#include "laissez-vibrer-tie.hh" +#include "semi-tie-column.hh" +#include "semi-tie.hh" #include "directional-element-interface.hh" #include "grob.hh" #include "tie.hh" #include "warn.hh" #include "staff-symbol-referencer.hh" -ADD_INTERFACE(Laissez_vibrer_tie, - "laissez-vibrer-tie-interface", - "The interface for l.v. tie items.", +ADD_INTERFACE(Semi_tie, + + "semi-tie-interface", + + "A tie which is only on one side connected to note heads. ", /* properties */ "control-points " @@ -27,34 +29,34 @@ ADD_INTERFACE(Laissez_vibrer_tie, "thickness " ); -MAKE_SCHEME_CALLBACK(Laissez_vibrer_tie, calc_control_points, 1) +MAKE_SCHEME_CALLBACK(Semi_tie, calc_control_points, 1) SCM -Laissez_vibrer_tie::calc_control_points (SCM smob) +Semi_tie::calc_control_points (SCM smob) { Grob *me = unsmob_grob (smob); - if (Laissez_vibrer_tie_column::has_interface (me->get_parent (Y_AXIS))) + if (Semi_tie_column::has_interface (me->get_parent (Y_AXIS))) { me->get_parent (Y_AXIS)->get_property ("positioning-done"); } else { - programming_error ("lv tie without Laissez_vibrer_tie_column. Killing lv tie."); + programming_error ("lv tie without Semi_tie_column. Killing lv tie."); me->suicide (); } return SCM_UNSPECIFIED; } -MAKE_SCHEME_CALLBACK(Laissez_vibrer_tie, calc_direction, 1) +MAKE_SCHEME_CALLBACK(Semi_tie, calc_direction, 1) SCM -Laissez_vibrer_tie::calc_direction (SCM smob) +Semi_tie::calc_direction (SCM smob) { Grob *me = unsmob_grob (smob); - if (Laissez_vibrer_tie_column::has_interface (me->get_parent (Y_AXIS))) + if (Semi_tie_column::has_interface (me->get_parent (Y_AXIS))) me->get_parent (Y_AXIS)->get_property("positioning-done"); else { - programming_error ("lv tie without Laissez_vibrer_tie_column"); + programming_error ("lv tie without Semi_tie_column"); set_grob_direction (me, UP); } @@ -62,14 +64,14 @@ Laissez_vibrer_tie::calc_direction (SCM smob) } int -Laissez_vibrer_tie::get_position (Grob *me) +Semi_tie::get_position (Grob *me) { Grob *h = unsmob_grob (me->get_object ("note-head")); return (int) rint (Staff_symbol_referencer::get_position (h)); } int -Laissez_vibrer_tie::compare (Grob *const &s1, +Semi_tie::compare (Grob *const &s1, Grob *const &s2) { return sign (get_position (s1) - get_position (s2)); diff --git a/lily/tie-formatting-problem.cc b/lily/tie-formatting-problem.cc index f1fc922441..4fe618c92e 100644 --- a/lily/tie-formatting-problem.cc +++ b/lily/tie-formatting-problem.cc @@ -252,7 +252,7 @@ Tie_formatting_problem::from_ties (vector const &ties) } void -Tie_formatting_problem::from_lv_ties (vector const &lv_ties) +Tie_formatting_problem::from_semi_ties (vector const &lv_ties, Direction head_dir) { if (lv_ties.empty ()) return; @@ -273,7 +273,7 @@ Tie_formatting_problem::from_lv_ties (vector const &lv_ties) spec.position_ = int (Staff_symbol_referencer::get_position (head)); } - spec.note_head_drul_[LEFT] = head; + spec.note_head_drul_[head_dir] = head; heads.push_back (head); specifications_.push_back (spec); } @@ -284,20 +284,21 @@ Tie_formatting_problem::from_lv_ties (vector const &lv_ties) for (vsize i = 0; i < heads.size (); i++) x_refpoint_ = heads[i]->common_refpoint (x_refpoint_, X_AXIS); - set_chord_outline (heads, LEFT); + set_chord_outline (heads, head_dir); - Real right_most = - infinity_f; + Real extremal = head_dir * infinity_f; - for (vsize i = 0; i < chord_outlines_[LEFT].size (); i++) + for (vsize i = 0; i < chord_outlines_[head_dir].size (); i++) { - right_most = max (right_most, chord_outlines_[LEFT][i].height_); + extremal = head_dir * min (head_dir * extremal, + head_dir * chord_outlines_[head_dir][i].height_); } Skyline_entry right_entry; right_entry.width_.set_full (); - right_entry.height_ = right_most + 1.5; + right_entry.height_ = extremal - head_dir * 1.5; - chord_outlines_[RIGHT].push_back (right_entry); + chord_outlines_[-head_dir].push_back (right_entry); } diff --git a/ly/declarations-init.ly b/ly/declarations-init.ly index 9eef5204b0..393bed2d07 100644 --- a/ly/declarations-init.ly +++ b/ly/declarations-init.ly @@ -66,6 +66,7 @@ escapedSmallerSymbol = #(make-span-event 'CrescendoEvent START) melisma = #(make-span-event 'ManualMelismaEvent START) melismaEnd = #(make-span-event 'ManualMelismaEvent STOP) laissezVibrer = #(make-music 'LaissezVibrerEvent) +repeatTie = #(make-music 'RepeatTieEvent) \include "grace-init.ly" \include "midi-init.ly" diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 6654a65ccb..079a65faca 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -182,6 +182,7 @@ contained staves are not connected vertically." \consists "Grob_pq_engraver" \consists "Forbid_line_break_engraver" \consists "Laissez_vibrer_engraver" + \consists "Repeat_tie_engraver" \consists "Note_head_line_engraver" \consists "Glissando_engraver" \consists "Ligature_bracket_engraver" diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 5cf7e49080..bc4afc84d4 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -231,6 +231,7 @@ of the @code{spacing-increment}.") (grow-direction ,ly:dir? "Crescendo or decrescendo?") (hair-thickness ,number? "Thickness of the thin line in a bar line.") + (head-direction ,ly:dir? "Are the note heads left or right in a semitie?") (height ,ly:dimension? "Height of an object in staff-space.") (height-limit ,ly:dimension? "Maximum slur height: the longer the slur, the closer it is to this height.") diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index c76015ce9b..c99b2eedec 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -718,16 +718,18 @@ (interfaces . (key-signature-interface font-interface break-aligned-interface)))))) - (LaissezVibrerTie + + + (LaissezVibrerTie . ( (stencil . ,ly:tie::print) - (control-points . ,ly:laissez-vibrer-tie::calc-control-points) - (direction . ,ly:laissez-vibrer-tie::calc-direction) + (control-points . ,ly:semi-tie::calc-control-points) + (direction . ,ly:semi-tie::calc-direction) (details . ((ratio . 0.333) (height-limit . 1.0))) (thickness . 1.0) (meta . ((class . Item) - (interfaces . (laissez-vibrer-tie-interface)) + (interfaces . (semi-tie-interface)) )) )) @@ -735,9 +737,10 @@ . ( (X-extent . #f) (Y-extent . #f) - (positioning-done . ,ly:laissez-vibrer-tie-column::calc-positioning-done) + (head-direction . ,LEFT) + (positioning-done . ,ly:semi-tie-column::calc-positioning-done) (meta . ((class . Item) - (interfaces . (laissez-vibrer-tie-column-interface)) + (interfaces . (semi-tie-column-interface)) )) )) @@ -1180,6 +1183,30 @@ (slope . 1.7) (meta . ((class . Item) (interfaces . (percent-repeat-interface)))))) + (RepeatTie + . ( + (stencil . ,ly:tie::print) + (control-points . ,ly:semi-tie::calc-control-points) + (direction . ,ly:semi-tie::calc-direction) + (details . ((ratio . 0.333) + (height-limit . 1.0))) + (thickness . 1.0) + (meta . ((class . Item) + (interfaces . (semi-tie-interface)) + )) + )) + + (RepeatTieColumn + . ( + (X-extent . #f) + (Y-extent . #f) + (head-direction . ,RIGHT) + (positioning-done . ,ly:semi-tie-column::calc-positioning-done) + (meta . ((class . Item) + (interfaces . (semi-tie-column-interface)) + )) + )) + (Rest . ( (stencil . ,ly:rest::print) diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm index 25562da916..64a548de5c 100644 --- a/scm/define-music-types.scm +++ b/scm/define-music-types.scm @@ -230,7 +230,6 @@ Syntax: @var{note}\\laissezVibrer.") (LigatureEvent . ( (description . "(docme).") - (span-type . ligature) (types . (general-music span-event ligature-event event)) )) @@ -413,14 +412,15 @@ goes down).") (RepeatedMusic . ( (description . "Repeat music in different ways") - (type . repeated-music) (types . (general-music repeated-music)) )) - + (RepeatTieEvent + . ((description . "Ties for starting a second volta bracket.") + (types . (general-music event repeat-tie-event)) + )) (Event . ( (description . "Atomic music event.") - (types . (general-music event)) )) -- 2.39.5