From: Han-Wen Nienhuys Date: Sat, 14 Oct 2006 23:39:12 +0000 (+0000) Subject: * Documentation/topdocs/NEWS.tely (Top): add note for X-Git-Tag: release/2.10.0-2~171 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=bf7b9929425e6a60cc24f1de18e5f1cdc9055703;p=lilypond.git * Documentation/topdocs/NEWS.tely (Top): add note for string-finger feature. * scm/define-grobs.scm (all-grob-descriptions): add 'string-names property. * scm/output-lib.scm (string-finger::calc-text): read 'digit instead of 'text * input/regression/script-stack-horizontal.ly: new file. * ly/engraver-init.ly: add Script_row_engraver. * lily/script-column.cc (order_grobs): refactor: separate axis independent code. (row_before_line_breaking): new function. * lily/script-row-engraver.cc (Script_row_engraver): new file. * scm/define-grobs.scm (all-grob-descriptions): add ScriptRow --- diff --git a/ChangeLog b/ChangeLog index 86c06fc2c6..6e3e17f7cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2006-10-15 Han-Wen Nienhuys + + * Documentation/topdocs/NEWS.tely (Top): add note for + string-finger feature. + + * scm/define-grobs.scm (all-grob-descriptions): add 'string-names + property. + + * scm/output-lib.scm (string-finger::calc-text): read 'digit + instead of 'text + + * input/regression/script-stack-horizontal.ly: new file. + + * ly/engraver-init.ly: add Script_row_engraver. + + * lily/script-column.cc (order_grobs): refactor: separate axis + independent code. + (row_before_line_breaking): new function. + + * lily/script-row-engraver.cc (Script_row_engraver): new file. + + * scm/define-grobs.scm (all-grob-descriptions): add ScriptRow + 2006-10-14 Jürgen Reuter * Documentation/user/instrument-notation.itely: Cleanup: Remove diff --git a/Documentation/topdocs/NEWS.tely b/Documentation/topdocs/NEWS.tely index 276d736336..6e5297e745 100644 --- a/Documentation/topdocs/NEWS.tely +++ b/Documentation/topdocs/NEWS.tely @@ -66,6 +66,31 @@ which scares away people. @end ignore +@item Fingerings for plucking finger (the right hand fingerings) may +now also be added, + +@lilypond[fragment,relative=1,ragged-right] +\relative +{ + \set stringFingerOrientations = #'(right) % up left down + \set fingeringOrientations = #'(down left up) % up left down + \set stringNumberOrientations = #'(down up left) % (up right down) + +} +@end lilypond + +This feature was sponsored by William Wilson. + +@ignore + grob StringFinger, event StringFingerEvent +@end ignore + @item By defining a clip region, a cutout EPS file of a number of measures may be generated from the complete score. Hence, it is no longer necessary to create separate files to create extracts of (long) diff --git a/THANKS b/THANKS index 1539636c6a..46963c51a9 100644 --- a/THANKS +++ b/THANKS @@ -36,6 +36,7 @@ Steve Doonan Trent Johnston Trevor Bača Vivian Barty-Taylor +William Wilson DOCUMENTATION HELPERS diff --git a/input/regression/script-stack-horizontal.ly b/input/regression/script-stack-horizontal.ly new file mode 100644 index 0000000000..4455a9a807 --- /dev/null +++ b/input/regression/script-stack-horizontal.ly @@ -0,0 +1,24 @@ +\header +{ + texidoc = "horizontal scripts are ordered, so they do not overlap. +The order may be set with script-priority." + +} + +\paper { + ragged-right = ##t +} + +\relative +{ + \set stringFingerOrientations = #'(left) + \set fingeringOrientations = #'(left) + \set stringNumberOrientations = #'(left) + \arpeggio +} diff --git a/lily/include/script-column.hh b/lily/include/script-column.hh index 15f089874a..d4b1210726 100644 --- a/lily/include/script-column.hh +++ b/lily/include/script-column.hh @@ -12,12 +12,17 @@ #include "lily-guile.hh" #include "lily-proto.hh" +#include "std-vector.hh" + class Script_column { public: - static void add_staff_sided (Grob *, Item *); + static void add_side_positioned (Grob *, Grob *); DECLARE_SCHEME_CALLBACK (before_line_breaking, (SCM)); + DECLARE_SCHEME_CALLBACK (row_before_line_breaking, (SCM)); static bool has_interface (Grob *); + static void order_grobs (vector grobs); + }; #endif /* Script_COLUMN_HH */ diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index ed69676ec6..6ddd4f6595 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -19,6 +19,8 @@ #include "translator.icc" + + struct Finger_tuple { Grob *head_; diff --git a/lily/script-column-engraver.cc b/lily/script-column-engraver.cc index cdaf056322..7ebfc74dbd 100644 --- a/lily/script-column-engraver.cc +++ b/lily/script-column-engraver.cc @@ -17,7 +17,7 @@ Script_column, that will fix the collisions. */ class Script_column_engraver : public Engraver { - Grob *scol_; + Grob *script_column_; vector scripts_; public: @@ -30,20 +30,20 @@ protected: Script_column_engraver::Script_column_engraver () { - scol_ = 0; + script_column_ = 0; } void Script_column_engraver::stop_translation_timestep () { - if (scol_) + if (script_column_) { for (vsize i = 0; i < scripts_.size (); i++) if (Side_position_interface::get_axis (scripts_[i]) == Y_AXIS) - Script_column::add_staff_sided (scol_, scripts_[i]); + Script_column::add_side_positioned (script_column_, scripts_[i]); } - scol_ = 0; + script_column_ = 0; scripts_.clear (); } @@ -61,8 +61,8 @@ Script_column_engraver::acknowledge_side_position (Grob_info inf) void Script_column_engraver::process_acknowledged () { - if (!scol_ && scripts_.size () > 1) - scol_ = make_item ("ScriptColumn", SCM_EOL); + if (!script_column_ && scripts_.size () > 1) + script_column_ = make_item ("ScriptColumn", SCM_EOL); } ADD_ACKNOWLEDGER (Script_column_engraver, side_position); diff --git a/lily/script-column.cc b/lily/script-column.cc index 0676e20f02..0710cd483a 100644 --- a/lily/script-column.cc +++ b/lily/script-column.cc @@ -13,14 +13,18 @@ #include "warn.hh" #include "pointer-group-interface.hh" +#include + +typedef map > Grob_scripts_map; + void -Script_column::add_staff_sided (Grob *me, Item *item) +Script_column::add_side_positioned (Grob *me, Grob *script) { - SCM p = item->get_property ("script-priority"); + SCM p = script->get_property ("script-priority"); if (!scm_is_number (p)) return; - Pointer_group_interface::add_grob (me, ly_symbol2scm ("scripts"), item); + Pointer_group_interface::add_grob (me, ly_symbol2scm ("scripts"), script); } LY_DEFINE (ly_grob_script_priority_less, "ly:grob-script-priority-less", @@ -36,12 +40,45 @@ LY_DEFINE (ly_grob_script_priority_less, "ly:grob-script-priority-less", return scm_to_int (p1) < scm_to_int (p2) ? SCM_BOOL_T : SCM_BOOL_F; } +MAKE_SCHEME_CALLBACK (Script_column, row_before_line_breaking, 1); +SCM +Script_column::row_before_line_breaking (SCM smob) +{ + Grob *me = unsmob_grob (smob); + vector horizontal_grobs; + extract_grob_set (me, "scripts", scripts); + + Grob_scripts_map head_scripts_map; + for (vsize i = 0; i < scripts.size (); i++) + { + Grob *sc = scripts[i]; + + /* + Don't want to consider scripts horizontally next to notes. + */ + if (sc->get_property_data (ly_symbol2scm ("Y-offset")) != + Side_position_interface::x_aligned_side_proc) + { + head_scripts_map[sc->get_parent (Y_AXIS)].push_back (sc); + } + } + + for (Grob_scripts_map::const_iterator i (head_scripts_map.begin ()); + i != head_scripts_map.end (); + i++) + { + order_grobs ((*i).second); + } + + return SCM_UNSPECIFIED; +} + + MAKE_SCHEME_CALLBACK (Script_column, before_line_breaking, 1); SCM Script_column::before_line_breaking (SCM smob) { Grob *me = unsmob_grob (smob); - Drul_array scripts_drul (SCM_EOL, SCM_EOL); vector staff_sided; extract_grob_set (me, "scripts", scripts); @@ -57,9 +94,18 @@ Script_column::before_line_breaking (SCM smob) staff_sided.push_back (sc); } - for (vsize i = 0; i < staff_sided.size (); i++) + order_grobs (staff_sided); + return SCM_UNSPECIFIED; + +} + +void +Script_column::order_grobs (vector grobs) +{ + Drul_array scripts_drul (SCM_EOL, SCM_EOL); + for (vsize i = 0; i < grobs.size (); i++) { - Grob *g = staff_sided[i]; + Grob *g = grobs[i]; Direction d = get_grob_direction (g); scripts_drul[d] = scm_cons (g->self_scm (), scripts_drul[d]); @@ -82,11 +128,10 @@ Script_column::before_line_breaking (SCM smob) } } while (flip (&d) != DOWN); - - return SCM_UNSPECIFIED; } ADD_INTERFACE (Script_column, "script-column-interface", "An interface that sorts scripts " "according to their @code{script-priority}", + ""); diff --git a/lily/script-row-engraver.cc b/lily/script-row-engraver.cc new file mode 100644 index 0000000000..4a76c78c52 --- /dev/null +++ b/lily/script-row-engraver.cc @@ -0,0 +1,79 @@ +/* + script-row-engraver.cc -- implement Script_row_engraver + + source file of the GNU LilyPond music typesetter + + (c) 2006 Han-Wen Nienhuys + +*/ + + +#include "engraver.hh" +#include "script-column.hh" +#include "side-position-interface.hh" + +#include "translator.icc" + + +/** + Find potentially colliding scripts, and put them in a + Script_row +*/ +class Script_row_engraver : public Engraver +{ + Grob *script_row_; + vector scripts_; + +public: + TRANSLATOR_DECLARATIONS (Script_row_engraver); +protected: + DECLARE_ACKNOWLEDGER (side_position); + void process_acknowledged (); + void stop_translation_timestep (); +}; + +Script_row_engraver::Script_row_engraver () +{ + script_row_ = 0; +} + +void +Script_row_engraver::stop_translation_timestep () +{ + if (script_row_) + { + for (vsize i = 0; i < scripts_.size (); i++) + if (Side_position_interface::get_axis (scripts_[i]) == X_AXIS) + Script_column::add_side_positioned (script_row_, scripts_[i]); + } + + scripts_.clear (); + script_row_ = 0; +} + +void +Script_row_engraver::acknowledge_side_position (Grob_info inf) +{ + Item *thing = dynamic_cast (inf.grob ()); + if (thing) + { + if (!Item::is_non_musical (thing)) + scripts_.push_back (thing); + } +} + +void +Script_row_engraver::process_acknowledged () +{ + if (!script_row_ && scripts_.size () > 1) + script_row_ = make_item ("ScriptRow", SCM_EOL); +} + + +ADD_ACKNOWLEDGER (Script_row_engraver, side_position); +ADD_TRANSLATOR (Script_row_engraver, + /* doc */ "Determine order in horizontal side position elements. ", + /* create */ "ScriptRow ", + /* accept */ "", + /* read */ "", + /* write */ ""); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 4e04bfe847..e46bf7f89c 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -219,6 +219,7 @@ contained staves are not connected vertically." \consists "Script_engraver" \consists "Script_column_engraver" + \consists "Script_row_engraver" \consists "Rhythmic_column_engraver" \consists "Phrasing_slur_engraver" \consists "Cluster_spanner_engraver" @@ -531,7 +532,7 @@ AncientRemoveEmptyStaffContext = \context { harmonicAccidentals = ##t fingeringOrientations = #'(up down) stringNumberOrientations = #'(up down) - stringFingerOrientations = #'(up down) + stringFingerOrientations = #'(right) markFormatter = #format-mark-letters rehearsalMark = #1 diff --git a/ly/music-functions-init.ly b/ly/music-functions-init.ly index 5f425fc717..320a0ffeff 100644 --- a/ly/music-functions-init.ly +++ b/ly/music-functions-init.ly @@ -539,11 +539,11 @@ includePageLayoutFile = rightHandFinger = -#(define-music-function (parser location finger) (string?) +#(define-music-function (parser location finger) (number?) "Define a StringFingerEvent" (make-music 'StringFingerEvent 'origin location - 'text finger)) + 'digit finger)) scoreTweak = #(define-music-function (parser location name) (string?) diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 44f55aa52b..4a101d6c51 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -142,6 +142,7 @@ dash-period. Should be between 0.0 (no line) and 1.0 (continuous line).") (default-direction ,ly:dir? "Direction determined by note head positions.") + (digit-names ,vector "Names for string finger digits. ") (direction ,ly:dir? "If side-position is 1 (#X), then this property determines if the object is placed #LEFT, #CENTER or #RIGHT with respect to the other object. Otherwise, it determines if the object is placed #UP #CENTER or #DOWN. Numerical values may also be used. #UP=1, #DOWN=-1, #LEFT=-1, #RIGHT=1, CENTER=0 but also other numerical values are permitted.") (dot-color ,symbol? "Color of dots. Options include diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 84078d3888..c7c1758a98 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1325,6 +1325,11 @@ (before-line-breaking . ,ly:script-column::before-line-breaking) (meta . ((class . Item) (interfaces . (script-column-interface)))))) + (ScriptRow + . ( + (before-line-breaking . ,ly:script-column::row-before-line-breaking) + (meta . ((class . Item) + (interfaces . (script-column-interface)))))) (SeparationItem . ( @@ -1547,13 +1552,14 @@ . ( (stencil . ,ly:text-interface::print) (text . ,string-finger::calc-text) + (digit-names . #("P" "I" "m" "a" "x")) (padding . 0.5) (staff-padding . 0.5) (self-alignment-X . 0) (self-alignment-Y . 0) (script-priority . 100) (font-shape . italic) - (font-size . -5) ; don't overlap when next to heads. + (font-size . -4) ; don't overlap when next to heads. (meta . ((class . Item) (interfaces . (string-number-interface font-interface diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 413d99b540..f6ff77c558 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -420,9 +420,11 @@ centered, X==1 is at the right, X == -1 is at the left." (define-public (string-finger::calc-text grob) (let* - ((text (ly:event-property (event-cause grob) 'text))) - - text)) + ((digit (ly:event-property (event-cause grob) 'digit)) + (texts (ly:grob-property grob 'digit-names)) + ) + (vector-ref texts (1- (max (min 5 digit) 1))) + )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; dynamics