From bebe3c81debee6cd3fe5d23e0c748a2540965b14 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Fri, 18 Nov 2005 21:36:27 +0000 Subject: [PATCH] * scm/define-grobs.scm (all-grob-descriptions): new grob NestedSystemStartDelimiter. * input/regression/system-start-heavy-bar.ly: new file. * lily/nested-system-start-delimiter-engraver.cc: new file. * lily/nested-system-start-delimiter.cc: new file. * input/regression/system-start-nesting.ly: new file. * scm/define-grobs.scm (all-grob-descriptions): use X side positioning for positioning braces for nested contexts. * lily/system-start-delimiter.cc (print): don't divide extent by staff_space. (print): use style iso. glyph. (staff_bracket): translate glyph inside routine already. --- ChangeLog | 21 +++ Documentation/topdocs/NEWS.tely | 28 +++ input/regression/system-start-heavy-bar.ly | 19 +++ input/regression/system-start-nesting.ly | 24 +++ lily/include/system-start-delimiter.hh | 1 + .../nested-system-start-delimiter-engraver.cc | 120 +++++++++++++ lily/nested-system-start-delimiter.cc | 159 ++++++++++++++++++ lily/spacing-spanner.cc | 7 + lily/system-start-delimiter-engraver.cc | 42 ++--- lily/system-start-delimiter.cc | 95 ++++++----- ly/engraver-init.ly | 1 + scm/define-context-properties.scm | 1 + scm/define-grob-properties.scm | 6 +- scm/define-grobs.scm | 36 +++- 14 files changed, 489 insertions(+), 71 deletions(-) create mode 100644 input/regression/system-start-heavy-bar.ly create mode 100644 input/regression/system-start-nesting.ly create mode 100644 lily/nested-system-start-delimiter-engraver.cc create mode 100644 lily/nested-system-start-delimiter.cc diff --git a/ChangeLog b/ChangeLog index 2610489479..39cae7484d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2005-11-18 Han-Wen Nienhuys + + * scm/define-grobs.scm (all-grob-descriptions): new grob + NestedSystemStartDelimiter. + + * input/regression/system-start-heavy-bar.ly: new file. + + * lily/nested-system-start-delimiter-engraver.cc: new file. + + * lily/nested-system-start-delimiter.cc: new file. + + * input/regression/system-start-nesting.ly: new file. + + * scm/define-grobs.scm (all-grob-descriptions): use X side + positioning for positioning braces for nested contexts. + + * lily/system-start-delimiter.cc (print): don't divide extent by + staff_space. + (print): use style iso. glyph. + (staff_bracket): translate glyph inside routine already. + 2005-11-18 Michael Welsh Duggan * lily/vaticana-ligature-engraver.cc: fixed 2 typos in glyph diff --git a/Documentation/topdocs/NEWS.tely b/Documentation/topdocs/NEWS.tely index b9ee991d56..e3be786d15 100644 --- a/Documentation/topdocs/NEWS.tely +++ b/Documentation/topdocs/NEWS.tely @@ -45,6 +45,34 @@ This document is also available in @uref{NEWS.pdf,PDF}. @itemize @bullet + +@item +It's now possible to easily create deeply nested system start +brackets, + +@lilypond[raggedright] +\new StaffGroup \with { + \remove "System_start_delimiter_engraver" + \consists "Nested_system_start_delimiter_engraver" +} +\relative << + \override StaffGroup.NestedSystemStartDelimiter #'styles + = #'(line-bracket bracket line-bracket) + \set StaffGroup.systemStartDelimiterHierarchy = #'((a (b)) c) + \new Staff { c1 } + \new Staff { c1 } + \new Staff { c1 } + \new Staff { c1 } + \new Staff { c1 } +>> +@end lilypond + + +In addition, there is now also support for ``square'' system start +brackets. + +This feature was sponsored by Trevor Bača. + @item Tie formatting now uses scoring. This opens the road to formatting which handles complex situations require tradeoffs between different diff --git a/input/regression/system-start-heavy-bar.ly b/input/regression/system-start-heavy-bar.ly new file mode 100644 index 0000000000..a5ca7e8298 --- /dev/null +++ b/input/regression/system-start-heavy-bar.ly @@ -0,0 +1,19 @@ +\header { texidoc = "A heavy-bar system start delimiter may be created by tuning the @code{SystemStartBar} grob." + } + +\version "2.7.18" + +\paper { + raggedright = ##t +} +<< + \new StaffGroup + \relative << + \set StaffGroup.systemStartDelimiter = #'SystemStartBar + \override StaffGroup.SystemStartBar #'thickness = #8 + \override StaffGroup.SystemStartBar #'padding = #0.2 + \new Staff { c1 } + \new Staff { c1 } + >> + \new Staff { c1 } +>> diff --git a/input/regression/system-start-nesting.ly b/input/regression/system-start-nesting.ly new file mode 100644 index 0000000000..79ee620077 --- /dev/null +++ b/input/regression/system-start-nesting.ly @@ -0,0 +1,24 @@ +\header { texidoc = "Deeply nested system braces/brackets/etc. may be created with the + @code{Nested_system_start_delimiter_engraver}" + +} + +\version "2.7.18" + +\paper { + raggedright = ##t +} + +\new StaffGroup \with { + \remove "System_start_delimiter_engraver" + \consists "Nested_system_start_delimiter_engraver" +} +\relative << + \override StaffGroup.NestedSystemStartDelimiter #'styles = #'(line-bracket bracket line-bracket) + \set StaffGroup.systemStartDelimiterHierarchy = #'((a (b)) c) + \new Staff { c1 } + \new Staff { c1 } + \new Staff { c1 } + \new Staff { c1 } + \new Staff { c1 } + >> diff --git a/lily/include/system-start-delimiter.hh b/lily/include/system-start-delimiter.hh index 73b0a67543..e8fe049c60 100644 --- a/lily/include/system-start-delimiter.hh +++ b/lily/include/system-start-delimiter.hh @@ -26,6 +26,7 @@ public: static Stencil old_staff_bracket (Grob *, Real); static Stencil staff_brace (Grob *, Real); static Stencil simple_bar (Grob *, Real); + static Stencil line_bracket (Grob *, Real); }; #endif /* SYSTEM_START_DELIMITER_HH */ diff --git a/lily/nested-system-start-delimiter-engraver.cc b/lily/nested-system-start-delimiter-engraver.cc new file mode 100644 index 0000000000..5f8855437d --- /dev/null +++ b/lily/nested-system-start-delimiter-engraver.cc @@ -0,0 +1,120 @@ +/* + new-system-start-delimiter-engraver.cc -- implement + Nested_system_start_delimiter_engraver + + source file of the GNU LilyPond music typesetter + + (c) 2005 Han-Wen Nienhuys + +*/ + +#include "side-position-interface.hh" +#include "system-start-delimiter.hh" +#include "engraver.hh" +#include "staff-symbol.hh" +#include "pointer-group-interface.hh" +#include "paper-column.hh" +#include "output-def.hh" +#include "spanner.hh" + +class Nested_system_start_delimiter_engraver : public Engraver +{ +public: + TRANSLATOR_DECLARATIONS (Nested_system_start_delimiter_engraver); + +protected: + Spanner *delimiter_; + + DECLARE_ACKNOWLEDGER (system_start_delimiter); + DECLARE_ACKNOWLEDGER (staff_symbol); + + void process_music (); + virtual void finalize (); +}; + +Nested_system_start_delimiter_engraver::Nested_system_start_delimiter_engraver () +{ + delimiter_ = 0; +} + +bool +add_staff_to_hierarchy (SCM hierarchy, SCM grob) +{ + for (SCM s = hierarchy; scm_is_pair (s); s = scm_cdr (s)) + { + SCM entry = scm_car (s); + + if (unsmob_grob (entry)) + ; + else if (scm_is_pair (entry)) + { + bool success = add_staff_to_hierarchy (entry, grob); + if (success) + return success; + } + else + { + scm_set_car_x (s, grob); + return true; + } + } + + return false; +} + +void +Nested_system_start_delimiter_engraver::process_music () +{ + if (!delimiter_) + { + delimiter_ = make_spanner ("NestedSystemStartDelimiter", SCM_EOL); + SCM hierarchy = get_property ("systemStartDelimiterHierarchy"); + + + delimiter_->set_object ("staff-hierarchy", ly_deep_copy (hierarchy)); + delimiter_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); + } +} + +void +Nested_system_start_delimiter_engraver::finalize () +{ + if (delimiter_) + delimiter_->set_bound (RIGHT, + unsmob_grob (get_property ("currentCommandColumn"))); +} + +void +Nested_system_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf) +{ + Grob *staff = inf.grob(); + SCM hier = delimiter_->get_object ("staff-hierarchy"); + bool succ = add_staff_to_hierarchy (hier, staff->self_scm ()); + + if (!succ) + { + hier = scm_append_x (scm_list_2 (hier, + scm_list_1 (staff->self_scm ()))); + + delimiter_->set_object ("staff-hierarchy", hier); + } +} + + +void +Nested_system_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf) +{ + Side_position_interface::add_support (inf.grob (), delimiter_); +} + +#include "translator.icc" + +ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, staff_symbol); +ADD_ACKNOWLEDGER (Nested_system_start_delimiter_engraver, system_start_delimiter); + +ADD_TRANSLATOR (Nested_system_start_delimiter_engraver, + /* doc */ "Creates a system start delimiter (ie. SystemStart@{Bar, Brace, Bracket@} spanner", + /* create */ "NestedSystemStartDelimiter", + /* accept */ "", + /* read */ "systemStartDelimiterHierarchy", + /* write */ ""); diff --git a/lily/nested-system-start-delimiter.cc b/lily/nested-system-start-delimiter.cc new file mode 100644 index 0000000000..404685cbe9 --- /dev/null +++ b/lily/nested-system-start-delimiter.cc @@ -0,0 +1,159 @@ +/* + system-start-delimiter.cc -- implement Nested_system_start_delimiter + + source file of the GNU LilyPond music typesetter + + (c) 2000--2005 Han-Wen Nienhuys +*/ + +#include "system-start-delimiter.hh" +#include "spanner.hh" +#include "axis-group-interface.hh" +#include "output-def.hh" +#include "font-interface.hh" +#include "all-font-metrics.hh" +#include "staff-symbol-referencer.hh" +#include "lookup.hh" +#include "item.hh" + +#include "pointer-group-interface.hh" + + +struct Nested_system_start_delimiter +{ +public: + bool has_interface (Grob *); + Stencil static make_substencil (Spanner *, Grob *, SCM, SCM, SCM); + DECLARE_SCHEME_CALLBACK (print, (SCM)); +}; + +Link_array +flatten_hierarchy (SCM hier) +{ + Link_array retval; + if (unsmob_grob (hier)) + retval.push (unsmob_grob (hier)); + + if (scm_is_pair (hier)) + { + retval = flatten_hierarchy (scm_car (hier)); + retval.concat (flatten_hierarchy (scm_cdr (hier))); + } + + return retval; +} + + +Stencil +Nested_system_start_delimiter::make_substencil (Spanner *me, + Grob *common, + SCM hierarchy, + SCM depth_styles, + SCM default_style + ) +{ + Interval ext; + Link_array elts = flatten_hierarchy (hierarchy); + + if (elts.is_empty ()) + return Stencil(); + + int non_empty_count = 0; + for (int i = elts.size (); i--;) + { + Spanner *sp = dynamic_cast (elts[i]); + + if (sp + && sp->get_bound (LEFT) == me->get_bound (LEFT)) + { + Interval dims = sp->extent (common, Y_AXIS); + if (!dims.is_empty ()) + { + non_empty_count ++; + ext.unite (dims); + } + } + } + + SCM glyph_sym = ly_symbol2scm ("bracket"); + if (scm_is_pair (depth_styles)) + glyph_sym = scm_car (depth_styles); + + if (ext.is_empty () + || (robust_scm2double (me->get_property ("collapse-height"), 0.0) >= ext.length())) + { + return Stencil(); + } + + Stencil total; + + Real len = ext.length (); + if (glyph_sym == ly_symbol2scm ("bracket")) + total = System_start_delimiter::staff_bracket (me, len); + else if (glyph_sym == ly_symbol2scm ("brace")) + total = System_start_delimiter::staff_brace (me, len); + else if (glyph_sym == ly_symbol2scm ("bar-line")) + total = System_start_delimiter::simple_bar (me, len); + else if (glyph_sym == ly_symbol2scm ("line-bracket")) + total = System_start_delimiter::line_bracket (me, len); + + total.translate_axis (ext.center (), Y_AXIS); + + Real left_x = total.extent (X_AXIS)[LEFT]; + for (SCM s = hierarchy; scm_is_pair (s); s = scm_cdr (s)) + { + SCM entry = scm_car (s); + + if (scm_is_pair (entry) + && !scm_is_symbol (scm_car (entry))) + { + Stencil sub = make_substencil (me, common, entry, + scm_is_pair (depth_styles) + ? scm_cdr (depth_styles) : SCM_EOL, + default_style); + sub.translate_axis (left_x, X_AXIS); + total.add_stencil (sub); + } + } + + return total; +} + +MAKE_SCHEME_CALLBACK (Nested_system_start_delimiter, print, 1); +SCM +Nested_system_start_delimiter::print (SCM smob) +{ + Spanner *me = unsmob_spanner (smob); + if (!me) + return SCM_EOL; + + SCM hierarchy = me->get_object ("staff-hierarchy"); + Link_array elts = flatten_hierarchy (hierarchy); + Grob *common = common_refpoint_of_array (elts, me, Y_AXIS); + + SCM default_style = me->get_property ("style"); + if (!scm_is_symbol (default_style)) + default_style = ly_symbol2scm ("line-bracket"); + + Stencil total = make_substencil (me, common, hierarchy, me->get_property ("styles"), + default_style); + total.translate_axis (- me->relative_coordinate (common, Y_AXIS), Y_AXIS); + + return total.smobbed_copy (); + +} + +ADD_INTERFACE (Nested_system_start_delimiter, + "nested-system-start-delimiter-interface", + + "The brace, bracket or bar in front of the system. By setting " + "@code{staff-hierarchy}, eg. to @code{(a (b d) c)}, nesting for staff " + "braces can be produced." + , + + + /* properties */ + "collapse-height " + "styles " + "staff-hierarchy " + ); diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index baa7cd483f..254bbbc670 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -25,6 +25,13 @@ using namespace std; #include "staff-spacing.hh" #include "spacing-interface.hh" + +/* + TODO: + + use callback instead? + +*/ Rational Spacing_spanner::effective_shortest_duration (Grob *me, Link_array const &all) diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc index ac341eaa12..293006d9aa 100644 --- a/lily/system-start-delimiter-engraver.cc +++ b/lily/system-start-delimiter-engraver.cc @@ -6,13 +6,15 @@ (c) 2000--2005 Han-Wen Nienhuys */ -#include "system-start-delimiter.hh" #include "engraver.hh" + +#include "system-start-delimiter.hh" #include "staff-symbol.hh" #include "pointer-group-interface.hh" #include "paper-column.hh" #include "output-def.hh" #include "spanner.hh" +#include "side-position-interface.hh" class System_start_delimiter_engraver : public Engraver { @@ -20,7 +22,7 @@ public: TRANSLATOR_DECLARATIONS (System_start_delimiter_engraver); protected: - Spanner *delim_; + Spanner *delimiter_; DECLARE_ACKNOWLEDGER (system_start_delimiter); DECLARE_ACKNOWLEDGER (staff_symbol); @@ -31,52 +33,38 @@ protected: void System_start_delimiter_engraver::acknowledge_staff_symbol (Grob_info inf) { - /* - don't add as Axis_group_interface::add_element (delim_, ), - because that would set the parent as well */ - - Pointer_group_interface::add_grob (delim_, ly_symbol2scm ("elements"), inf.grob ()); + Pointer_group_interface::add_grob (delimiter_, ly_symbol2scm ("elements"), inf.grob ()); } + void System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info inf) { - SCM gl = inf.grob ()->get_property ("glyph"); - SCM my_gl = delim_->get_property ("glyph"); - - /* - UGH UGH - */ - if (scm_is_string (gl) && ly_is_equal (gl, scm_makfrom0str ("brace")) - && scm_is_string (my_gl) && ly_is_equal (my_gl, scm_makfrom0str ("bracket"))) - add_offset_callback (inf.grob (), scm_from_double (-0.8), X_AXIS); - else if (scm_is_string (gl) && ly_is_equal (gl, scm_makfrom0str ("bracket")) - && scm_is_string (my_gl) && ly_is_equal (my_gl, scm_makfrom0str ("bracket"))) - add_offset_callback (inf.grob (), scm_from_double (-0.8), X_AXIS); + Side_position_interface::add_support (inf.grob (), delimiter_); } System_start_delimiter_engraver::System_start_delimiter_engraver () { - delim_ = 0; + delimiter_ = 0; } void System_start_delimiter_engraver::process_music () { - if (!delim_) + if (!delimiter_) { - SCM delim_name = get_property ("systemStartDelimiter"); - delim_ = make_spanner_from_properties (this, delim_name, SCM_EOL, - ly_symbol2string (delim_name).to_str0 ()); + SCM delimiter_name = get_property ("systemStartDelimiter"); + delimiter_ = make_spanner_from_properties (this, delimiter_name, SCM_EOL, + ly_symbol2string (delimiter_name).to_str0 ()); - delim_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); + delimiter_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); } } void System_start_delimiter_engraver::finalize () { - if (delim_) - delim_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + if (delimiter_) + delimiter_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); } #include "translator.icc" diff --git a/lily/system-start-delimiter.cc b/lily/system-start-delimiter.cc index 9973a781ed..c7317a620e 100644 --- a/lily/system-start-delimiter.cc +++ b/lily/system-start-delimiter.cc @@ -17,13 +17,19 @@ #include "staff-symbol-referencer.hh" #include "lookup.hh" #include "item.hh" +#include "line-interface.hh" #include "pointer-group-interface.hh" Stencil System_start_delimiter::staff_bracket (Grob *me, Real height) { - Font_metric *fm = Font_interface::get_default_font (me); + SCM fam = scm_cons (ly_symbol2scm ("font-encoding"), + ly_symbol2scm ("fetaMusic")); + + SCM alist = scm_list_n (fam, SCM_UNDEFINED); + Font_metric *fm = select_font (me->layout (), scm_list_n (alist, SCM_UNDEFINED)); + Drul_array tips (fm->find_by_name ("brackettips.down"), fm->find_by_name ("brackettips.up")); @@ -31,19 +37,48 @@ System_start_delimiter::staff_bracket (Grob *me, Real height) Real overlap = 0.1 * thickness; - Stencil bracket = Lookup::filled_box (Box (Interval (0, thickness), - Interval (-1, 1) - * (height / 2 + overlap))); - + Box box (Interval (0, thickness), + Interval (-1, 1) + * (height / 2 + overlap)); + + Stencil bracket = Lookup::filled_box (box); Direction d = DOWN; do bracket.add_at_edge (Y_AXIS, d, tips[d], -overlap, 0.0); - while (flip (&d) != DOWN) - ; + while (flip (&d) != DOWN); + bracket = Stencil (box, bracket.expr ()); + bracket.translate_axis (-0.8, X_AXIS); + return bracket; } +Stencil +System_start_delimiter::line_bracket (Grob *me, Real height) +{ + height -= 1.0; + + Real thick + = me->layout ()->get_dimension (ly_symbol2scm ("linethickness")) + * robust_scm2double (me->get_property ("thickness"), 1); + Real w = 0.8; + + Stencil tip1 = Line_interface::make_line (thick, + Offset (0, -height/2), + Offset (w, -height/2)); + Stencil tip2 = Line_interface::make_line (thick, + Offset (0, height/2), + Offset (w, height/2)); + Stencil vline = Line_interface::make_line (thick, + Offset (0, -height/2), + Offset (0, height/2)); + + vline.add_stencil (tip1); + vline.add_stencil (tip2); + vline.translate_axis (-w, X_AXIS); + return vline; +} + Stencil System_start_delimiter::simple_bar (Grob *me, Real h) { @@ -58,21 +93,10 @@ SCM System_start_delimiter::print (SCM smob) { Spanner *me = unsmob_spanner (smob); - if (!me) - return SCM_EOL; - - SCM s = me->get_property ("glyph"); - if (!scm_is_string (s)) - return SCM_EOL; - SCM gsym = scm_string_to_symbol (s); - - Real staff_space = Staff_symbol_referencer::staff_space (me); - extract_grob_set (me, "elements", elts); Grob *common = common_refpoint_of_array (elts, me, Y_AXIS); Interval ext; - int non_empty_count = 0; for (int i = elts.size (); i--;) { @@ -90,31 +114,23 @@ System_start_delimiter::print (SCM smob) } } - if (gsym == ly_symbol2scm ("bar-line") - && non_empty_count <= 1) - { - me->suicide (); - return SCM_EOL; - } - - ext -= me->relative_coordinate (common, Y_AXIS); - - Real len = ext.length () / staff_space; - + SCM glyph_sym = me->get_property ("style"); + Real len = ext.length (); if (ext.is_empty () - || (robust_scm2double (me->get_property ("collapse-height"), 0.0) >= len)) + || (robust_scm2double (me->get_property ("collapse-height"), 0.0) >= ext.length ()) + || (glyph_sym == ly_symbol2scm ("bar-line") + && non_empty_count <= 1)) { me->suicide (); - return SCM_EOL; + return SCM_UNSPECIFIED; } Stencil m; - - if (gsym == ly_symbol2scm ("bracket")) + if (glyph_sym == ly_symbol2scm ("bracket")) m = staff_bracket (me, len); - else if (gsym == ly_symbol2scm ("brace")) + else if (glyph_sym == ly_symbol2scm ("brace")) m = staff_brace (me, len); - else if (gsym == ly_symbol2scm ("bar-line")) + else if (glyph_sym == ly_symbol2scm ("bar-line")) m = simple_bar (me, len); m.translate_axis (ext.center (), Y_AXIS); @@ -128,7 +144,7 @@ System_start_delimiter::staff_brace (Grob *me, Real y) /* We go through the style sheet to lookup the font file name. This is better than using find_font directly, esp. because that triggers mktextfm for non-existent - fonts. */ +> fonts. */ SCM fam = scm_cons (ly_symbol2scm ("font-encoding"), ly_symbol2scm ("fetaBraces")); @@ -154,15 +170,18 @@ System_start_delimiter::staff_brace (Grob *me, Real y) Stencil stil (fm->find_by_name ("brace" + to_string (lo))); stil.translate_axis (-b[X_AXIS].length()/2, X_AXIS); + stil.translate_axis (-0.2, X_AXIS); + return stil; } ADD_INTERFACE (System_start_delimiter, "system-start-delimiter-interface", "The brace, bracket or bar in front of the system. " - "It is implemented as a spanner.", + , /* properties */ "collapse-height " - "glyph " + "styles " + "staff-hierarchy " "thickness " ); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 9ac8cfad6d..90bfa08c87 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -586,6 +586,7 @@ AncientRemoveEmptyStaffContext = \context { \consists "Skip_event_swallow_translator" \consists "Separating_line_group_engraver" \consists "Hara_kiri_engraver" + \override VerticalAxisGroup #'remove-empty = ##t \override VerticalAxisGroup #'remove-first = ##t \override VerticalAxisGroup #'minimum-Y-extent = #'(-0.5 . 2.5) diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index 051d1d28dc..430cde9234 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -377,6 +377,7 @@ one).") at beat positions by only drawing one beam over the beat.") (suggestAccidentals ,boolean? "If set, accidentals are typeset as cautionary suggestions over the note.") + (systemStartDelimiterHierarchy ,pair? "A nested list, indicating the nesting of a start delimiters.") (systemStartDelimiter ,symbol? "Which grob to make for the start of the system/staff? Set to @code{SystemStartBrace}, @code{SystemStartBracket} or @code{SystemStartBar}.") diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 9695d628b8..7569f3bc3a 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -412,6 +412,7 @@ separately, but put before musical columns.") (style ,symbol? "This setting determines in what style a grob is typeset. Valid choices depend on the @code{stencil} callback reading this property.") + (styles ,list? "A list of style symbols.") (text ,markup? "Text markup. See @usermanref{Text markup}.") ;;FIXME -- Should both be the same? (text-direction ,ly:dir? "This controls the ordering of the @@ -570,14 +571,17 @@ debugging") (shorten ,ly:dimension? "The amount of space that a stem. Internally used to distribute beam shortening over stems. ") (slur ,ly:grob? "A pointer to a slur object") + (staff-hierarchy ,pair? "A nested list of staff symbol grobs.") (use-breve-rest ,boolean? "Use breve rests for measures longer than a whole rest.") (spaceable-staves ,ly:grob-array? "Objects to be spaced during page layout.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ancient notation - +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; TODO: ;; there are too many properties for ancient notation ;; probably neume-types (a list of symbols) would also work. diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 1b5dbf31d9..f5d516cc11 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1582,37 +1582,63 @@ (interfaces . (system-interface axis-group-interface)))))) + (NestedSystemStartDelimiter + . ( + (stencil . ,Nested_system_start_delimiter::print) + (X-offset . ,Side_position_interface::x_aligned_side) + (direction . ,LEFT) + (collapse-height . 1.0) + (padding . 0.0) + (font-encoding . fetaBraces) + (Y-extent . #f) + (meta . ((class . Spanner) + (interfaces . (system-start-delimiter-interface + side-position-interface + font-interface)))))) + (SystemStartBrace . ( - (glyph . "brace") + (style . brace) + (padding . 0.2) (stencil . ,System_start_delimiter::print) (collapse-height . 5.0) + (X-offset . ,Side_position_interface::x_aligned_side) + (direction . ,LEFT) (font-encoding . fetaBraces) (Y-extent . #f) (meta . ((class . Spanner) (interfaces . (system-start-delimiter-interface + side-position-interface font-interface)))))) (SystemStartBracket . ( (Y-extent . #f) - (X-offset . -0.8) + (padding . 0.8) + (X-offset . ,Side_position_interface::x_aligned_side) + (direction . ,LEFT) (stencil . ,System_start_delimiter::print) - (glyph . "bracket") + (style . bracket) (collapse-height . 5.0) (thickness . 0.45) (meta . ((class . Spanner) (interfaces . (font-interface + side-position-interface system-start-delimiter-interface)))))) (SystemStartBar . ( (Y-extent . #f) - (glyph . "bar-line") + (padding . 0.0) + (X-offset . ,Side_position_interface::x_aligned_side) + (direction . ,LEFT) + (style . bar-line) (thickness . 1.6) (stencil . ,System_start_delimiter::print) (meta . ((class . Spanner) - (interfaces . (system-start-delimiter-interface)))))) + (interfaces . (side-position-interface + system-start-delimiter-interface)))))) + (TabNoteHead . ( -- 2.39.5