From 0919deb6ef6728016a18af338737a3f6225790f2 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 28 Mar 2005 17:12:14 +0000 Subject: [PATCH] * scm/define-context-properties.scm (all-user-translation-properties): add stringNumberOrientations. * lily/new-fingering-engraver.cc (position_scripts): make generic, so fingering and string-numbers are separately controlled. --- ChangeLog | 8 +++ Documentation/user/instrument-notation.itely | 7 -- input/regression/string-number.ly | 7 +- lily/new-fingering-engraver.cc | 70 +++++++++++--------- ly/engraver-init.ly | 1 + scm/define-context-properties.scm | 1 + scm/output-lib.scm | 2 +- 7 files changed, 56 insertions(+), 40 deletions(-) diff --git a/ChangeLog b/ChangeLog index d44605a2f3..c37a20d982 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-03-28 Han-Wen Nienhuys + + * scm/define-context-properties.scm + (all-user-translation-properties): add stringNumberOrientations. + + * lily/new-fingering-engraver.cc (position_scripts): make generic, + so fingering and string-numbers are separately controlled. + 2005-03-28 Jan Nieuwenhuizen * stepmake/aclocal.m4: Fix shared size test: add missing comma, do diff --git a/Documentation/user/instrument-notation.itely b/Documentation/user/instrument-notation.itely index 4449d74c75..f06824739f 100644 --- a/Documentation/user/instrument-notation.itely +++ b/Documentation/user/instrument-notation.itely @@ -1690,13 +1690,6 @@ See also @inputfileref{input/regression,string-number.ly}. Program reference: @internalsref{StringNumber}, @internalsref{StringNumberEvent} -@refbugs - -Fingering shares the positioning code with the fingering -(@ref{Fingering instructions}) and articulation on chords. This means -that it is not possible to have string numbers on the right and -fingering instructions on the left of the same chord. - @node Tablatures basic @subsection Tablatures basic diff --git a/input/regression/string-number.ly b/input/regression/string-number.ly index 06386fc727..2ffd71afef 100644 --- a/input/regression/string-number.ly +++ b/input/regression/string-number.ly @@ -10,7 +10,10 @@ positioning mechanism as finger instructions." } \relative { +% + c4 + \set fingeringOrientations = #'(down left up) + \set stringNumberOrientations = #'(down right up) - \set fingeringOrientations = #'(down right up) - + } diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index 4909ebe88e..834407530a 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -41,6 +41,8 @@ class New_fingering_engraver : public Engraver { Array fingerings_; Array articulations_; + Array string_numbers_; + Link_array heads_; Grob *stem_; @@ -52,7 +54,7 @@ protected: void add_fingering (Grob *, Music *, Music *); void add_script (Grob *, Music *, Music *); void add_string (Grob *, Music *, Music *); - void position_scripts (); + void position_scripts (SCM orientations, Array *); }; void @@ -186,12 +188,16 @@ New_fingering_engraver::add_string (Grob *head, ft.note_event_ = hevent; ft.head_ = head; - fingerings_.push (ft); + string_numbers_.push (ft); } void -New_fingering_engraver::position_scripts () +New_fingering_engraver::position_scripts (SCM orientations, + Array *scripts) { + for (int i = 0; i < scripts->size (); i++) + if (stem_ && to_boolean (scripts->elem (i).script_->get_property ("add-stem-support"))) + Side_position_interface::add_support (scripts->elem (i).script_, stem_); /* This is not extremely elegant, but we have to do a little @@ -202,28 +208,27 @@ New_fingering_engraver::position_scripts () to the note head, and write a more flexible function for positioning the fingerings, setting both X and Y coordinates. */ - for (int i = 0; i < fingerings_.size (); i++) + for (int i = 0; i < scripts->size (); i++) { - fingerings_[i].position_ = scm_to_int (fingerings_[i].head_->get_property ("staff-position")); + (*scripts)[i].position_ = scm_to_int ((*scripts)[i].head_->get_property ("staff-position")); } - for (int i = fingerings_.size (); i--;) + for (int i = scripts->size (); i--;) for (int j = heads_.size (); j--;) - Side_position_interface::add_support (fingerings_[i].script_, heads_[j]); + Side_position_interface::add_support ((*scripts)[i].script_, heads_[j]); Array up, down, horiz; - for (int i = fingerings_.size (); i--;) + for (int i = scripts->size (); i--;) { - SCM d = fingerings_[i].finger_event_->get_property ("direction"); + SCM d = (*scripts)[i].finger_event_->get_property ("direction"); if (to_dir (d)) { - ((to_dir (d) == UP) ? up : down).push (fingerings_[i]); - fingerings_.del (i); + ((to_dir (d) == UP) ? up : down).push ((*scripts)[i]); + scripts->del (i); } } - fingerings_.sort (&Finger_tuple::compare); - SCM orientations = get_property ("fingeringOrientations"); + scripts->sort (&Finger_tuple::compare); bool up_p = scm_c_memq (ly_symbol2scm ("up"), orientations) != SCM_BOOL_F; bool down_p = scm_c_memq (ly_symbol2scm ("down"), orientations) != SCM_BOOL_F; @@ -232,34 +237,34 @@ New_fingering_engraver::position_scripts () Direction hordir = (right_p) ? RIGHT : LEFT; if (left_p || right_p) { - if (up_p && !up.size () && fingerings_.size ()) - up.push (fingerings_.pop ()); + if (up_p && !up.size () && scripts->size ()) + up.push (scripts->pop ()); - if (down_p && !down.size () && fingerings_.size ()) + if (down_p && !down.size () && scripts->size ()) { - down.push (fingerings_[0]); - fingerings_.del (0); + down.push ((*scripts)[0]); + scripts->del (0); } - horiz.concat (fingerings_); + horiz.concat (*scripts); } else if (up_p && down_p) { - int center = fingerings_.size () / 2; - down.concat (fingerings_.slice (0, center)); - up.concat (fingerings_.slice (center, fingerings_.size ())); + int center = scripts->size () / 2; + down.concat (scripts->slice (0, center)); + up.concat (scripts->slice (center, scripts->size ())); } else if (up_p) { - up.concat (fingerings_); - fingerings_.clear (); + up.concat (*scripts); + scripts->clear (); } else { if (!down_p) warning (_ ("Fingerings are also not down?! Putting them down anyway.")); - down.concat (fingerings_); - fingerings_.clear (); + down.concat (*scripts); + scripts->clear (); } for (int i = 0; i < horiz.size (); i++) @@ -310,13 +315,18 @@ New_fingering_engraver::stop_translation_timestep () { if (fingerings_.size ()) { - for (int i = 0; i < fingerings_.size (); i++) - if (stem_ && to_boolean (fingerings_[i].script_->get_property ("add-stem-support"))) - Side_position_interface::add_support (fingerings_[i].script_, stem_); - position_scripts (); + position_scripts (get_property ("fingeringOrientations"), + &fingerings_); fingerings_.clear (); } + if (string_numbers_.size ()) + { + position_scripts (get_property ("stringNumberOrientations"), + &string_numbers_); + string_numbers_.clear (); + } + for (int i = articulations_.size (); i--;) { Grob *script = articulations_[i].script_; diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 86b062ddd5..a398346a0c 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -474,6 +474,7 @@ AncientRemoveEmptyStaffContext = \context { harmonicAccidentals = ##t fingeringOrientations = #'(up down) + stringNumberOrientations = #'(up down) tupletNumberFormatFunction = #denominator-tuplet-formatter markFormatter = #format-mark-letters rehearsalMark = #1 diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index d8ac756c8b..61ceb1f144 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -324,6 +324,7 @@ up the interpretation phase. This speeds up debugging large scores.") (squashedPosition ,integer? " Vertical position of squashing for @internalsref{Pitch_squash_engraver}.") + (stringNumberOrientations ,list? "See @code{fingeringOrientations}") (stringOneTopmost ,boolean? "Whether the 1st string is printed on the top line of the tablature.") diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 759727bb06..91f3ed3494 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -122,7 +122,7 @@ (props (ly:grob-alist-chain grob defs)) (circle (Text_interface::interpret_markup layout props (make-circle-markup - 1.0 0.1))) + 0.8 0.1))) (text-stencil (Text_interface::interpret_markup layout props text))) -- 2.39.5