From 123b51c50a462b14d3cbffe2f354eaa8ec772dc2 Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Mon, 12 Dec 2011 21:33:17 +0100 Subject: [PATCH] Makes bar numbering formatter a scheme function. --- lily/bar-number-engraver.cc | 89 +++++++++++-------------------- ly/engraver-init.ly | 3 +- scm/define-context-properties.scm | 9 ++-- scm/translation-functions.scm | 45 ++++++++++++++-- 4 files changed, 80 insertions(+), 66 deletions(-) diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc index e6c401f240..f0411cfb7b 100644 --- a/lily/bar-number-engraver.cc +++ b/lily/bar-number-engraver.cc @@ -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 ", diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 2e0a90d0e6..e5409daa43 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -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 diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index a0cf0ae832..7e14325258 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -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 diff --git a/scm/translation-functions.scm b/scm/translation-functions.scm index 314e66ff59..6a23c4124f 100644 --- a/scm/translation-functions.scm +++ b/scm/translation-functions.scm @@ -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) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -- 2.39.2