]> git.donarmstrong.com Git - lilypond.git/commitdiff
* scm/define-context-properties.scm
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 28 Mar 2005 17:12:14 +0000 (17:12 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 28 Mar 2005 17:12:14 +0000 (17:12 +0000)
(all-user-translation-properties): add stringNumberOrientations.

* lily/new-fingering-engraver.cc (position_scripts): make generic,
so fingering and string-numbers are separately controlled.

ChangeLog
Documentation/user/instrument-notation.itely
input/regression/string-number.ly
lily/new-fingering-engraver.cc
ly/engraver-init.ly
scm/define-context-properties.scm
scm/output-lib.scm

index d44605a2f3878cc2c909ab786e95b1b9ee597b52..c37a20d98275c5300ca258405fa21125f39d0491 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-03-28  Han-Wen Nienhuys  <hanwen@xs4all.nl>
+
+       * 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  <janneke@gnu.org>
 
        * stepmake/aclocal.m4: Fix shared size test: add missing comma, do
index 4449d74c75c750cb85086e1998bddc7a1a997bdb..f06824739fc42a4811a84ca849b3d800eb34fcab 100644 (file)
@@ -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
index 06386fc727d8b6c802c9098355093fd2d88cec7a..2ffd71afefc1f3dc1fbc1bf2e168018b2a68c129 100644 (file)
@@ -10,7 +10,10 @@ positioning mechanism as finger instructions."
 }
 
 \relative {
+%  <c\1 e\2 g\3>
+  c4
+  \set fingeringOrientations = #'(down left up)
+  \set stringNumberOrientations = #'(down right up)
   <c\1 e\2 g\3>
-  \set fingeringOrientations = #'(down right up)
-  <c\1 e\2 g\3>
+  <c-1\1 e-2\2 g-3\3>
 }
index 4909ebe88e6c787aa107a47e7eecb150c379f2fa..834407530a493ba7df76ab78137a5954e62e9cb6 100644 (file)
@@ -41,6 +41,8 @@ class New_fingering_engraver : public Engraver
 {
   Array<Finger_tuple> fingerings_;
   Array<Finger_tuple> articulations_;
+  Array<Finger_tuple> string_numbers_;
+  
   Link_array<Grob> 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<Finger_tuple> *);
 };
 
 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<Finger_tuple> *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<Finger_tuple> 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_;
index 86b062ddd53c3606f3ddd183d870e65c963b1eac..a398346a0c6d33a13ab0ae0f5584ab8961bc4d50 100644 (file)
@@ -474,6 +474,7 @@ AncientRemoveEmptyStaffContext = \context {
 
     harmonicAccidentals = ##t 
     fingeringOrientations = #'(up down)
+    stringNumberOrientations = #'(up down)
     tupletNumberFormatFunction = #denominator-tuplet-formatter
     markFormatter = #format-mark-letters
     rehearsalMark = #1 
index d8ac756c8ba7a6d36ef0f65487ef4a0fc1837420..61ceb1f14492a14c781e2b4f2710a826af960202 100644 (file)
@@ -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.")
 
index 759727bb06962b5c76f1680d5020e1844cba7aff..91f3ed3494a39c26d2ea8eba86068b071b8b9472 100644 (file)
        (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)))