lilypond-user
[Top][All Lists]
Advanced

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

Re: spanner and epsfile


From: Thomas Morley
Subject: Re: spanner and epsfile
Date: Wed, 1 Nov 2017 22:43:43 +0100

2017-11-01 22:06 GMT+01:00 Bernardo Barros <address@hidden>:
> On 11/1/17 15:27, Thomas Morley wrote:
>>
>>
>> Another possibility is to clone all of the
>> TextSpanner-grob/engraver/etc under a different name.
>>
>> https://archiv.lilypondforum.de/index.php/topic,2503.msg14199.html#msg14199
>> Scroll down to the code - it was developed by Xaver and myself, based
>> upon the scheme-text-engraver from our regtests.
>
>
> I'm not able to compile 'scheme-text-spanner.ly' Does it work for you?

Where did you get the code below?
It's not the current coding
>
> Starting lilypond 2.19.65 [lily-b5b7fd74.ly]...
> Processing `/Users/smoge/Downloads/lily-b5b7fd74.ly'
> Parsing...
> warning: type check for `SchemeTextSpanner' failed; value
> `#<Grob_properties>' must be of type `list'
> Interpreting music...
> Exited with exit status 1.
>
> \version "2.19.49"
>
> \header {
>   texidoc = "Use @code{define-event-class}, scheme engraver methods,
> and grob creation methods to create a fully functional text spanner
> in scheme."
> }
>
> #(define-event-class 'scheme-text-span-event 'span-event)
>
> #(define (add-grob-definition grob-name grob-entry)
>    (let* ((meta-entry   (assoc-get 'meta grob-entry))
>           (class        (assoc-get 'class meta-entry))
>           (ifaces-entry (assoc-get 'interfaces meta-entry)))
>      (set-object-property! grob-name 'translation-type? list?)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Above was fixed with issue 2507:

Pushed to staging as
commit [re328b7a10ec1a4e13ba11104825bf54e027d0dd0]
Author: David Kastrup <address@hidden>
Date:   Wed Jul 30 17:34:55 2014 +0200

    Issue 2507: Stop the entanglement of context properties and grob
property internals

    This introduces a semi-opaque structure Grob_properties meeting the
    predicate ly:grob-properties? that is algorithmically handled at the C++
    level via a wrapper structure Grob_property_info.

    Encapsulating grob properties in that manner reduces the potential for
    clashes and makes it easier to change algorithms and/or internal
    representation.

    While the principal distinction between context properties (one value
    per context) and context-based grob property templates (one stack per
    context) remains, at least the separation of the handling is more
    pronounced.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Labels: -Patch-push Fixed_2_19_13
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Status: Fixed


>      (set-object-property! grob-name 'is-grob? #t)
>      (set! ifaces-entry (append (case class
>                                   ((Item) '(item-interface))
>                                   ((Spanner) '(spanner-interface))
>                                   ((Paper_column) '((item-interface
>
> paper-column-interface)))
>                                   ((System) '((system-interface
>                                                spanner-interface)))
>                                   (else '(unknown-interface)))
>                                 ifaces-entry))
>      (set! ifaces-entry (uniq-list (sort ifaces-entry symbol<?)))
>      (set! ifaces-entry (cons 'grob-interface ifaces-entry))
>      (set! meta-entry (assoc-set! meta-entry 'name grob-name))
>      (set! meta-entry (assoc-set! meta-entry 'interfaces
>                                   ifaces-entry))
>      (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
>      (set! all-grob-descriptions
>            (cons (cons grob-name grob-entry)
>                  all-grob-descriptions))))
>
> #(add-grob-definition
>   'SchemeTextSpanner
>   `(
>     (bound-details . ((left . ((Y . 0)
>                                (padding . 0.25)
>                                (attach-dir . ,LEFT)
>                                ))
>                       (left-broken . ((end-on-note . #t)))
>                       (right . ((Y . 0)
>                                 (padding . 0.25)
>                                 ))
>                       ))
>     (dash-fraction . 0.2)
>     (dash-period . 3.0)
>     (direction . ,UP)
>     (font-shape . italic)
>     (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
>     (outside-staff-priority . 350)
>     (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
>     (staff-padding . 0.8)
>     (stencil . ,ly:line-spanner::print)
>     (style . dashed-line)
>
>     (meta . ((class . Spanner)
>              (interfaces . (font-interface
>                             line-interface
>                             line-spanner-interface
>                             side-position-interface))))))
>
> #(define scheme-event-spanner-types
>    '(
>      (SchemeTextSpanEvent
>       . ((description . "Used to signal where scheme text spanner brackets
> start and stop.")
>          (types . (general-music scheme-text-span-event span-event event))
>          ))
>      ))
>
> #(set!
>   scheme-event-spanner-types
>   (map (lambda (x)
>          (set-object-property! (car x)
>                                'music-description
>                                (cdr (assq 'description (cdr x))))
>          (let ((lst (cdr x)))
>            (set! lst (assoc-set! lst 'name (car x)))
>            (set! lst (assq-remove! lst 'description))
>            (hashq-set! music-name-to-property-table (car x) lst)
>            (cons (car x) lst)))
>        scheme-event-spanner-types))
>
> #(set! music-descriptions
>        (append scheme-event-spanner-types music-descriptions))
>
> #(set! music-descriptions
>        (sort music-descriptions alist<?))
>
> #(define (add-bound-item spanner item)
>    (if (null? (ly:spanner-bound spanner LEFT))
>        (ly:spanner-set-bound! spanner LEFT item)
>        (ly:spanner-set-bound! spanner RIGHT item)))
>
> #(define (axis-offset-symbol axis)
>    (if (eq? axis X) 'X-offset 'Y-offset))
>
> #(define (set-axis! grob axis)
>   (if (not (number? (ly:grob-property grob 'side-axis)))
>       (begin
>         (set! (ly:grob-property grob 'side-axis) axis)
>         (ly:grob-chain-callback
>          grob
>          (if (eq? axis X)
>              ly:side-position-interface::x-aligned-side
>              side-position-interface::y-aligned-side)
>          (axis-offset-symbol axis)))))
>
> schemeTextSpannerEngraver =
> #(lambda (context)
>    (let ((span '())
>          (finished '())
>          (event-start '())
>          (event-stop '()))
>      (make-engraver
>       (listeners ((scheme-text-span-event engraver event)
>                   (if (= START (ly:event-property event 'span-direction))
>                       (set! event-start event)
>                       (set! event-stop event))))
>       (acknowledgers ((note-column-interface engraver grob source-engraver)
>                       (if (ly:spanner? span)
>                           (begin
>                             (ly:pointer-group-interface::add-grob span
> 'note-columns grob)
>                             (add-bound-item span grob)))
>                       (if (ly:spanner? finished)
>                           (begin
>                             (ly:pointer-group-interface::add-grob finished
> 'note-columns grob)
>                             (add-bound-item finished grob)))))
>       ((process-music trans)
>        (if (ly:stream-event? event-stop)
>            (if (null? span)
>                (ly:warning "You're trying to end a scheme text spanner but
> you haven't started one.")
>                (begin (set! finished span)
>                       (ly:engraver-announce-end-grob trans finished
> event-start)
>                       (set! span '())
>                       (set! event-stop '()))))
>        (if (ly:stream-event? event-start)
>            (begin (set! span (ly:engraver-make-grob trans 'SchemeTextSpanner
> event-start))
>                   (set-axis! span Y)
>                   (set! event-start '()))))
>       ((stop-translation-timestep trans)
>        (if (and (ly:spanner? span)
>                 (null? (ly:spanner-bound span LEFT)))
>            (set! (ly:spanner-bound span LEFT)
>                  (ly:context-property context 'currentMusicalColumn)))
>        (if (ly:spanner? finished)
>            (begin
>              (if (null? (ly:spanner-bound finished RIGHT))
>                  (set! (ly:spanner-bound finished RIGHT)
>                        (ly:context-property context 'currentMusicalColumn)))
>              (set! finished '())
>              (set! event-start '())
>              (set! event-stop '()))))
>       ((finalize trans)
>        (if (ly:spanner? finished)
>            (begin
>              (if (null? (ly:spanner-bound finished RIGHT))
>                  (set! (ly:spanner-bound finished RIGHT)
>                        (ly:context-property context 'currentMusicalColumn)))
>              (set! finished '())))
>        (if (ly:spanner? span)
>            (begin
>              (ly:warning "I think there's a dangling scheme text spanner
> :-(")
>              (ly:grob-suicide! span)
>              (set! span '())))))))
>
> schemeTextSpannerStart =
> #(make-span-event 'SchemeTextSpanEvent START)
>
> schemeTextSpannerEnd =
> #(make-span-event 'SchemeTextSpanEvent STOP)
>
> \layout {
>   \context {
>     \Global
>     \grobdescriptions #all-grob-descriptions
>   }
>   \context {
>     \Voice
>     \consists \schemeTextSpannerEngraver
>   }
> }
>
> \relative c' {
>   a4 b\schemeTextSpannerStart c d |
>   \repeat unfold 20 { a4 b c d | }
>   a4 b c\schemeTextSpannerEnd d |
>   \override SchemeTextSpanner.to-barline = ##t
>   a4\schemeTextSpannerStart b d c |
>   \repeat unfold 20 { a4 b c d | }
>   a1\schemeTextSpannerEnd |
> }
>
>

Cheers,
  Harm



reply via email to

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