lilypond-user
[Top][All Lists]
Advanced

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

Re: Incipit issues


From: Thomas Morley
Subject: Re: Incipit issues
Date: Wed, 7 Nov 2012 23:29:46 +0100

2012/11/6 David Kastrup <address@hidden>:
> Thomas Morley <address@hidden> writes:
[...]
>> Sorry, that I can't work on it. As soon as C++ is in the game, I'm not
>> able to play it.
>
> We still have the whitespace under meter thing.  One can manually set a
> length for the staff lines, but that seems like cheating.
>
> --
> David Kastrup

Hi David,

I tried to set StaffSymbol 'width to the sum of the x-length of all
occurring items at line-begin plus the spacing between them.
But I doesn't work as expected. I still need a factor, which
diversifies from case to case.

What am I missing?


%%%%%%% start snippet

\version "2.17.6"

#(define (read-out l1 l2)
   (define (helper ls1 ls2 ls3)
   "Filters all elements of ls1 from ls2 by their grob-name and
appends it to ls3"
    (let ((grob-name-proc (lambda (x) (assq-ref (ly:grob-property x
'meta) 'name))))
     (if (null? ls1)
         ls3
         (helper
           (cdr ls1)
           ls2
           (append ls3 (filter (lambda (x) (eq? (car ls1)
(grob-name-proc x))) ls2))))))
  (helper l1 l2 '()))

#(define (list-sum lst)
   (if (null? lst)
     0
     (+ (car lst) (list-sum (cdr lst)))))

#(define (read-spacing-to-next-item l1)
  (let* ((grob-name-proc (lambda (x) (assq-ref (ly:grob-property x
'meta) 'name)))
         (grob-name-lst (map grob-name-proc l1)))
   (define (helper ls1 ls2 ls3)
   "ls1 - grob-list
    ls2 - grob-name-list)
    ls3 - empty list"
    (let* ((space-alist-proc (lambda (x) (ly:grob-property x 'space-alist))))
    (if (null? (cdr ls2))
      ls3
        (helper (cdr ls1) (cdr ls2)
          (let ((value (assoc-ref
                         (space-alist-proc (car ls1))
                           (ly:camel-case->lisp-identifier
                             (if (eq? (cadr ls2) 'BarLine) 'StaffBar
(cadr ls2))))))
        (cons
          (if (pair? value) (cdr value) 0)
            ls3))))))
  (helper l1 grob-name-lst '())))

#(define (lisp-identifier->camel-case symbol)
   (string-concatenate
     (map
       (lambda (x) (string-capitalize x))
         (string-split (symbol->string symbol) #\- ))))

#(define (grobs-to-consider-at-line-begin l)
  (let* ((break-alignment (car (read-out (list 'BreakAlignment) l)))
         (break-align-orders (vector->list (ly:grob-property
break-alignment 'break-align-orders)))
         (break-align-orders-at-linebegin (car (last-pair
break-align-orders))))
  (map
    (lambda (x) (string->symbol (if (eq? x 'staff-bar) "BarLine"
(lisp-identifier->camel-case x))))
       break-align-orders-at-linebegin)))

#(define (delete-adjacent-equal-named-grobs lst)
  (let* ((grob-name-proc (lambda (x) (assq-ref (ly:grob-property x
'meta) 'name))))
    (fold-right (lambda (elem ret)
                  (if (equal? (grob-name-proc elem) (grob-name-proc
(first ret)))
                      ret
                      (cons elem ret)))
                (list (last lst))
                lst)))

newStaffSymbolWidth =
\override Staff.StaffSymbol #'after-line-breaking =
  #(lambda (grob)
    (let* ((sys (ly:grob-system grob))
           (all-elts (ly:grob-array->list  (ly:grob-object sys 'all-elements)))
           (grobs-to-consider (grobs-to-consider-at-line-begin all-elts))
           (grob-list (delete-adjacent-equal-named-grobs (read-out
grobs-to-consider all-elts)))
           ;(grob-list (read-out grobs-to-consider all-elts))
           (grobs-x-length-proc (lambda (x) (interval-length
(ly:grob-extent x sys X))))
           (grobs-x-length-list (map grobs-x-length-proc grob-list))
           (summed-grobs-x-length (list-sum grobs-x-length-list))
           (spacing-lengths-lst (read-spacing-to-next-item grob-list))
           (summed-spacing-lengths (list-sum spacing-lengths-lst))
           (new-width (* 1.66 (+ summed-grobs-x-length
summed-spacing-lengths))))
;    (write all-elts)
;    (newline)(write grob-list)

    (ly:grob-set-property! grob 'width new-width)))

% --- test

{
        \newStaffSymbolWidth
        \clef "bass"
        \time 2/2
        \key cis\major
        s4
}

 \new GrandStaff << $@(make-list 6
                       #{\new Staff  { \newStaffSymbolWidth s4 }
                       #}) >>

%%%%%% end snippet


BTW, is there any reason BarLine is called staff-bar in 'space-alist
and 'break-align-orders?


Regards,
  Harm

P.S:Same code as above attached as a file.

Attachment: white-space-under-meter.ly
Description: Binary data


reply via email to

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