lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Lower-case letter rehearsal marks


From: Thomas Morley
Subject: Re: Lower-case letter rehearsal marks
Date: Wed, 9 Dec 2015 14:16:37 +0100

2015-12-09 12:52 GMT+01:00 Andrew Bernard <address@hidden>:
> Hi Abraham,
>
> Well, as a very quick hack, you can change the uppercase hardwired A in this
> code to lowercase hardwired as below. I am not suggesting this is the best
> solution, but it works.
>
> Andrew
>
>
>
> — snip
>
> define-markup-commands.scm
>
>
> (define number->mark-letter-vector (make-vector 25 #\a))
>
> (do ((i 0 (1+ i))
>      (j 0 (1+ j)))
>     ((>= i 26))
>   (if (= i (- (char->integer #\i) (char->integer #\a)))
>       (set! i (1+ i)))
>   (vector-set! number->mark-letter-vector j
>                (integer->char (+ i (char->integer #\a)))))
>
> (define number->mark-alphabet-vector (list->vector
>                                       (map (lambda (i) (integer->char (+ i
> (char->integer #\a)))) (iota 26))))
>
> — snip
>

This whole stuff looks quite obfuscated to me.
Currently we do a lot of calculation to end up with then hard-coded vectors.
Why not give the initial value directly?
Below three suggestions, via string, char-set, vector.
Maybe we could even introduce a context-property for it.

To get lowercase values uncomment the relevant line (see comments inline)

\version "2.19.32"

%%%% (1) Possible characters are given as string
%%{
#(define mark-string "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
%% uncomment for lowercase:
%#(set! mark-string (string-downcase mark-string))

#(define mark-vector
  (list->vector
    (string->list mark-string)))

#(define mark-vector-I
  (list->vector
    (string->list (string-delete mark-string (string->char-set "iI")))))
%}
%%%% (2) Possible characters are taken from a char-set
%{
#(define mark-char-set char-set:upper-case)
%% uncomment for lowercase:
%#(set! mark-char-set char-set:lower-case)

#(define mark-vector
  (list->vector (char-set->list mark-char-set)))

#(define mark-vector-I
  (list->vector
    (char-set->list
      (char-set-difference mark-char-set (string->char-set "iI")))))
%}

%%%% (3) Possible characters are given as vector
%{
#(define mark-initial-vector
  #(#\A #\B #\C #\D #\E #\F #\G #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S
    #\T #\U #\V #\W #\X #\Y #\Z))

%% uncomment for lowercase:
%%% adjusted copy from music-functions.scm
%#(define (vector-map f v)
%  "Map F over V.  Returns a new created vector."
%  (do ((n (vector-length v))
%       (i 0 (+ i 1)))
%      ((>= i n))
%    (vector-set! v i (f (vector-ref v i))))
%  v)
%
%#(set! mark-initial-vector (vector-map char-downcase mark-initial-vector))

#(define mark-vector mark-initial-vector)

#(define mark-vector-I
  (list->vector
    (remove
      (lambda (c) (or (char=? #\i c) (char=? #\I c)))
      (vector->list mark-initial-vector))))
%}

%%%% The following (adjusted) copies need to be here to make it work without
%%%% changing the source-code
%% c/p from define-markup-commands.scm
#(define (number->markletter-string vec n)
  "Double letters for big marks."
  (let* ((lst (vector-length vec)))
    (if (>= n lst)
        (string-append (number->markletter-string vec (1- (quotient n lst)))
                       (number->markletter-string vec (remainder n lst)))
        (make-string 1 (vector-ref vec n)))))

%% adjusted copies from define-markup-commands.scm
#(define-markup-command (markalphabet layout props num)
  (integer?)
  #:category other
  (interpret-markup layout props (number->markletter-string mark-vector num)))

#(define-markup-command (markletter layout props num)
  (integer?)
  #:category other
  (interpret-markup layout props (number->markletter-string mark-vector-I num)))

%% c/p from translation-functions.scm
#(define (format-mark-letters mark context)
  (make-bold-markup (make-markletter-markup (1- mark))))

\score {
  \new Staff {
    \mark #8
    R1
    \mark #9
    R1
    \mark #10
    R1
    \mark #30
  }
  \layout {
    \context {
      \Score
      markFormatter = #format-mark-letters
    }
  }
}

Cheers,
  Harm



reply via email to

[Prev in Thread] Current Thread [Next in Thread]