]> git.donarmstrong.com Git - lilypond.git/commitdiff
Makes bar numbering formatter a scheme function.
authorMike Solomon <mike@apollinemike.com>
Mon, 12 Dec 2011 20:33:17 +0000 (21:33 +0100)
committerMike Solomon <mike@apollinemike.com>
Mon, 12 Dec 2011 20:41:00 +0000 (21:41 +0100)
lily/bar-number-engraver.cc
ly/engraver-init.ly
scm/define-context-properties.scm
scm/translation-functions.scm

index e6c401f2406d044a89899d7779fddb58b54aeb76..f0411cfb7bd700343e59e0885b62ec5976df77f5 100644 (file)
@@ -84,16 +84,6 @@ Bar_number_engraver::listen_alternative (Stream_event *ev)
     }
 }
 
-int
-int_pow (int n, int i)
-{
-  if (i == 1)
-    return n;
-  if (i <= 0)
-    return 1;
-  return int_pow (n * n, i - 1);
-}
-
 void
 Bar_number_engraver::process_music ()
 {
@@ -102,60 +92,44 @@ Bar_number_engraver::process_music ()
   if (scm_is_string (wb))
     {
       Moment mp (robust_scm2moment (get_property ("measurePosition"), Moment (0)));
-      if (mp.main_part_ == Rational (0))
+      SCM bn = get_property ("currentBarNumber");
+      SCM proc = get_property ("barNumberVisibility");
+      if (scm_is_number (bn) && ly_is_procedure (proc)
+          && to_boolean (scm_call_2 (proc, bn, mp.smobbed_copy ())))
         {
-          SCM bn = get_property ("currentBarNumber");
-          SCM proc = get_property ("barNumberVisibility");
-          if (scm_is_number (bn) && ly_is_procedure (proc)
-              && to_boolean (scm_call_1 (proc, bn)))
+          create_items ();
+          SCM alternative_style = get_property ("alternativeNumberingStyle");
+          string text_tag = "";
+          if (alternative_style == ly_symbol2scm ("numbers-with-letters"))
             {
-              create_items ();
-              SCM alternative_style = get_property ("alternativeNumberingStyle");
-              string text_tag = "";
-              if (alternative_style == ly_symbol2scm ("numbers-with-letters"))
+              if (alternative_event_)
                 {
-                  if (alternative_event_)
+                  Direction alternative_dir = robust_scm2dir (alternative_event_->get_property ("alternative-dir"), RIGHT);
+                  switch (alternative_dir)
                     {
-                      Direction alternative_dir = robust_scm2dir (alternative_event_->get_property ("alternative-dir"), RIGHT);
-                      switch (alternative_dir)
-                        {
-                        case LEFT:
-                          alternative_number_ = 0;
-                          break;
-                        case CENTER:
-                          break;
-                        case RIGHT:
-                          alternative_number_ = INT_MIN;
-                          break;
-                        default:
-                          assert (false);
-                        }
-                      alternative_number_ += alternative_number_increment_;
-
-                      alternative_number_increment_ = robust_scm2int (alternative_event_->get_property ("alternative-increment"), 1);
-                    }
-                  if (alternative_number_ >= 0)
-                    {
-                      string alphabet = "abcdefghijklmnopqrstuvwxyz";
-                      int power = 0;
-                      int running_sum = 0;
-                      int scratch = alternative_number_;
-                      while (running_sum <= alternative_number_)
-                        {
-                          power++;
-                          running_sum += int_pow (26, power);
-                        }
-                      scratch += int_pow (26, power) - running_sum;
-                      for (int i = power; i--;)
-                        text_tag += alphabet.at ((scratch / int_pow (26, i)) % 26);
+                    case LEFT:
+                      alternative_number_ = 0;
+                      break;
+                    case CENTER:
+                      break;
+                    case RIGHT:
+                      alternative_number_ = INT_MIN;
+                      break;
+                    default:
+                      assert (false);
                     }
+                  alternative_number_ += alternative_number_increment_;
+
+                  alternative_number_increment_ = robust_scm2int (alternative_event_->get_property ("alternative-increment"), 1);
                 }
-              // guh.
-              text_->set_property
-              ("text",
-               scm_string_concatenate (scm_list_2 (scm_number_to_string (bn, scm_from_int (10)),
-                                                   ly_string2scm (text_tag))));
             }
+          SCM formatter = get_property ("barNumberFormatter");
+          if (ly_is_procedure (formatter))
+            text_->set_property ("text", scm_call_4 (formatter,
+                                                     bn,
+                                                     mp.smobbed_copy (),
+                                                     scm_from_int (alternative_number_),
+                                                     context ()->self_scm ()));
         }
     }
 }
@@ -219,6 +193,7 @@ ADD_TRANSLATOR (Bar_number_engraver,
                 "currentBarNumber "
                 "whichBar "
                 "stavesFound "
+                "barNumberFormatter "
                 "barNumberVisibility "
                 "alternativeNumberingStyle ",
 
index 2e0a90d0e68e081d7d63552dd1947e81f7f44f79..e5409daa434a4351ddb1c8debd585008b9f9893a 100644 (file)
@@ -585,7 +585,8 @@ automatically when an output definition (a @code{\score} or
 
   defaultBarType = #"|"
   doubleRepeatType = #":|:"
-  barNumberVisibility = #first-bar-number-invisible
+  barNumberVisibility = #first-bar-number-invisible-and-no-parenthesized-bar-numbers
+  barNumberFormatter = #robust-bar-number-function
   automaticBars = ##t
 
   explicitClefVisibility = #all-visible
index a0cf0ae8328fa38e94495c697f3a0674b6e9fe23..7e14325258bf99ef39d521e3376cd3e36df82395 100644 (file)
@@ -124,9 +124,12 @@ count if this property is unset.")
 each note.")
      (barCheckSynchronize ,boolean? "If true then reset
 @code{measurePosition} when finding a bar check.")
-     (barNumberVisibility ,procedure? "A Procedure that takes an
-integer and returns whether the corresponding bar number should be
-printed.")
+     (barNumberFormatter ,procedure? "A procedure that takes a bar
+number, measure position, and alternative number and returns a markup
+of the bar number to print.")
+     (barNumberVisibility ,procedure? "A procedure that takes a bar
+number and a measure position and returns whether the corresponding
+bar number should be printed.")
      (baseMoment ,ly:moment? "Smallest unit of time that will stand on its
 own as a subdivided section.")
      (bassFigureFormatFunction ,procedure? "A procedure that is
index 314e66ff59b8783263efcbcaa36f0f721a240f18..6a23c4124f0ed7cd4f8d2443e72468b894b4e6aa 100644 (file)
@@ -599,10 +599,10 @@ only ~a fret labels provided")
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; bar numbers
 
-(define-public ((every-nth-bar-number-visible n) barnum)
+(define-public ((every-nth-bar-number-visible n) barnum mp)
   (= 0 (modulo barnum n)))
 
-(define-public ((modulo-bar-number-visible n m) barnum)
+(define-public ((modulo-bar-number-visible n m) barnum mp)
   (and (> barnum 1) (= m (modulo barnum n))))
 
 (define-public ((set-bar-number-visibility n) tr)
@@ -610,9 +610,44 @@ only ~a fret labels provided")
     (ly:context-set-property! tr 'barNumberVisibility
                              (modulo-bar-number-visible n (modulo bn n)))))
 
-(define-public (first-bar-number-invisible barnum) (> barnum 1))
-
-(define-public (all-bar-numbers-visible barnum) #t)
+(define-public (first-bar-number-invisible barnum mp)
+  (> barnum 1))
+
+(define-public (first-bar-number-invisible-save-broken-bars barnum mp)
+  (or (> barnum 1)
+      (> (ly:moment-main-numerator mp) 0)))
+
+(define-public (first-bar-number-invisible-and-no-parenthesized-bar-numbers barnum mp)
+  (and (> barnum 1)
+       (= (ly:moment-main-numerator mp) 0)))
+
+(define-public (robust-bar-number-function barnum measure-pos alt-number context)
+  (define (get-number-and-power an pow)
+    (if (<= an alt-number)
+        (get-number-and-power (+ an (expt 26 (1+ pow))) (1+ pow))
+        (cons (+ alt-number (- (expt 26 pow) an)) (1- pow))))
+  (define (make-letter so-far an pow)
+    (if (< pow 0)
+      so-far
+      (let ((pos (modulo (quotient an (expt 26 pow)) 26)))
+        (make-letter (string-append so-far
+                                    (substring "abcdefghijklmnopqrstuvwxyz"
+                                               pos
+                                               (1+ pos)))
+                   an
+                   (1- pow)))))
+  (let* ((number-and-power (get-number-and-power 0 0))
+         (begin-measure (= 0 (ly:moment-main-numerator measure-pos)))
+         (maybe-open-parenthesis (if begin-measure "" "("))
+         (maybe-close-parenthesis (if begin-measure "" ")")))
+    (markup (string-append maybe-open-parenthesis
+                           (number->string barnum)
+                           (make-letter ""
+                                        (car number-and-power)
+                                        (cdr number-and-power))
+                           maybe-close-parenthesis))))
+
+(define-public (all-bar-numbers-visible barnum mp) #t)
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;