[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: About assigning a function to Tie.direction, and "warning: type chec
From: |
Thomas Morley |
Subject: |
Re: About assigning a function to Tie.direction, and "warning: type check for 'direction' failed" |
Date: |
Tue, 20 Feb 2018 23:23:18 +0100 |
Hi Stefano,
others already commented about quote/unquote.
Some other remark:
2018-02-20 18:55 GMT+01:00 Stefano Troncaro <address@hidden>:
> Hello everyone!
>
> I recently wrote the function bellow to be able to set the direction of ties
> in a TieColumn by specifying a list of directions:
>>
>> \version "2.19.80"
>>
>> tieDirectionFromList =
>> #(define-music-function (dir-list) (list?)
>> #{
>> \once \override Tie.before-line-breaking =
>> #(lambda (grob)
>> (let* ((tie-column (ly:grob-parent grob Y))
>> (tie-array (ly:grob-array->list (ly:grob-object tie-column
>> 'ties)))
>> (i 0))
>> (if (= (length dir-list) (length tie-array))
>> (for-each
>> (lambda (tie)
>> (if (eq? tie grob)
>> (ly:grob-set-property! grob 'direction (list-ref
>> dir-list i))
Why this resetting `i'? Use a second argument instead. See bottom.
>> (set! i (+ i 1))))
>> tie-array)
>> (ly:input-warning (*location*) "tieDirectionFromList:
>> dir-list has a different number of elements than the 'ties of the
>> TieColumn."))
>> )) #} )
>>
>> \score {
>> \new Staff \new Voice \relative c'' {
>> \tieDirectionFromList #'(-1 1 -1)
>> %The following gives warning: type check for `direction' failed; value
>> `DOWN' must be of type `direction'
>> %\tieDirectionFromList #'(DOWN UP DOWN)
>> <g e c>2~ q
>> }
>> }
>
> This works when I give the directions as numbers. However, I get an error
> when I use UP and DOWN instead, and I don't understand why. Aren't these
> constants that have the values 1 and -1? Is the problem that
> ly:grob-set-property is trying to assign the symbol (UP or DOWN) to the
> property instead of the value that they evaluate to? If so, how can that be
> fixed?
tieDirectionFromList =
#(define-music-function (dir-list) (list?)
#{
\once \override Tie.before-line-breaking =
#(lambda (grob)
(let* ((tie-column (ly:grob-parent grob Y))
(tie-array
(ly:grob-array->list (ly:grob-object tie-column 'ties))))
(if (= (length dir-list) (length tie-array))
(for-each
(lambda (d tie)
(if (eq? tie grob) (ly:grob-set-property! grob 'direction d)))
dir-list
tie-array)
(ly:input-warning (*location*)
"tieDirectionFromList: dir-list has a different number of elements than the
'ties of the TieColumn."))))
#})
\score {
\new Staff \new Voice \relative c'' {
\tieDirectionFromList #`(,DOWN ,UP ,DOWN)
<g e c>2~ q
}
}
> My second question is the following. I see in the Notation Reference that
> Tie.direction has the default value of ly:tie::calc-direction, but when I
> override it with a function it doesn't call the function and uses the
> default direction instead:
>>
>> \version "2.19.80"
>>
>> \score {
>> \new Staff \new Voice \relative c'' {
>> \override Tie.direction = #UP
>> <g e c>2~ q
>> }
>> }
>>
>> \score {
>> \new Staff \new Voice \relative c'' {
>> \override Tie.direction = #(lambda (irrelevant-var) UP)
>> <g e c>2~ q
>> }
>> }
>
> I wanted to use Tie.direction instead of Tie.before-line-breaking, but it
> doesn't work and I would like to know if I'm doing something wrong or this
> is just the way it is.
>
> As a last question, is there a way to get the same results by overriding
> TieColumn.tie-configuration but keeping the default distance to the center
> of the Staff of each Tie? Or is there something like that already
> implemented but not documented?
>
> Thank you in advance for your help!
> Stéfano
TieColumn is a beasty thing...
I have no suggestion at hand (and not the time to dive in deeper).
Sorry being of not more help,
Harm