From d911a87fbf4cda0fd56676c6a4569dda31eb8f6e Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sun, 22 Aug 2004 21:56:34 +0000 Subject: [PATCH] * input/regression/slur-double.ly: new file. * lily/slur-engraver.cc: add doubleSlurs property * scripts/convert-ly.py (conv): junk script{Up|Down|Both}. --- ChangeLog | 4 ++ Documentation/topdocs/NEWS.texi | 4 +- input/regression/slur-double.ly | 12 +++++ lily/slur-engraver.cc | 82 +++++++++++++++++-------------- scm/define-context-properties.scm | 4 +- scripts/convert-ly.py | 2 + 6 files changed, 68 insertions(+), 40 deletions(-) create mode 100644 input/regression/slur-double.ly diff --git a/ChangeLog b/ChangeLog index bcbb7addf5..599a28e882 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2004-08-22 Han-Wen Nienhuys + * input/regression/slur-double.ly: new file. + + * lily/slur-engraver.cc: add doubleSlurs property + * scm/fret-diagrams.scm (label-fret): use cond instead of case for symbols. diff --git a/Documentation/topdocs/NEWS.texi b/Documentation/topdocs/NEWS.texi index 7c52d8672c..6b62c48a1c 100644 --- a/Documentation/topdocs/NEWS.texi +++ b/Documentation/topdocs/NEWS.texi @@ -8,8 +8,10 @@ @itemize @bullet +@item There is now support for putting two slurs on chords, both above +and below. This is switched on with the @code{doubleSlurs} property. + @item Running trills now have their own spanner and event, -for example, @example c1\startTrillSpan c4\stopTrillSpan diff --git a/input/regression/slur-double.ly b/input/regression/slur-double.ly new file mode 100644 index 0000000000..8639d0ed16 --- /dev/null +++ b/input/regression/slur-double.ly @@ -0,0 +1,12 @@ + +\header { + texidoc = "Some composers use slurs both above and below chords. + This can be typeset by setting @code{doubleSlurs}" +} +\version "2.3.12" + +\paper { raggedright = ##t } +{ + \set doubleSlurs = ##t + 4 ( ) +} diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index c3c4815253..32a414eaa0 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -9,7 +9,7 @@ #include "warn.hh" #include "note-column.hh" #include "context.hh" - +#include "directional-element-interface.hh" #include "engraver.hh" #include "spanner.hh" @@ -17,16 +17,14 @@ It is possible that a slur starts and ends on the same note. At least, it is for phrasing slurs: a note can be both beginning and ending of a phrase. - */ +*/ class Slur_engraver : public Engraver { Drul_array events_; Music * running_slur_start_; - Grob * slur_; - Grob * end_slur_; - - Moment last_start_; + Link_array slurs_; + Link_array end_slurs_; void set_melisma (bool); @@ -44,8 +42,6 @@ public: Slur_engraver::Slur_engraver () { events_[START] =events_[STOP] = 0; - end_slur_ = slur_ = 0; - last_start_ = Moment (-1); } bool @@ -59,15 +55,12 @@ Slur_engraver::try_music (Music *m) Direction d = to_dir (m->get_property ("span-direction")); if (d == START) { - if (slur_) - return false; - events_[START] = m; return true; } else if (d == STOP) { - if (!slur_) + if (slurs_.is_empty ()) return false; events_[STOP] = m; @@ -89,25 +82,25 @@ Slur_engraver::acknowledge_grob (Grob_info info) Grob *e =info.grob_; if (Note_column::has_interface (info.grob_)) { - if (slur_) - New_slur::add_column (slur_, e); - if (end_slur_) - New_slur::add_column (end_slur_, e); + for (int i = slurs_.size (); i--; ) + New_slur::add_column (slurs_[i], e); + for (int i = end_slurs_.size (); i-- ; ) + New_slur::add_column (end_slurs_[i], e); } else { - if (slur_) - New_slur::add_extra_encompass (slur_, e); - if (end_slur_) - New_slur::add_extra_encompass (end_slur_, e); + for (int i = slurs_.size (); i--; ) + New_slur::add_extra_encompass (slurs_[i], e); + for (int i = end_slurs_.size (); i--; ) + New_slur::add_extra_encompass (end_slurs_[i], e); } } void Slur_engraver::finalize () { - if (slur_) - slur_->warning (_("unterminated slur")); + if (slurs_.size ()) + slurs_[0]->warning (_("unterminated slur")); } void @@ -115,32 +108,45 @@ Slur_engraver::process_music () { if (events_[STOP]) { - end_slur_ = slur_; - slur_ = 0; + end_slurs_ = slurs_; + slurs_.clear (); } - if (events_[START] && !slur_) + if (events_[START] && slurs_.is_empty ()) { Music *ev = events_[START]; - slur_ = make_spanner ("Slur", events_[START]->self_scm ()); - if (Direction updown = to_dir (ev->get_property ("direction"))) - slur_->set_property ("direction", scm_int2num (updown)); - } - set_melisma (slur_); + bool double_slurs = to_boolean (get_property ("doubleSlurs")); + + Grob * slur = make_spanner ("Slur", events_[START]->self_scm ()); + Direction updown = to_dir (ev->get_property ("direction")); + if (updown && !double_slurs) + set_grob_direction (slur, updown); + + slurs_.push (slur); + + if (double_slurs) + { + set_grob_direction (slur, DOWN); + slur = make_spanner ("Slur", events_[START]->self_scm ()); + set_grob_direction (slur, UP); + slurs_.push (slur); + } +} +set_melisma (slurs_.size ()); } void Slur_engraver::stop_translation_timestep () { - end_slur_ = 0; - events_[START] = events_[STOP] = 0; +end_slurs_.clear (); +events_[START] = events_[STOP] = 0; } ENTER_DESCRIPTION (Slur_engraver, -/* descr */ "Build slurs grobs from slur events", -/* creats*/ "Slur", -/* accepts */ "slur-event", -/* acks */ "note-column-interface accidental-interface fingering-interface script-interface", -/* reads */ "slurMelismaBusy", -/* write */ ""); + /* descr */ "Build slurs grobs from slur events", + /* creats*/ "Slur", + /* accepts */ "slur-event", + /* acks */ "note-column-interface accidental-interface fingering-interface script-interface", + /* reads */ "slurMelismaBusy doubleSlurs", + /* write */ ""); diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index 8adb87948b..7daf36eb7c 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -173,7 +173,9 @@ This variable is read by @internalsref{Timing_engraver} at ") (decrescendoSpanner ,symbol? "See @code{crescendoSpanner}.") - + (doubleSlurs ,boolean? + "When set, two slurs are created for every slurred +note, one above and one below the chord.") (explicitClefVisibility ,procedure? "@samp{break-visibility} function for clef changes.") (explicitKeySignatureVisibility ,procedure? diff --git a/scripts/convert-ly.py b/scripts/convert-ly.py index 117b8949c3..10aa9d7c52 100644 --- a/scripts/convert-ly.py +++ b/scripts/convert-ly.py @@ -2167,6 +2167,8 @@ def conv (str): \\override Script #'direction }""", str) str = re.sub ('soloADue', 'printPartCombineTexts', str) + str = re.sub (r'\\applymusic\s*#notes-to-clusters', + '\\makeClusters', str) return str conversions.append (((2, 3, 12), conv, -- 2.39.2