Hi Victor,

2008/7/2 V!ctor Adán <[EMAIL PROTECTED]>:
> Hello All,
>
> I'm using Staff contexts with the "line-positions" property modified to fit
> my capricious needs.
> In doing so I'm running into 2 problems (please see attached png):
>
> 1. When I set lines to odd numbers, the duration dots of the note heads fall
> *on* the staff lines rather than within the spaces. It's like Lilypond is
> hard-coded to put the dots on the even number slots rather that looking at
> the "line-positions" attribute to decide on the best place to put these
> dots. Is there a way to change this?
>
> 2. It seems that the line-positions must be centered at 0, otherwise (as in
> the example below), the bar line is drawn off-center, either moved up or
> down. Is there a way to have the barline fit the boundaries of the two
> outermost staff lines exactly without having the line-positions 0-centered?
> I found this mail by Kevin Dalley in the mailing list, so it seems this has
> been an issue before...
> http://www.nabble.com/Does-the-center-of-the-staff-need-to-be-zero--p9507190.html

It's a good thing you've brought this up, since that post from Kevin
and another he posted a few days later include patches which fix both
of the issues you're experiencing; there were some problems with the
patches which prevented them being applied for testing, so they seem
to have fallen by the wayside.

I certainly think they would be a useful improvement on the current
behaviour, so I've tidied the patches up to make them work with the
current version; attached is the output of your snippet with the
patches applied.

Regards,
Neil

<<attachment: test.png>>

From 7cd7b83dc9591426384ec6e4e253dadfae05ad61 Mon Sep 17 00:00:00 2001
From: Kevin Dalley <[EMAIL PROTECTED]>
Date: Fri, 4 Jul 2008 22:11:49 +0100
Subject: [PATCH] Draw bar lines correctly when staff is not centered at zero.

---
 input/regression/non-centered-bar-lines.ly |   12 ++++++++++++
 lily/bar-line.cc                           |   21 +++++++++++++++++++--
 2 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 input/regression/non-centered-bar-lines.ly

diff --git a/input/regression/non-centered-bar-lines.ly b/input/regression/non-centered-bar-lines.ly
new file mode 100644
index 0000000..099d9af
--- /dev/null
+++ b/input/regression/non-centered-bar-lines.ly
@@ -0,0 +1,12 @@
+\version "2.11.51"
+\header {
+  texidoc = "Bar lines are positioned correctly when using custom
+staves which are not centered around [EMAIL PROTECTED]
+"
+}
+\new Staff {
+  \override Staff.StaffSymbol #'line-positions = #'(1 3 5 7 9)
+  c''1
+  c''1 \bar ":"
+  c''1 \bar "|."
+}
diff --git a/lily/bar-line.cc b/lily/bar-line.cc
index e51aad7..4d2cbf9 100644
--- a/lily/bar-line.cc
+++ b/lily/bar-line.cc
@@ -94,13 +94,28 @@ Bar_line::compound_barline (Grob *me, string str, Real h,
   colon.translate_axis (-dist / 2, Y_AXIS);
 
   Stencil m;
+  Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
+  Real center = 0;
+  if (staff)
+    {
+      Interval staff_extent = staff->extent (staff, Y_AXIS);
+      center = staff_extent.center ();
+    }
+
   if (str == "||:")
     str = "|:";
 
   if (str == "")
-    return Lookup::blank (Box (Interval (0, 0), Interval (-h / 2, h / 2)));
+    {
+      Stencil empty =  Lookup::blank (Box (Interval (0, 0), Interval (-h / 2, h / 2)));
+      empty.translate_axis (center, Y_AXIS);
+      return empty;
+    }
   else if (str == "|")
-    return thin;
+    {
+      thin.translate_axis (center, Y_AXIS);
+      return thin;
+    }
   else if (str == "|." || (h == 0 && str == ":|"))
     {
       m.add_at_edge (X_AXIS, LEFT, thick, 0);
@@ -165,6 +180,8 @@ Bar_line::compound_barline (Grob *me, string str, Real h,
     {
       m = dot;
     }
+
+  m.translate_axis (center, Y_AXIS);
   return m;
 }
 
-- 
1.5.4.3

From 56d793a12307e44d79c63a14f72152ba7c664763 Mon Sep 17 00:00:00 2001
From: Kevin Dalley <[EMAIL PROTECTED]>
Date: Fri, 4 Jul 2008 22:01:31 +0100
Subject: [PATCH] Corrected on_line for better ledger lines for different staves.

---
 input/regression/ledger-lines-varying-staves.ly |   50 +++++++++++++++++++++++
 lily/include/staff-symbol.hh                    |    1 +
 lily/staff-symbol-referencer.cc                 |    3 +-
 lily/staff-symbol.cc                            |   29 +++++++++++++-
 4 files changed, 80 insertions(+), 3 deletions(-)
 create mode 100644 input/regression/ledger-lines-varying-staves.ly

diff --git a/input/regression/ledger-lines-varying-staves.ly b/input/regression/ledger-lines-varying-staves.ly
new file mode 100644
index 0000000..7d9f0e0
--- /dev/null
+++ b/input/regression/ledger-lines-varying-staves.ly
@@ -0,0 +1,50 @@
+\version "2.11.51"
+\header {
+  texidoc = "Ledger lines should appear at every other location
+for a variety of staves using both @code{line-count} and
[EMAIL PROTECTED]"
+}
+
+notes = \relative c' {
+  c1 | d | e | f
+  g1 | a | b | c
+  d1 | e | f | g
+  a1
+}
+
+\new Staff {
+  % upper and lower lines both odd
+  #(define mylines '(-1 0 1))
+  \override Staff.StaffSymbol #'line-count = #(length mylines)
+  \override Staff.StaffSymbol #'line-positions = #mylines
+  \notes
+}
+
+\new Staff {
+  % upper and lower lines both even
+  #(define mylines '(-2 0 2))
+  \override Staff.StaffSymbol #'line-positions = #mylines
+
+  \override Staff.StaffSymbol #'line-count = #(length mylines)
+  \notes
+}
+
+\new Staff {
+  % lower line odd, upper line even
+  #(define mylines '(-1 0 2))
+  \override Staff.StaffSymbol #'line-positions = #mylines
+  \override Staff.StaffSymbol #'line-count = #(length mylines)
+  \notes
+}
+
+\new Staff {
+  % odd line count
+  \override Staff.StaffSymbol #'line-count = #5
+  \notes
+}
+
+\new Staff {
+  % even line count
+  \override Staff.StaffSymbol #'line-count = #4
+  \notes
+}
diff --git a/lily/include/staff-symbol.hh b/lily/include/staff-symbol.hh
index 4dacde8..6791e7b 100644
--- a/lily/include/staff-symbol.hh
+++ b/lily/include/staff-symbol.hh
@@ -24,6 +24,7 @@ public:
   
   static int get_steps (Grob *);
   static int line_count (Grob *);
+  static bool on_line (Grob *me, int pos);
   DECLARE_SCHEME_CALLBACK (print, (SCM));
   DECLARE_SCHEME_CALLBACK (height, (SCM));  
   DECLARE_GROB_INTERFACE();
diff --git a/lily/staff-symbol-referencer.cc b/lily/staff-symbol-referencer.cc
index e8ef99f..d623bd3 100644
--- a/lily/staff-symbol-referencer.cc
+++ b/lily/staff-symbol-referencer.cc
@@ -35,8 +35,7 @@ Staff_symbol_referencer::on_staff_line (Grob *me)
 bool
 Staff_symbol_referencer::on_line (Grob *me, int pos)
 {
-  int sz = line_count (me) - 1;
-  return ((pos + sz) % 2) == 0;
+  return Staff_symbol::on_line (me, pos);
 }
 
 bool
diff --git a/lily/staff-symbol.cc b/lily/staff-symbol.cc
index d4aa9e1..df441d4 100644
--- a/lily/staff-symbol.cc
+++ b/lily/staff-symbol.cc
@@ -167,8 +167,35 @@ Staff_symbol::height  (SCM smob)
   return ly_interval2scm (y_ext);
 }
 
+bool
+Staff_symbol::on_line (Grob *me, int pos)
+{
+  SCM line_positions = me->get_property ("line-positions");
+  if (scm_is_pair (line_positions))
+    {
+      Real min_line = SCM_FLTMAX;
+      Real max_line = -SCM_FLTMAX;
+      for (SCM s = line_positions; scm_is_pair (s); s = scm_cdr (s))
+	{
+	  Real current_line = scm_to_double (scm_car (s));
+	  if (pos == current_line)
+	    return true;
+	  if (current_line > max_line)
+	    max_line = current_line;
+	  if (current_line < min_line)
+	    min_line = current_line;
+	
+	}
+      if (pos < min_line)
+	return (( (int) (rint (pos - min_line)) % 2) == 0);
+      if (pos > max_line)
+	return (( (int) (rint (pos - max_line)) % 2) == 0);
 
-
+      return false;
+    }
+  else
+    return ((abs (pos + line_count (me)) % 2) == 1);
+}
 
 ADD_INTERFACE (Staff_symbol,
 	       "This spanner draws the lines of a staff.  A staff symbol"
-- 
1.5.4.3

_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to