From: Francisco Vila Date: Mon, 20 Apr 2009 08:12:40 +0000 (+0200) Subject: Merge branch 'master' into lilypond/translation X-Git-Tag: release/2.13.1-1~45 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=db4c4e9f240b6c1becad366e1b62495e395cc10c;hp=9e31bfb35d99898cb8c1dc854970644fbb613d25;p=lilypond.git Merge branch 'master' into lilypond/translation --- diff --git a/Documentation/user/expressive.itely b/Documentation/user/expressive.itely index 23ca4faba3..998461f47c 100644 --- a/Documentation/user/expressive.itely +++ b/Documentation/user/expressive.itely @@ -575,6 +575,26 @@ c4( e g2) g4( e c2) @end lilypond +@funindex \slurHalfDashed +@funindex slurHalfDashed +@funindex \slurHalfSolid +@funindex slurHalfSolid + +Slurs can also be made half-dashed (the first half dashed, the +second half solid) or half-solid (the first half solid, the second +half dashed): + +@lilypond[verbatim,quote,relative=1] +\slurHalfDashed +g4( e c2) +\slurHalfSolid +c4( e g2) +\slurSolid +g4( e c2) +@end lilypond + + + @funindex \slurUp @funindex slurUp @@ -585,6 +605,8 @@ g4( e c2) @code{\slurNeutral}, @code{\slurDashed}, @code{\slurDotted}, +@code{\slurHaldDashed}, +@code{\slurHalfSolid}, @code{\slurSolid}. @endpredefined @@ -597,6 +619,9 @@ g4( e c2) @lilypondfile[verbatim,lilyquote,texidoc,doctitle] {positioning-text-markups-inside-slurs.ly} +@lilypondfile[verbatim,lilyquote,texidoc,doctitle] +{making-slurs-with-complex-dash-structure.ly} + @seealso Music Glossary: @rglos{slur}. diff --git a/input/lsr/expressive-marks.snippet-list b/input/lsr/expressive-marks.snippet-list index 33515ad24d..ddd1b2dc49 100644 --- a/input/lsr/expressive-marks.snippet-list +++ b/input/lsr/expressive-marks.snippet-list @@ -26,6 +26,7 @@ horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly inserting-a-caesura.ly laissez-vibrer-ties.ly line-arrows.ly +making-slurs-with-complex-dash-structure.ly modifying-default-values-for-articulation-shorthand-notation.ly piano-template-with-centered-dynamics.ly positioning-text-markups-inside-slurs.ly diff --git a/input/lsr/making-slurs-with-complex-dash-structure.ly b/input/lsr/making-slurs-with-complex-dash-structure.ly new file mode 100644 index 0000000000..035a9bb46e --- /dev/null +++ b/input/lsr/making-slurs-with-complex-dash-structure.ly @@ -0,0 +1,39 @@ +%% Do not edit this file; it is auto-generated from input/new +%% This file is in the public domain. +\version "2.13.1" + +\header { + lsrtags = "rhythms, expressive-marks" + texidoc = " +Slurs can be made with complex dash patterns by defining +the @code{dash-definition} property. @code{dash-definition} +is a list of @code{dash-elements}. A @code{dash-element} is a +list of parameters defining the dash behavior for a segment of +the slur. + +The slur is defined in terms of the bezier parameter t +which ranges from 0 +at the left end of the slur to 1 at the right end of the slur. +@code{dash-element} is a list @code{(start-t stop-t dash-fraction +dash-period)}. The region of the slur from @code{start-t} to +@code{stop-t} will have a fraction @code{dash-fraction} +of each @code{dash-period} black. @code{dash-period} is +defined in terms of staff spaces. @code{dash-fraction} is +set to 1 for a solid slur. +" + doctitle = "Making slurs with complex dash structure" +} % begin verbatim + + +\relative c' { + \once \override + Slur #'dash-definition = #'((0 0.3 0.1 0.75) + (0.3 0.6 1 1) + (0.65 1.0 0.4 0.75)) + c( d e f) + \once \override + Slur #'dash-definition = #'((0 0.25 1 1) + (0.3 0.7 0.4 0.75) + (0.75 1.0 1 1)) + c( d e f) +} diff --git a/input/lsr/positioning-grace-notes-with-floating-space.ly b/input/lsr/positioning-grace-notes-with-floating-space.ly index 5068f62997..0b38eadef4 100644 --- a/input/lsr/positioning-grace-notes-with-floating-space.ly +++ b/input/lsr/positioning-grace-notes-with-floating-space.ly @@ -28,5 +28,3 @@ the) graces are put left of the musical columns for the main notes. } >> } - - diff --git a/input/lsr/printing-bar-numbers-at-regular-intervals.ly b/input/lsr/printing-bar-numbers-at-regular-intervals.ly index d0411a7ca9..1041ca6bce 100644 --- a/input/lsr/printing-bar-numbers-at-regular-intervals.ly +++ b/input/lsr/printing-bar-numbers-at-regular-intervals.ly @@ -8,7 +8,7 @@ texidoc = " Bar numbers can be printed at regular intervals by setting the property @code{barNumberVisibility}. Here the bar numbers are printed every two -measures except at the end of the line. +measures except at the end of the line. " doctitle = "Printing bar numbers at regular intervals" @@ -21,7 +21,7 @@ measures except at the end of the line. \bar "" % Print a bar number every second measure \set Score.barNumberVisibility = #(every-nth-bar-number-visible 2) - c1 | c | c | c | c + c1 | c | c | c | c \break c1 | c | c | c | c } diff --git a/input/lsr/printing-bar-numbers-inside-boxes-or-circles.ly b/input/lsr/printing-bar-numbers-inside-boxes-or-circles.ly index 0f30c0928c..24dafb8010 100644 --- a/input/lsr/printing-bar-numbers-inside-boxes-or-circles.ly +++ b/input/lsr/printing-bar-numbers-inside-boxes-or-circles.ly @@ -8,13 +8,11 @@ texidoc = " Bar numbers can also be printed inside boxes or circles. - - " doctitle = "Printing bar numbers inside boxes or circles" } % begin verbatim -\relative c'{ +\relative c' { % Prevent bar numbers at the end of a line and permit them elsewhere \override Score.BarNumber #'break-visibility = #end-of-line-invisible \set Score.barNumberVisibility = #(every-nth-bar-number-visible 4) diff --git a/input/lsr/redefining-grace-note-global-defaults.ly b/input/lsr/redefining-grace-note-global-defaults.ly index 49950650a4..c0c63378f8 100644 --- a/input/lsr/redefining-grace-note-global-defaults.ly +++ b/input/lsr/redefining-grace-note-global-defaults.ly @@ -11,7 +11,7 @@ The global defaults for grace notes are stored in the identifiers @code{startAcciaccaturaMusic}, @code{stopAcciaccaturaMusic}, @code{startAppoggiaturaMusic} and @code{stopAppoggiaturaMusic}, which are defined in the file @code{ly/grace-init.ly}. By redefining them -other effects may be obtained. +other effects may be obtained. " doctitle = "Redefining grace note global defaults" diff --git a/input/lsr/rhythms.snippet-list b/input/lsr/rhythms.snippet-list index e2022dc783..b63ad8e08a 100644 --- a/input/lsr/rhythms.snippet-list +++ b/input/lsr/rhythms.snippet-list @@ -26,6 +26,7 @@ grouping-beats.ly guitar-strum-rhythms.ly heavily-customized-polymetric-time-signatures.ly making-an-object-invisible-with-the-transparent-property.ly +making-slurs-with-complex-dash-structure.ly manually-controlling-beam-positions.ly merging-multi-measure-rests-in-a-polyphonic-part.ly modifying-tuplet-bracket-length.ly diff --git a/input/new/making-slurs-with-complex-dash-structure.ly b/input/new/making-slurs-with-complex-dash-structure.ly new file mode 100644 index 0000000000..e2d1b8cff7 --- /dev/null +++ b/input/new/making-slurs-with-complex-dash-structure.ly @@ -0,0 +1,36 @@ +\version "2.13.1" + +\header { + lsrtags = "rhythms, expressive-marks" + texidoc = " +Slurs can be made with complex dash patterns by defining +the @code{dash-definition} property. @code{dash-definition} +is a list of @code{dash-elements}. A @code{dash-element} is a +list of parameters defining the dash behavior for a segment of +the slur. + +The slur is defined in terms of the bezier parameter t +which ranges from 0 +at the left end of the slur to 1 at the right end of the slur. +@code{dash-element} is a list @code{(start-t stop-t dash-fraction +dash-period)}. The region of the slur from @code{start-t} to +@code{stop-t} will have a fraction @code{dash-fraction} +of each @code{dash-period} black. @code{dash-period} is +defined in terms of staff spaces. @code{dash-fraction} is +set to 1 for a solid slur. +" + doctitle = "Making slurs with complex dash structure" +} + +\relative c' { + \once \override + Slur #'dash-definition = #'((0 0.3 0.1 0.75) + (0.3 0.6 1 1) + (0.65 1.0 0.4 0.75)) + c( d e f) + \once \override + Slur #'dash-definition = #'((0 0.25 1 1) + (0.3 0.7 0.4 0.75) + (0.75 1.0 1 1)) + c( d e f) +} diff --git a/input/regression/finger-chords-dot.ly b/input/regression/finger-chords-dot.ly new file mode 100644 index 0000000000..d54e97c2b4 --- /dev/null +++ b/input/regression/finger-chords-dot.ly @@ -0,0 +1,10 @@ +\version "2.13.1" + +\header { + texidoc = "Scripts right of a chord avoid dots." +} + +\relative c' { + \set fingeringOrientations = #'(right) + 4.. 4. r8. +} diff --git a/input/regression/spanner-after-line-breaking.ly b/input/regression/spanner-after-line-breaking.ly new file mode 100644 index 0000000000..dd5a1edc76 --- /dev/null +++ b/input/regression/spanner-after-line-breaking.ly @@ -0,0 +1,36 @@ +\version "2.13.1" + +\header { +texidoc = "The visibility of left-broken line spanners and hairpins +which end on the first note (i.e., span no time between bounds) is +controlled by the callback @code{ly:spanner::kill-zero-spanned-time}. +" +} + +\paper { ragged-right = ##t } + +\relative c' { + \override TextSpanner #'bound-details = + #'((left + (Y . 0) + (padding . 0.25) + (attach-dir . -1) + (text . "L")) + (right + (Y . 0) + (padding . 0.25) + (text . "R")) + (left-broken + (padding . 5) + (text . #f)) + (right-broken + (text . #f))) + c1\startTextSpan\< \break + \override Hairpin #'to-barline = ##f + \override Hairpin #'after-line-breaking = ##f + c2\stopTextSpan\! + \override TextSpanner #'after-line-breaking = + #ly:spanner::kill-zero-spanned-time + c\startTextSpan\< \break + c1\!\stopTextSpan +} diff --git a/lily/arpeggio.cc b/lily/arpeggio.cc index 7873b5f39c..0265b3dedd 100644 --- a/lily/arpeggio.cc +++ b/lily/arpeggio.cc @@ -165,7 +165,7 @@ Arpeggio::brew_chord_slur (SCM smob) Bezier curve = slur_shape (dy, height_limit, ratio); curve.rotate (M_PI / 2); - Stencil mol (Lookup::slur (curve, lt, lt)); + Stencil mol (Lookup::slur (curve, lt, lt, SCM_UNDEFINED)); mol.translate_axis (heads[LEFT], Y_AXIS); return mol.smobbed_copy (); } diff --git a/lily/bezier.cc b/lily/bezier.cc index 3712b9213e..8f55b3ce50 100644 --- a/lily/bezier.cc +++ b/lily/bezier.cc @@ -265,3 +265,56 @@ Bezier::reverse () b2.control_[CONTROL_COUNT - i - 1] = control_[i]; *this = b2; } + + +/* + Subdivide a bezier at T into LEFT_PART and RIGHT_PART +*/ +void +Bezier::subdivide (Real t, Bezier &left_part, Bezier &right_part) +{ + Offset b2[3]; + Offset b1[2]; + Offset b0; + for (int i = 0; i < 3; i++) + b2[i] = control_[i] + t * (control_[i+1] - control_[i]); + for (int i = 0; i < 2; i++) + b1[i] = b2[i] + t * (b2[i+1] - b2[i]); + b0 = b1[0] + t * (b1[1] - b1[0]); + left_part.control_[0] = control_[0]; + left_part.control_[1] = b2[0]; + left_part.control_[2] = b1[0]; + left_part.control_[3] = b0; + right_part.control_[0] = b0; + right_part.control_[1] = b1[1]; + right_part.control_[2] = b2[2]; + right_part.control_[3] = control_[3]; +} + +/* + Extract a portion of a bezier from T_MIN to T_MAX +*/ + +Bezier +Bezier::extract (Real t_min, Real t_max) +{ + Bezier bez1, bez2, bez3, bez4; + if (t_min == 0.0) + { + for (int i = 0; i < CONTROL_COUNT; i++) + bez2.control_[i] = control_[i]; + } + else + { + subdivide (t_min, bez1, bez2); + } + if (t_max == 1.0) + { + return bez2; + } + else + { + bez2.subdivide ((t_max-t_min)/(1-t_min), bez3, bez4); + return bez3; + } +} diff --git a/lily/hairpin.cc b/lily/hairpin.cc index 249c50206a..bb4fec084b 100644 --- a/lily/hairpin.cc +++ b/lily/hairpin.cc @@ -20,16 +20,6 @@ #include "note-column.hh" #include "warn.hh" -MAKE_SCHEME_CALLBACK (Hairpin, after_line_breaking, 1); -SCM -Hairpin::after_line_breaking (SCM smob) -{ - Spanner *me = dynamic_cast (unsmob_grob (smob)); - consider_suicide (me); - - return SCM_UNSPECIFIED; -} - MAKE_SCHEME_CALLBACK (Hairpin, height, 1); SCM Hairpin::height (SCM smob) @@ -52,38 +42,12 @@ Hairpin::pure_height (SCM smob, SCM, SCM) return ly_interval2scm (Interval (-height, height)); } -void -Hairpin::consider_suicide (Spanner*me) -{ - Drul_array broken; - Drul_array bounds; - Direction d = LEFT; - do - { - bounds[d] = me->get_bound (d); - broken[d] = bounds[d]->break_status_dir () != CENTER; - } - while (flip (&d) != LEFT); - - if (broken[LEFT] - && ly_is_equal (bounds[RIGHT]->get_column ()->get_property ("when"), - bounds[LEFT]->get_property ("when"))) - me->suicide (); -} - MAKE_SCHEME_CALLBACK (Hairpin, print, 1); - SCM Hairpin::print (SCM smob) { - Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *me = unsmob_spanner (smob); - if (Spanner *orig = dynamic_cast (me->original ())) - { - for (vsize i = 0; i < orig->broken_intos_.size (); i++) - Hairpin::consider_suicide (orig->broken_intos_[i]); - } - SCM s = me->get_property ("grow-direction"); if (!is_direction (s)) { diff --git a/lily/include/bezier.hh b/lily/include/bezier.hh index a04d449725..5cfca578c2 100644 --- a/lily/include/bezier.hh +++ b/lily/include/bezier.hh @@ -22,6 +22,8 @@ public: void reverse (); void rotate (Real); void translate (Offset); + void subdivide (Real, Bezier &, Bezier &); + Bezier extract (Real, Real); Real get_other_coordinate (Axis a, Real x) const; vector solve_point (Axis, Real coordinate) const; diff --git a/lily/include/hairpin.hh b/lily/include/hairpin.hh index 5ce62aaba3..c4a5300de5 100644 --- a/lily/include/hairpin.hh +++ b/lily/include/hairpin.hh @@ -18,8 +18,6 @@ public: DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (height, (SCM)); DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM)); - DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM)); - static void consider_suicide (Spanner*); DECLARE_GROB_INTERFACE(); }; diff --git a/lily/include/lookup.hh b/lily/include/lookup.hh index 8f0844df71..bfe5d57b03 100644 --- a/lily/include/lookup.hh +++ b/lily/include/lookup.hh @@ -20,10 +20,11 @@ struct Lookup static Stencil rotated_box (Real slope, Real width, Real thick, Real blot); static Stencil round_filled_polygon (vector const &points, Real blotdiameter); static Stencil frame (Box b, Real thick, Real blot); - static Stencil slur (Bezier controls, Real cthick, Real thick); - static Stencil bezier_sandwich (Bezier top_curve, Bezier bottom_curve); + static Stencil slur (Bezier controls, Real cthick, Real thick, + SCM dash_definition); + static Stencil bezier_sandwich (Bezier top_curve, Bezier bottom_curve, + Real thickness); static Stencil beam (Real slope, Real width, Real thick, Real blot); - static Stencil dashed_slur (Bezier b, Real thick, Real dash_period, Real dash_fraction); static Stencil blank (Box b); static Stencil filled_box (Box b); static Stencil round_filled_box (Box b, Real blotdiameter); diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh index 24176326d3..57dcb9271e 100644 --- a/lily/include/spanner.hh +++ b/lily/include/spanner.hh @@ -36,6 +36,7 @@ class Spanner : public Grob public: DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); DECLARE_SCHEME_CALLBACK (bounds_width, (SCM)); + DECLARE_SCHEME_CALLBACK (kill_zero_spanned_time, (SCM)); vector broken_intos_; diff --git a/lily/line-spanner.cc b/lily/line-spanner.cc index b19151987f..2e6eb1b851 100644 --- a/lily/line-spanner.cc +++ b/lily/line-spanner.cc @@ -13,7 +13,6 @@ #include "item.hh" #include "lily-proto.hh" #include "line-interface.hh" -#include "moment.hh" #include "output-def.hh" #include "pointer-group-interface.hh" #include "spanner.hh" @@ -26,7 +25,6 @@ class Line_spanner { public: DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM)); DECLARE_SCHEME_CALLBACK (calc_left_bound_info, (SCM)); DECLARE_SCHEME_CALLBACK (calc_left_bound_info_and_text, (SCM)); DECLARE_SCHEME_CALLBACK (calc_right_bound_info, (SCM)); @@ -212,28 +210,8 @@ Line_spanner::print (SCM smob) { Spanner *me = dynamic_cast (unsmob_grob (smob)); - Interval_t moments = me->spanned_time (); - /* - We remove the line at the start of the line. For piano voice - indicators, it makes no sense to have them at the start of the - line. - - I'm not sure what the official rules for glissandi are, but - usually the 2nd note of the glissando is "exact", so when playing - from the start of the line, there is no need to glide. - - From a typographical p.o.v. this makes sense, since the amount of - space left of a note at the start of a line is very small. - - --hwn. - - */ - if (moments.length () == Moment (0,0)) - return SCM_EOL; - Drul_array bounds (me->get_property ("left-bound-info"), me->get_property ("right-bound-info")); - Grob *commonx = me->get_bound (LEFT)->common_refpoint (me->get_bound (RIGHT), X_AXIS); commonx = me->common_refpoint (commonx, X_AXIS); diff --git a/lily/lookup.cc b/lily/lookup.cc index 014d2ec8ab..f856fa5be9 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -86,28 +86,6 @@ Lookup::beam (Real slope, Real width, Real thick, Real blot) return Stencil (b, expr); } -Stencil -Lookup::dashed_slur (Bezier b, Real thick, Real dash_period, Real dash_fraction) -{ - SCM l = SCM_EOL; - - Real on = dash_fraction * dash_period; - Real off = dash_period - on; - - for (int i = 4; i--;) - l = scm_cons (ly_offset2scm (b.control_[i]), l); - - SCM at = (scm_list_n (ly_symbol2scm ("dashed-slur"), - scm_from_double (thick), - scm_from_double (on), - scm_from_double (off), - ly_quote_scm (l), - SCM_UNDEFINED)); - - Box box (b.extent (X_AXIS), b.extent (Y_AXIS)); - return Stencil (box, at); -} - Stencil Lookup::rotated_box (Real slope, Real width, Real thick, Real blot) { @@ -365,47 +343,84 @@ Lookup::frame (Box b, Real thick, Real blot) Make a smooth curve along the points */ Stencil -Lookup::slur (Bezier curve, Real curvethick, Real linethick) +Lookup::slur (Bezier curve, Real curvethick, Real linethick, + SCM dash_details) { + Stencil return_value; + + /* calculate the offset for the two beziers that make the sandwich + * for the slur + */ Real alpha = (curve.control_[3] - curve.control_[0]).arg (); Bezier back = curve; Offset perp = curvethick * complex_exp (Offset (0, alpha + M_PI / 2)) * 0.5; - back.reverse (); back.control_[1] += perp; back.control_[2] += perp; curve.control_[1] -= perp; curve.control_[2] -= perp; - - SCM scontrols[8]; - - for (int i = 0; i < 4; i++) - scontrols[i] = ly_offset2scm (back.control_[i]); - for (int i = 0; i < 4; i++) - scontrols[i + 4] = ly_offset2scm (curve.control_[i]); - - /* - Need the weird order b.o. the way PS want its arguments - */ - int indices[] = {5, 6, 7, 4, 1, 2, 3, 0}; - SCM list = SCM_EOL; - for (int i = 8; i--;) - list = scm_cons (scontrols[indices[i]], list); - - SCM at = (scm_list_n (ly_symbol2scm ("bezier-sandwich"), - ly_quote_scm (list), - scm_from_double (linethick), - SCM_UNDEFINED)); - Box b (curve.extent (X_AXIS), - curve.extent (Y_AXIS)); - - b[X_AXIS].unite (back.extent (X_AXIS)); - b[Y_AXIS].unite (back.extent (Y_AXIS)); - - b.widen (0.5 * linethick, 0.5 * linethick); - return Stencil (b, at); + +/* Bezier test1, test2, test3, test4; + test1 = back.extract(0., 1.0) ; + test2 = curve.extract (0., 1.0); + test3 = back.extract(0.0, 0.2); + test4 = curve.extract (0.0, 0.2); + return_value = bezier_sandwich (test1, test2, linethick); +// return_value.add_stencil ( +// bezier_sandwich (test3, test4, linethick)); + return return_value; */ + + if ((dash_details == SCM_UNDEFINED) || (dash_details == SCM_EOL)) + { /* solid slur */ + return_value = bezier_sandwich (back, curve, linethick); + } + else + { /* dashed or combination slur */ + int num_segments = scm_to_int (scm_length (dash_details)); + for (int i=0; iget_object ("accidental-grob"))) Side_position_interface::add_support (f, unsmob_grob (ft.head_->get_object ("accidental-grob"))); + else if (unsmob_grob (ft.head_->get_object ("dot"))) + Side_position_interface::add_support (f, + unsmob_grob (ft.head_->get_object ("dot"))); Self_alignment_interface::set_align_self (f, Y_AXIS); Self_alignment_interface::set_center_parent (f, Y_AXIS); diff --git a/lily/slur.cc b/lily/slur.cc index b1794ad401..7b0553124a 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -119,15 +119,21 @@ Slur::print (SCM smob) Bezier one = get_curve (me); Stencil a; - SCM p = me->get_property ("dash-period"); - SCM f = me->get_property ("dash-fraction"); - if (scm_is_number (p) && scm_is_number (f)) - a = Lookup::dashed_slur (one, line_thick, robust_scm2double (p, 1.0), - robust_scm2double (f, 0)); - else + SCM dash_definition = me->get_property ("dash-definition"); +// SCM p = me->get_property ("dash-period"); +// SCM f = me->get_property ("dash-fraction"); +// SCM interval = me->get_property ("dash-interval"); +// if (scm_is_number (p) && scm_is_number (f)) +// a = Lookup::dashed_slur (one, line_thick, robust_scm2double (p, 1.0), +// robust_scm2double (f, 0)); +// else a = Lookup::slur (one, get_grob_direction (me) * base_thick, - line_thick); + line_thick, + dash_definition); +// robust_scm2double (p, 1.0), +// robust_scm2double (f, 0), +// robust_scm2double (interval, 1)); #if DEBUG_SLUR_SCORING SCM annotation = me->get_property ("annotation"); @@ -417,8 +423,7 @@ ADD_INTERFACE (Slur, "annotation " "avoid-slur " /* UGH. */ "control-points " - "dash-fraction " - "dash-period " + "dash-definition " "details " "direction " "eccentricity " diff --git a/lily/spanner.cc b/lily/spanner.cc index 8533bc72fc..12346042df 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -6,15 +6,14 @@ (c) 1996--2009 Han-Wen Nienhuys */ -#include "pointer-group-interface.hh" #include "libc-extension.hh" -#include "paper-column.hh" +#include "moment.hh" #include "paper-column.hh" #include "paper-score.hh" +#include "pointer-group-interface.hh" #include "stencil.hh" #include "system.hh" #include "warn.hh" -#include "moment.hh" Grob * Spanner::clone () const @@ -78,9 +77,7 @@ Spanner::do_break_processing () for (int a = X_AXIS; a < NO_AXES; a++) { if (Spanner *parent = dynamic_cast (get_parent ((Axis)a))) - { - parent_rank_slice.intersect (parent->spanned_rank_interval ()); - } + parent_rank_slice.intersect (parent->spanned_rank_interval ()); } for (vsize i = 1; i < break_points.size (); i++) @@ -118,7 +115,6 @@ Spanner::do_break_processing () span->set_bound (RIGHT, bounds[RIGHT]); if (!bounds[LEFT]->get_system () - || !bounds[RIGHT]->get_system () || bounds[LEFT]->get_system () != bounds[RIGHT]->get_system ()) { @@ -178,7 +174,7 @@ Spanner::spanned_time () const Item * Spanner::get_bound (Direction d) const { - return spanned_drul_ [d]; + return spanned_drul_[d]; } /* @@ -209,7 +205,6 @@ Spanner::set_bound (Direction d, Grob *s) [maybe we should try keeping all columns alive?, and perhaps inherit position from their (non-)musical brother] - */ if (dynamic_cast (i)) Pointer_group_interface::add_grob (i, ly_symbol2scm ("bounded-by-me"), this); @@ -219,14 +214,13 @@ Spanner::Spanner (SCM s) : Grob (s) { break_index_ = 0; - spanned_drul_[LEFT] = 0; - spanned_drul_[RIGHT] = 0; + spanned_drul_.set (0, 0); } Spanner::Spanner (Spanner const &s) : Grob (s) { - spanned_drul_[LEFT] = spanned_drul_[RIGHT] = 0; + spanned_drul_.set (0, 0); } Real @@ -254,7 +248,7 @@ Spanner::get_system () const Grob * Spanner::find_broken_piece (System *l) const { - vsize idx = binary_search (broken_intos_, (Spanner *)l, Spanner::less); + vsize idx = binary_search (broken_intos_, (Spanner *) l, Spanner::less); if (idx != VPOS) return broken_intos_ [idx]; return 0; @@ -412,7 +406,6 @@ Spanner::bounds_width (SCM grob) { Spanner *me = unsmob_spanner (grob); - Grob *common = me->get_bound (LEFT)->common_refpoint (me->get_bound (RIGHT), X_AXIS); Interval w (me->get_bound (LEFT)->relative_coordinate (common, X_AXIS), @@ -423,6 +416,33 @@ Spanner::bounds_width (SCM grob) return ly_interval2scm (w); } +MAKE_SCHEME_CALLBACK (Spanner, kill_zero_spanned_time, 1); +SCM +Spanner::kill_zero_spanned_time (SCM grob) +{ + Spanner *me = unsmob_spanner (grob); + Interval_t moments = me->spanned_time (); + /* + Remove the line or hairpin at the start of the line. For + piano voice indicators, it makes no sense to have them at + the start of the line. + + I'm not sure what the official rules for glissandi are, but + usually the 2nd note of the glissando is "exact", so when playing + from the start of the line, there is no need to glide. + + From a typographical p.o.v. this makes sense, since the amount of + space left of a note at the start of a line is very small. + + --hwn. + + */ + if (moments.length () == Moment (0, 0)) + me->suicide (); + + return SCM_UNSPECIFIED; +} + ADD_INTERFACE (Spanner, "Some objects are horizontally spanned between objects. For" " example, slurs, beams, ties, etc. These grobs form a subtype" diff --git a/lily/tie.cc b/lily/tie.cc index 5c64db6494..955076b663 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -265,17 +265,23 @@ Tie::print (SCM smob) Stencil a; - SCM p = me->get_property ("dash-period"); - SCM f = me->get_property ("dash-fraction"); - if (scm_is_number (p) && scm_is_number (f)) - a = Lookup::dashed_slur (b, - line_thick, - robust_scm2double (p, 1.0), - robust_scm2double (f, 0)); - else + SCM dash_definition = me->get_property ("dash-definition"); +// SCM p = me->get_property ("dash-period"); +// SCM f = me->get_property ("dash-fraction"); +// SCM interval = me->get_property ("dash-interval"); +// if (scm_is_number (p) && scm_is_number (f)) +// a = Lookup::dashed_slur (b, +// line_thick, +// robust_scm2double (p, 1.0), +// robust_scm2double (f, 0)); +// else a = Lookup::slur (b, get_grob_direction (me) * base_thick, - line_thick); + line_thick, + dash_definition); +// robust_scm2double (p, 1.0), +// robust_scm2double (f, 0), +// robust_scm2double (interval, 1.0)); #if DEBUG_TIE_SCORING SCM annotation = me->get_property ("annotation"); diff --git a/lily/vaticana-ligature.cc b/lily/vaticana-ligature.cc index 3a37fb5dce..861e4352a8 100644 --- a/lily/vaticana-ligature.cc +++ b/lily/vaticana-ligature.cc @@ -126,7 +126,7 @@ vaticana_brew_flexa (Grob *me, if (solid) { Stencil solid_head - = Lookup::bezier_sandwich (top_curve, bottom_curve); + = Lookup::bezier_sandwich (top_curve, bottom_curve, 0.0); stencil.add_stencil (solid_head); } else // outline @@ -134,13 +134,13 @@ vaticana_brew_flexa (Grob *me, Bezier inner_top_curve = top_curve; inner_top_curve.translate (Offset (0.0, -line_thickness)); Stencil top_edge - = Lookup::bezier_sandwich (top_curve, inner_top_curve); + = Lookup::bezier_sandwich (top_curve, inner_top_curve, 0.0); stencil.add_stencil (top_edge); Bezier inner_bottom_curve = bottom_curve; inner_bottom_curve.translate (Offset (0.0, +line_thickness)); Stencil bottom_edge - = Lookup::bezier_sandwich (bottom_curve, inner_bottom_curve); + = Lookup::bezier_sandwich (bottom_curve, inner_bottom_curve, 0.0); stencil.add_stencil (bottom_edge); /* diff --git a/ly/predefined-guitar-fretboards.ly b/ly/predefined-guitar-fretboards.ly index 815b704417..fdcc248d34 100644 --- a/ly/predefined-guitar-fretboards.ly +++ b/ly/predefined-guitar-fretboards.ly @@ -103,7 +103,7 @@ % \storePredefinedDiagram \chordmode {d} #guitar-tuning - #"x;x;o;2-1;3-2;2-3;" + #"x;x;o;2-1;3-3;2-2;" \storePredefinedDiagram \chordmode {d:m} #guitar-tuning #"x;x;o;2-2;3-3;1-1;" diff --git a/ly/property-init.ly b/ly/property-init.ly index 2d50a6c601..184c317d76 100644 --- a/ly/property-init.ly +++ b/ly/property-init.ly @@ -11,16 +11,21 @@ slurDown = \override Slur #'direction = #DOWN slurNeutral = \revert Slur #'direction slurDashed = { - \override Slur #'dash-period = #0.75 - \override Slur #'dash-fraction = #0.4 + \override Slur #'dash-definition = #'((0 1 0.4 0.75)) } slurDotted = { - \override Slur #'dash-period = #0.75 - \override Slur #'dash-fraction = #0.1 + \override Slur #'dash-definition = #'((0 1 0.1 0.75)) +} +slurHalfDashed = { + \override Slur #'dash-definition = #'((0 0.5 0.4 0.75) + (0.5 1 1 1)) +} +slurHalfSolid = { + \override Slur #'dash-definition = #'((0 0.5 1 1) + (0.5 1 0.4 0.75)) } slurSolid = { - \revert Slur #'dash-period - \revert Slur #'dash-fraction + \revert Slur #'dash-definition } @@ -29,16 +34,21 @@ phrasingSlurDown = \override PhrasingSlur #'direction = #DOWN phrasingSlurNeutral = \revert PhrasingSlur #'direction phrasingSlurDashed = { - \override PhrasingSlur #'dash-period = #0.75 - \override PhrasingSlur #'dash-fraction = #0.4 + \override PhrasingSlur #'dash-definition = #'((0 1 0.4 0.75)) } phrasingSlurDotted = { - \override PhrasingSlur #'dash-period = #0.75 - \override PhrasingSlur #'dash-fraction = #0.1 + \override PhrasingSlur #'dash-definition = #'((0 1 0.1 0.75)) +} +phrasingSlurHalfDashed = { + \override PhrasingSlur #'dash-definition = #'((0 0.5 0.4 0.75) + (0.5 1 1 1)) +} +phrasingSlurHalfSolid = { + \override PhrasingSlur #'dash-definition = #'((0 0.5 1 1) + (0.5 1 0.4 0.75)) } phrasingSlurSolid = { - \revert PhrasingSlur #'dash-period - \revert PhrasingSlur #'dash-fraction + \revert PhrasingSlur #'dash-definition } mergeDifferentlyDottedOn = { diff --git a/python/convertrules.py b/python/convertrules.py index 72479a952f..2a70225232 100644 --- a/python/convertrules.py +++ b/python/convertrules.py @@ -2891,12 +2891,19 @@ longer in reversed order.\n")) return str @rule ((2, 13, 1), - _ ("\\bar \".\" now produces a thick barline")) + _ ("\\bar \".\" now produces a thick barline\n\ +ly:hairpin::after-line-breaking -> ly:spanner::kill-zero-spanned-time\n\ +Dash parameters for slurs and ties are now in dash-definition")) def conv(str): if re.search(r'\\bar\s*"."', str): stderr_write ("\n") stderr_write (NOT_SMART % _("\\bar \".\" now produces a thick barline.\n")) stderr_write (UPDATE_MANUALLY) + str = re.sub (r'ly:hairpin::after-line-breaking', r'ly:spanner::kill-zero-spanned-time', str) + if (re.search(r'\'dash-fraction', str) or re.search(r'\'dash-period', str): + stderr_write ("\n") + stderr_write (NOT_SMART % _("Dash parameters for slurs and ties are now in \'dash-details.\n")) + stderr_write (UPDATE_MANUALLY) return str # Guidelines to write rules (please keep this at the end of this file) diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 38e7d93d30..8d166a4d23 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -171,6 +171,9 @@ this should list the control points of a third-order B@'ezier curve.") ;; d ;; (damping ,number? "Amount of beam slope damping.") + (dash-definition ,pair? "List of @code{dash-elements} defining the +dash structure. Each @code{dash-element} has a starting t value, +an ending t-value, a @code{dash-fraction}, and a @code{dash-period}.") (dash-fraction ,number? "Size of the dashes, relative to @code{dash-period}. Should be between @code{0.0} (no line) and @code{1.0} (continuous line).") diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 97f36809b8..f8945f99ba 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -756,6 +756,7 @@ (padding . 1.5) )) )) + (after-line-breaking . ,ly:spanner::kill-zero-spanned-time) (stencil . ,ly:line-spanner::print) (left-bound-info . ,ly:line-spanner::calc-left-bound-info) (right-bound-info . ,ly:line-spanner::calc-right-bound-info) @@ -802,7 +803,7 @@ . ( (stencil . ,ly:hairpin::print) (springs-and-rods . ,ly:spanner::set-spacing-rods) - (after-line-breaking . ,ly:hairpin::after-line-breaking) + (after-line-breaking . ,ly:spanner::kill-zero-spanned-time) (grow-direction . ,hairpin::calc-grow-direction) (circled-tip . #f) (to-barline . #t) @@ -2012,7 +2013,7 @@ )) (stencil . ,ly:line-spanner::print) - + (after-line-breaking . ,ly:spanner::kill-zero-spanned-time) (style . trill) (staff-padding . 1.0) (padding . 0.5) @@ -2223,6 +2224,7 @@ (padding . 1.5) )) )) + (after-line-breaking . ,ly:spanner::kill-zero-spanned-time) (stencil . ,ly:line-spanner::print) (left-bound-info . ,ly:line-spanner::calc-left-bound-info) (right-bound-info . ,ly:line-spanner::calc-right-bound-info) diff --git a/scripts/auxiliar/makelsr.py b/scripts/auxiliar/makelsr.py index cb0619f6de..2e72a23272 100755 --- a/scripts/auxiliar/makelsr.py +++ b/scripts/auxiliar/makelsr.py @@ -170,7 +170,7 @@ sys.stderr.write (''' Unsafe files printed in lsr-unsafe.txt: CHECK MANUALLY! git add input/lsr/*.ly - xargs git-diff HEAD < lsr-unsafe.txt + xargs git diff HEAD < lsr-unsafe.txt ''')