]> git.donarmstrong.com Git - lilypond.git/commitdiff
* input/regression/accidental-piano.ly (Module): new file.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Fri, 17 Sep 2004 22:32:13 +0000 (22:32 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Fri, 17 Sep 2004 22:32:13 +0000 (22:32 +0000)
* lily/lily-guile.cc (LY_DEFINE): ly_assoc_get: new function.

ChangeLog
input/regression/accidental-piano.ly [new file with mode: 0644]
lily/accidental-engraver.cc
lily/include/lily-guile.hh
lily/lily-guile.cc
scm/lily.scm

index 341576c10a5879bf6e942d1982170f914ac3d83e..46d2249c348e7facf1ccc68a9b4787120d0d9282 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-09-18  Han-Wen Nienhuys   <hanwen@xs4all.nl>
+
+       * input/regression/accidental-piano.ly (Module): new file.
+
+       * lily/lily-guile.cc (LY_DEFINE): ly_assoc_get: new function.
+
 2004-09-17  Han-Wen Nienhuys   <hanwen@xs4all.nl>
 
        * lily/slur-scoring.cc (score_extra_encompass): widen X extent of
diff --git a/input/regression/accidental-piano.ly b/input/regression/accidental-piano.ly
new file mode 100644 (file)
index 0000000..864e484
--- /dev/null
@@ -0,0 +1,20 @@
+\header {
+
+    texidoc = "In piano accidental style, notes in both staves
+influence each other.  In this example, each note should have an
+accidental."
+
+}
+
+\version "2.3.17"
+
+\paper
+{
+    raggedright = ##t
+}
+    
+\new PianoStaff \relative <<
+    #(set-accidental-style 'piano)
+    \new Staff { ges'4 ges4 }
+    \new Staff { r8 gis r8 gis }
+    >>
index d4bfad593dc79217dcf501f601dbdebf5b6828f8..83355e868ba82098d298082084a01e7b7d4a0aaa 100644 (file)
@@ -140,59 +140,87 @@ Accidental_engraver::initialize ()
     * Then check the global signature (only step).
   
     Return number of accidentals (0, 1 or 2).  */
+
+static bool
+recent_enough (int bar_number, SCM alteration_def, SCM laziness)
+{
+  if (scm_is_number (alteration_def))
+    return true;
+
+  return (bar_number <= scm_to_int (ly_cdr (alteration_def)) + scm_to_int (laziness));
+}
+
+static int
+extract_alteration (SCM alteration_def)
+{
+  if (scm_is_number (alteration_def))
+    return scm_to_int (alteration_def);
+  else if (ly_c_pair_p (alteration_def))
+    return scm_to_int (ly_car (alteration_def));
+  else if (alteration_def == SCM_BOOL_F)
+    return 0;
+  else
+    assert (0);
+  return 0;
+}
+
 static int
 number_accidentals_from_sig (bool *different, SCM sig, Pitch *pitch,
-                            int curbarnum, SCM laziness, bool ignore_octave)
+                            int bar_number, SCM laziness, bool ignore_octave)
 {
   int n = pitch->get_notename ();
   int o = pitch->get_octave ();
-  int a = pitch->get_alteration ();
 
-  SCM prev_alt = SCM_BOOL_F;
+  SCM previous_alteration = SCM_BOOL_F;
 
-  if (!ignore_octave)
-    {
-      SCM prev_local
-       = scm_assoc (scm_cons (scm_int2num (o), scm_int2num (n)), sig);
-
-      if (ly_c_pair_p (prev_local))
-       {
-         if (ly_c_pair_p (ly_cdr (prev_local))
-             && scm_is_number (laziness))
-           {
-             int barnum = scm_to_int (ly_cddr (prev_local));
 
-             prev_local = scm_cons (ly_car (prev_local), ly_cadr (prev_local));
-             if (curbarnum <= barnum + scm_to_int (laziness))
-               prev_alt = prev_local;
-           }
-       }
+  SCM from_same_octave = ly_assoc_get (scm_cons (scm_int2num (o),
+                                                    scm_int2num (n)), sig, SCM_BOOL_F);
+  SCM from_key_signature = ly_assoc_get (scm_int2num (n), sig, SCM_BOOL_F);
+  SCM from_other_octaves = SCM_BOOL_F;
+  for (SCM s = sig ; ly_c_pair_p (s); s = ly_cdr (s))
+    {
+      SCM entry = ly_car (s);
+      if (ly_c_pair_p (ly_car (entry))
+         && ly_cdar (entry) == scm_int2num (n))
+       from_other_octaves = ly_cdr (entry); 
     }
+  
 
-  if (prev_alt == SCM_BOOL_F)
-    prev_alt = scm_assoc (scm_int2num (n), sig);
-
-  prev_alt =  (prev_alt == SCM_BOOL_F) ? scm_int2num (0) : ly_cdr (prev_alt); 
-    
+  if (from_same_octave != SCM_BOOL_F
+      && recent_enough (bar_number, from_same_octave, laziness))
+    {
+      previous_alteration = from_same_octave;
+    }
+  else if (ignore_octave
+          && from_other_octaves != SCM_BOOL_F
+          && recent_enough (bar_number, from_other_octaves, laziness))
+    {
+      previous_alteration = from_other_octaves;
+    }
+  else if (from_key_signature != SCM_BOOL_F)
+    {
+      previous_alteration = from_key_signature;
+    }
+  
   /* UGH. prev_acc can be #t in case of ties. What is this for?  */
-  int p = scm_is_number (prev_alt) ? scm_to_int (prev_alt) : 0;
 
-  int num;
-  if (a == p && scm_is_number (prev_alt))
+  int prev = extract_alteration (previous_alteration);
+  int alter = pitch->get_alteration ();
+  int num = 1;
+  if (alter == prev)
     num = 0;
-  else if ( (abs (a)<abs (p) || p*a<0) && a != 0 )
+  else if ((abs (alter) < abs (prev) || prev*alter < 0) && alter != 0)
     num = 2;
-  else
-    num = 1;
 
-  *different = (a != p);
+  *different = (alter != prev);
   return num;
 }
 
 static int
 number_accidentals (bool *different,
                    Pitch *pitch, Context *origin,
-                   SCM accidentals, int curbarnum)
+                   SCM accidentals, int bar_number)
 {
   int number = 0;
 
@@ -221,7 +249,7 @@ number_accidentals (bool *different,
            {
              bool d = false;
              int n = number_accidentals_from_sig
-               (&d, localsig, pitch, curbarnum, laziness, any_octave_b);
+               (&d, localsig, pitch, bar_number, laziness, any_octave_b);
              *different = *different || d;
              number = max (number, n);     
            }
index a0475b3e44d3b6b1862af9bbf353110acac795c1..0cdf6f12e08c1895477ca27d639eb192b4b9a6b1 100644 (file)
@@ -124,6 +124,7 @@ SCM ly_offset2scm (Offset);
 Offset ly_scm2offset (SCM);
 SCM ly_assoc_chain (SCM key, SCM achain);
 SCM ly_assoc_cdr (SCM key, SCM alist);
+SCM ly_assoc_get (SCM key, SCM alist, SCM def);
 Interval ly_scm2interval (SCM);
 Drul_array<Real> ly_scm2realdrul (SCM);
 Slice int_list_to_slice (SCM l);
index 2bc7c4e2e13ecaa3d8092a8576d01ee1e19c004e..019a87bc5ccbe24ebcc66c3fccb789c83d4ea60f 100644 (file)
@@ -265,6 +265,22 @@ is_direction (SCM s)
   return false;
 }
 
+LY_DEFINE(ly_assoc_get, "ly:assoc-get",
+         2, 1, 0,
+         (SCM key, SCM alist, SCM default_value),
+         "Return value if KEY in ALIST, else DEFAULT-VALUE (or #f if not specified).")
+{
+  SCM handle = scm_assoc (key, alist);
+
+  if (default_value == SCM_UNDEFINED)
+    default_value = SCM_BOOL_F;
+  
+  if (ly_c_pair_p (handle))
+    return ly_cdr (handle);
+  else
+    return default_value;
+}
+
 bool
 is_axis (SCM s)
 {
@@ -822,3 +838,4 @@ LY_DEFINE (ly_gettext, "ly:gettext",
                   __FUNCTION__, "string");
   return scm_makfrom0str (gettext (scm_i_string_chars (string)));
 }
+
index 9e47a9208f882e2c94da2a7e3ce93c10afd000dd..84da44a6a723682da02c727d15d3601ea73aa1cc 100644 (file)
   
 ;;;;;;;;;;;;;;;;
 ; alist
-(define-public (assoc-get key alist . default)
-  "Return value if KEY in ALIST, else DEFAULT (or #f if not specified)."
-  (let ((entry (assoc key alist)))
-    (if (pair? entry)
-       (cdr entry)
-       (if (pair? default) (car default) #f))))
+(define-public assoc-get ly:assoc-get)
 
 (define-public (uniqued-alist alist acc)
   (if (null? alist) acc