[Top][All Lists]

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

Re: Growing beam position

From: Aaron Hill
Subject: Re: Growing beam position
Date: Wed, 03 Nov 2021 23:11:30 -0700
User-agent: Roundcube Webmail/1.4.9

On 2021-11-03 4:45 pm, Paolo Prete wrote:
Hello Aaron,

what if I enlarge the beam angle? (see below)

Okay, my guesswork was wrong. Here is code that was adapted from the underlying C++ logic:

\version "2.22.0"

#(define (ly:stem::beam-multiplicity grob)
  ;; Adapted from non-exported C++ method
  (define (slice lst)
   (let ((ints (filter integer? (or lst '()))))
    (if (null? ints) (cons 1 -1)
     (cons (apply min ints) (apply max ints)))))
  (let ((beaming (ly:grob-property grob 'beaming)))
   (interval-union (slice (car beaming)) (slice (cdr beaming)))))

#(define (ly:beam::get-beam-count grob)
  ;; Adapted from non-exported C++ method
  (apply max
    (lambda (stem)
     (1+ (interval-length (ly:stem::beam-multiplicity stem))))
    (ly:grob-array->list (ly:grob-object grob 'stems)))))

#(define (ly:beam::get-beam-translation grob)
  ;; Adapted from non-exported C++ method
  (let* ((beam-count (ly:beam::get-beam-count grob))
         (staff-space (ly:staff-symbol-staff-space grob))
         (line-thickness (ly:staff-symbol-line-thickness grob))
         (beam-thickness (* (ly:grob-property grob 'beam-thickness)
         (length-fraction (ly:grob-property grob 'length-fraction 1))
         (scalar (if (< beam-count 4) 2 3)))
   (- (* length-fraction (+ staff-space (/ line-thickness scalar)))
      (/ beam-thickness scalar))))

alignGrowingBeams =
\override Beam.positions =
#(grob-transformer 'positions (lambda (grob orig)
  (let* ((beam-translation (ly:beam::get-beam-translation grob))
         (beam-count (ly:beam::get-beam-count grob))
         (staff-space (ly:staff-symbol-staff-space grob))
         (height (/ (* (1- beam-count) beam-translation) staff-space))
         (direction (ly:grob-property grob 'direction))
         (grow-right? (< 0 (ly:grob-property grob 'grow-direction)))
         (interval (if (interval-sane? orig) orig
                       (reverse-interval orig)))
         (far (interval-index interval direction))
         (near (- far (* 0.5 direction height))))
   (if grow-right? (cons near far) (cons far near)))))

beamTest = {
  \override Beam.grow-direction = #RIGHT
  e'32[ f' g' a']
  c''64[ d'' e'' f'']
  \override Beam.grow-direction = #LEFT
  b'128[ a' g' f']

beamTests = {
  \override Beam.length-fraction = #1.6
  \override Beam.beam-thickness = #0.8

{ \alignGrowingBeams \beamTests }
{ \magnifyStaff #0.6 \alignGrowingBeams \beamTests }

-- Aaron Hill

Attachment: beam-height.cropped.png
Description: PNG image

reply via email to

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