}
}
-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 ()
{
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 ()));
}
}
}
"currentBarNumber "
"whichBar "
"stavesFound "
+ "barNumberFormatter "
"barNumberVisibility "
"alternativeNumberingStyle ",
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
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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)
(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)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;