Wow!
Thank!!!!

I'll try to make something of all these!
I think Pierre's answer to Andrew is where I find the most acurate answer,
now I'll extract the fragment needed (ifI can manage), and put it inside
the staff...
Let's start tweaking!!!

THANKS again!

El lun., 8 de jul. de 2019 a la(s) 05:54, Andrew Bernard (
andrew.bern...@gmail.com) escribió:

> Hi Marcos,
>
> Here is what I use. I hope you may find it useful. The vibrato function
> modifies the trill spanner.
>
> Picture attached of real use in the piece I engraved (for 7 string
> guitar, but that's not really relevant).
>
> I do not recall where I got this from, but the author is acknowledged.
> The example along with the function code gives you lots of inspiration.
> Highly parameterised.
>
> Andrew
>
> %==============================================
>
> %\version "2.19.44"
>
> % vibrato.ly
> % Author: Mark Witmer
>
> % Sets the next trill spanner to draw a waveform with the provided
> wevelength
> % and amplitudes. The waveform will go from one amplitude to the next in a
> % linear fashion.
>
> vibrato =
> #(define-music-function (amplitudes wavelength)
>     (list? number?)
>     #{
>       \once \override TrillSpanner #'after-line-breaking =
>       $(lambda (grob)
>          (ly:grob-set-property! grob 'stencil (makevib grob amplitudes
> wavelength)))
>     #})
>
> #(define adjustvib #t)
>
> % Creates the postscript for one system of the vibrato marking
> #(define (make_ps no-sib? lbound xspan span-so-far amplitude-vector
> wavelength)
>     (if (or (= xspan -inf.0) (= xspan +inf.0))
>         ""
>         (let ((lbound
>                (cond
>                 ((and (> span-so-far 0) adjustvib)
>                  (- lbound 18))
>                 (no-sib? (+ lbound 1))
>                 (else lbound)))
>               (last
>                (inexact->exact (floor (/ (+ span-so-far xspan)
> wavelength)))))
>           (format
>            #f "gsave currentpoint translate 0.15 setlinewidth newpath /x
> ~a def\nx 0.0 moveto\n ~a ~a"
>            lbound
>            (let make-curve
>              ((current (inexact->exact (floor (/ span-so-far
> wavelength)))))
>              (cond
>               ((= current (vector-length amplitude-vector)) "")
>               ((< (vector-ref amplitude-vector current) 0) "")
>               (else
>                (let ((current-ps
>                       (format
>                        #f " x ~a add ~a x ~a add ~a x ~a add 0.0
> curveto\n/x x ~a add def\n"
>                        (exact->inexact (/ wavelength 3))
>                        (vector-ref amplitude-vector current)
>                        (exact->inexact (* 2 (/ wavelength 3)))
>                        (- (vector-ref amplitude-vector current))
>                        wavelength
>                        wavelength)))
>                  (if (= (+ current 1) last)
>                      current-ps
>                      (format #f "~a~a" current-ps
>                        (make-curve (+ 1 current))))))))
>            "stroke grestore"))))
>
> % Returns the width of a grob
> #(define (grob-width grob)
>     (if (or (= (car (ly:grob-property grob 'X-extent)) -inf.0)
>             (= (car (ly:grob-property grob 'X-extent)) +inf.0))
>         0
>         (- (cdr (ly:grob-property grob 'X-extent))
>           (car (ly:grob-property grob 'X-extent)))))
>
> % Returns the number of ems already traversed by the grob's siblings in
> % previous systems
> #(define (width-up-to grob siblings count)
>     (if (eq? (car siblings) grob)
>         count
>         (+ (+ count (width-up-to grob (cdr siblings) count))
>           (grob-width (car siblings)))))
>
> % Returns the total width of the individual grobs for each system that
> make up
> % the original grob
> #(define (calcfull siblings count)
>     (if (eqv? (length siblings) 0)
>         count
>         (calcfull (cdr siblings) (+ count (grob-width (car siblings))))))
>
> % Fills a vector of length len with linear interpolations between the
> values
> % found in amplitudes
> #(define (fill-amplitude-vector! amplitude-vector len current-index
> amplitudes)
>     (if (> (length amplitudes) 1)
>         (let ((start-amplitude (car amplitudes))
>               (end-amplitude (cadr amplitudes))
>               (start-index current-index)
>               (end-index (+ current-index
>                            (inexact->exact
>                             (floor (/ (vector-length amplitude-vector)
>                                      (- len 1)))))))
>           (do ((n current-index (+ 1 n)))
>             ((or (> n (+ start-index end-index))
>                  (>= n (vector-length amplitude-vector))))
>             (vector-set! amplitude-vector n
>               (exact->inexact
>                (+ start-amplitude
>                  (* (/ (- n start-index) (- end-index start-index))
>                    (- end-amplitude start-amplitude))))))
>           (fill-amplitude-vector!
>            amplitude-vector len end-index (cdr amplitudes)))))
>
> % Makes the vector of amplitudes for the vibrato marking
> #(define (make-amplitude-vector amplitudes total-span wavelength)
>     (let* ((current-start 0)
>            (len (inexact->exact (floor (/ total-span wavelength))))
>            (amplitude-vector (make-vector len)))
>       (if (> (length amplitudes) 1)
>           (fill-amplitude-vector!
>            amplitude-vector (length amplitudes) 0 amplitudes)
>           (vector-fill! amplitude-vector (car amplitudes)))
>       amplitude-vector))
>
> % Creates a stencil that draws a sine wave for vibrato based on the
> provided
> % amplitudes and wavelength
> #(define (makevib grob amplitudes wavelength)
>     (let* ((orig (ly:grob-original grob))
>            (siblings (if (ly:grob? orig) (ly:spanner-broken-into orig)
> '()))
>            (span (ly:grob-property grob 'X-extent))
>            (xbeg (car span))
>            (xend (cdr span))
>            (xspan (- xend xbeg))
>            (total-span (if (eqv? (length siblings) 0) (- xspan 3) (-
> (calcfull siblings 0) 3)))
>            (lbound (if (or (null? siblings) (eq? (car siblings) grob))
>                        0 (+ 14 (cdr (assq 'X (ly:grob-property grob
> 'left-bound-info))))))
>            (span-so-far (if (null? siblings) 0
>                             (width-up-to grob siblings 0))))
>       (ly:make-stencil
>        (list 'embedded-ps
>          (make_ps (null? siblings) lbound xspan span-so-far
>            (make-amplitude-vector amplitudes total-span wavelength)
>            wavelength))
>        '(0 . 0) '(-0.7 . 0.5))))
>
> vib =
> #(define-music-function (sizes)
>     (list?)
>     #{
>       \vibrato $sizes #0.7
>     #})
>
> sVib = \startTrillSpan
> eVib = \stopTrillSpan
>
> %{
> % Example:
>
> \relative c' {
>    \time 4/4
>    \key d \major
>
>    \vibrato #'(4 0 4) #1.5 c\startTrillSpan d e d c d e d c\stopTrillSpan
>
>    \vibrato #'(1 6 2 1 3 7 4) #1 c\startTrillSpan d e d c d e d c d e d
> c d e d c d e d c d e d c d e d c d e d
>
>    c d e d c d e d c d e d c d e d c d e d c d e d c d e d c d
> e\stopTrillSpan
> }
>
> \paper {
>    ragged-right = ##f
> }
>
> \relative c' {
>    \vibrato #'(4 .2 0) #1.2 c1\startTrillSpan c\stopTrillSpan
> }
>
> %}
>
>
>
>
>
>
>
>
>
>
>
> %==============================================
>
> _______________________________________________
> lilypond-user mailing list
> lilypond-user@gnu.org
> https://lists.gnu.org/mailman/listinfo/lilypond-user
>
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to