2006-02-22 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ * 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 <
}
\relative {
- <c e g>\laissezVibrer
- <c f g>\laissezVibrer
- <c d f g>\laissezVibrer
- <c d f g>4.\laissezVibrer
+ <c e g>\laissezVibrer r4
+ <c f g>\laissezVibrer r
+ <c d f g>\laissezVibrer r
+ <c d f g>4.\laissezVibrer r
- <c d e f>4\laissezVibrer
+ <c d e f>4\laissezVibrer r
\override LaissezVibrerTieColumn #'tie-configuration
= #'((-7 . -1)
(-5 . -1)
(-3 . 1)
(-1 . 1))
- <c d e f>4\laissezVibrer
+ <c d e f>4\laissezVibrer r
}
--- /dev/null
+\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 <c d f g> \repeatTie
+
+}
+++ /dev/null
-/*
- laissez-vibrer-tie-column.hh -- declare Laissez_vibrer_tie_column
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
-*/
-
-#ifndef TIE_LAISSEZ_VIBRER_COLUMN_HH
-#define TIE_LAISSEZ_VIBRER_COLUMN_HH
-
-#include "grob-interface.hh"
-#include "lily-proto.hh"
-#include "lily-guile.hh"
-
-struct Laissez_vibrer_tie_column
-{
- static bool has_interface (Grob *);
-
- DECLARE_SCHEME_CALLBACK(calc_positioning_done, (SCM));
-};
-
-
-#endif /* TIE_LAISSEZ_VIBRER_COLUMN_HH */
-
+++ /dev/null
-/*
- laissez-vibrer-tie.hh -- declare Laissez_vibrer_tie
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
-*/
-
-#ifndef TIE_LAISSEZ_VIBRER_HH
-#define TIE_LAISSEZ_VIBRER_HH
-
-
-#include "grob-interface.hh"
-#include "lily-guile.hh"
-
-struct Laissez_vibrer_tie
-{
- static bool has_interface (Grob *);
-
- DECLARE_SCHEME_CALLBACK (calc_direction, (SCM));
- DECLARE_SCHEME_CALLBACK (calc_control_points, (SCM));
- static int compare (Grob *const &s1,
- Grob *const &s2);
- static int get_position (Grob *);
-};
-
-#endif /* TIE_LAISSEZ_VIBRER_HH */
--- /dev/null
+/*
+ semi-tie-column.hh -- declare Laissez_vibrer_tie_column
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#ifndef SEMI_TIE_COLUMN_HH
+#define SEMI_TIE_COLUMN_HH
+
+#include "grob-interface.hh"
+#include "lily-proto.hh"
+#include "lily-guile.hh"
+
+struct Semi_tie_column
+{
+ static bool has_interface (Grob *);
+
+ DECLARE_SCHEME_CALLBACK(calc_positioning_done, (SCM));
+};
+
+
+#endif /* SEMI_TIE_COLUMN_HH */
+
--- /dev/null
+/*
+ semi-tie.hh -- declare Laissez_vibrer_tie
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#ifndef SEMI_TIE_HH
+#define SEMI_TIE_HH
+
+
+#include "grob-interface.hh"
+#include "lily-guile.hh"
+
+struct Semi_tie
+{
+ static bool has_interface (Grob *);
+
+ DECLARE_SCHEME_CALLBACK (calc_direction, (SCM));
+ DECLARE_SCHEME_CALLBACK (calc_control_points, (SCM));
+ static int compare (Grob *const &s1,
+ Grob *const &s2);
+ static int get_position (Grob *);
+};
+
+#endif /* SEMI_TIE_HH */
Tie_configuration find_optimal_tie_configuration (Tie_specification const &) const;
void from_ties (vector<Grob*> const &ties);
void from_tie (Grob *tie);
- void from_lv_ties (vector<Grob*> const &);
+ void from_semi_ties (vector<Grob*> const &, Direction head_dir);
void set_chord_outline (vector<Item*>, Direction);
void set_manual_tie_configuration (SCM);
Interval get_attachment (Real) const;
+++ /dev/null
-/*
- laissez-vibrer-tie-column.cc -- implement Laissez_vibrer_tie_column
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
-*/
-
-#include "laissez-vibrer-tie-column.hh"
-#include "laissez-vibrer-tie.hh"
-#include "grob.hh"
-#include "tie-column.hh"
-#include "tie.hh"
-#include "directional-element-interface.hh"
-#include "pointer-group-interface.hh"
-#include "staff-symbol-referencer.hh"
-#include "item.hh"
-#include "tie-formatting-problem.hh"
-#include "tie-configuration.hh"
-#include "tie-column-format.hh"
-
-
-ADD_INTERFACE(Laissez_vibrer_tie_column,
- "laissez-vibrer-tie-column-interface",
- "The interface for a column of l.v. ties.",
-
- /* properties */
- "positioning-done "
- "tie-configuration "
- );
-
-
-
-/*
- Cut & paste from tie-column.cc
- */
-MAKE_SCHEME_CALLBACK(Laissez_vibrer_tie_column, calc_positioning_done, 1);
-SCM
-Laissez_vibrer_tie_column::calc_positioning_done (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
-
- extract_grob_set (me, "ties", lv_ro_ties);
- vector<Grob*> lv_ties (lv_ro_ties);
-
- vector_sort (lv_ties, &Laissez_vibrer_tie::compare);
-
- Ties_configuration ties_config;
-
-
- Tie_formatting_problem problem;
-
- problem.from_lv_ties (lv_ties);
-
- SCM manual_configs = me->get_property ("tie-configuration");
- problem.set_manual_tie_configuration (manual_configs);
-
- Ties_configuration base = problem.generate_optimal_chord_configuration ();
- for (vsize i = 0; i < lv_ties.size(); i++)
- {
- Tie::set_control_points (lv_ties[i], problem.common_x_refpoint (), base[i],
- problem.details_);
- set_grob_direction (lv_ties[i], base[i].dir_);
- }
-
- return SCM_BOOL_T;
-}
-
-
+++ /dev/null
-/*
- laissez-vibrer-tie.cc -- implement Laissez_vibrer_tie
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
-*/
-
-#include "laissez-vibrer-tie-column.hh"
-#include "laissez-vibrer-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.",
-
- /* properties */
- "control-points "
- "direction "
- "details "
- "note-head "
- "thickness "
- );
-
-MAKE_SCHEME_CALLBACK(Laissez_vibrer_tie, calc_control_points, 1)
-SCM
-Laissez_vibrer_tie::calc_control_points (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
- if (Laissez_vibrer_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.");
- me->suicide ();
- }
-
- return SCM_UNSPECIFIED;
-}
-
-MAKE_SCHEME_CALLBACK(Laissez_vibrer_tie, calc_direction, 1)
-SCM
-Laissez_vibrer_tie::calc_direction (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
- if (Laissez_vibrer_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");
- set_grob_direction (me, UP);
- }
-
- return SCM_UNSPECIFIED;
-}
-
-int
-Laissez_vibrer_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,
- Grob *const &s2)
-{
- return sign (get_position (s1) - get_position (s2));
-}
-
--- /dev/null
+/*
+ repeat-engraver.cc -- implement Repeat_tie_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+
+#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<Grob*> 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 */ "");
--- /dev/null
+/*
+ semi-tie-column.cc -- implement Semi_tie_column
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#include "semi-tie-column.hh"
+#include "semi-tie.hh"
+#include "grob.hh"
+#include "tie-column.hh"
+#include "tie.hh"
+#include "directional-element-interface.hh"
+#include "pointer-group-interface.hh"
+#include "staff-symbol-referencer.hh"
+#include "item.hh"
+#include "tie-formatting-problem.hh"
+#include "tie-configuration.hh"
+#include "tie-column-format.hh"
+
+
+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 "
+ );
+
+
+
+/*
+ Cut & paste from tie-column.cc
+ */
+MAKE_SCHEME_CALLBACK(Semi_tie_column, calc_positioning_done, 1);
+SCM
+Semi_tie_column::calc_positioning_done (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+
+ extract_grob_set (me, "ties", lv_ro_ties);
+ vector<Grob*> lv_ties (lv_ro_ties);
+
+ vector_sort (lv_ties, &Semi_tie::compare);
+
+ Ties_configuration ties_config;
+
+
+ Tie_formatting_problem problem;
+
+ 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);
+
+ Ties_configuration base = problem.generate_optimal_chord_configuration ();
+ for (vsize i = 0; i < lv_ties.size(); i++)
+ {
+ Tie::set_control_points (lv_ties[i], problem.common_x_refpoint (), base[i],
+ problem.details_);
+ set_grob_direction (lv_ties[i], base[i].dir_);
+ }
+
+ return SCM_BOOL_T;
+}
+
+
--- /dev/null
+/*
+ semi-tie.cc -- implement Semi_tie
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#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(Semi_tie,
+
+ "semi-tie-interface",
+
+ "A tie which is only on one side connected to note heads. ",
+
+ /* properties */
+ "control-points "
+ "direction "
+ "details "
+ "note-head "
+ "thickness "
+ );
+
+MAKE_SCHEME_CALLBACK(Semi_tie, calc_control_points, 1)
+SCM
+Semi_tie::calc_control_points (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ 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 Semi_tie_column. Killing lv tie.");
+ me->suicide ();
+ }
+
+ return SCM_UNSPECIFIED;
+}
+
+MAKE_SCHEME_CALLBACK(Semi_tie, calc_direction, 1)
+SCM
+Semi_tie::calc_direction (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ 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 Semi_tie_column");
+ set_grob_direction (me, UP);
+ }
+
+ return SCM_UNSPECIFIED;
+}
+
+int
+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
+Semi_tie::compare (Grob *const &s1,
+ Grob *const &s2)
+{
+ return sign (get_position (s1) - get_position (s2));
+}
+
}
void
-Tie_formatting_problem::from_lv_ties (vector<Grob*> const &lv_ties)
+Tie_formatting_problem::from_semi_ties (vector<Grob*> const &lv_ties, Direction head_dir)
{
if (lv_ties.empty ())
return;
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);
}
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);
}
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"
\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"
(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.")
(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))
))
))
. (
(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))
))
))
(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)
(LigatureEvent
. (
(description . "(docme).")
-
(span-type . ligature)
(types . (general-music span-event ligature-event event))
))
(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))
))