lilypond-user
[Top][All Lists]
Advanced

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

Re: multiple \keys and \time problem


From: Thomas Morley
Subject: Re: multiple \keys and \time problem
Date: Wed, 30 Aug 2017 22:35:27 +0200

2017-08-30 22:24 GMT+02:00 Thomas Morley <address@hidden>:
> 2017-08-30 12:01 GMT+02:00 Werner LEMBERG <address@hidden>:
>>
>> Folks,
>>
>>
>> is it possible to make lilypond ignore multiple occurrences of \key or
>> \time if they don't actually change the current key or time?
>>
>> Having
>>
>>   \relative c' {
>>     \key d \major \time 2/2 d1 |
>>     d1 |
>>     \key d \major \time 2/2 d1 |
>>     d1 |
>>   }
>>
>> I get the attached output.  However, I think it would be better that
>> the redundant \time and \key signatures get ignored by default –
>> similar to notes, where `des4 des4' doesn't produce a second flat sign
>> for the second note...
>>
>> Note that this is not a constructed example; I get such lilypond code
>> while converting Cubase XML output with musicxml2ly.  Not sure whether
>> this is a bug in Cubase, or an allowed feature of MusicXML and thus a
>> bug in musicxml2ly...
>>
>>
>>     Werner
>
> Hi Werner,
>
> after David Nalesnik's suppressRedundantTimeSig-engraver, c/p unchanged,
> http://www.mail-archive.com/address@hidden/msg72628.html
> I coded a suppressRedundantKeySig-engraver.
>
> David coded it for 2.14.2, thus the old syntax. Too lazy to update it
> to use make-engraver ...
> Needs further testing ofcourse.
>
> \version "2.19.64"
>
> suppressRedundantTimeSig =
> #(lambda (ctx)
>   (let ((time-sig '()))
>
>    `((acknowledgers
>       (time-signature-interface
>        . ,(lambda (engraver grob source-engraver)
>            (set! time-sig (cons grob time-sig)))))
>
>      (finalize
>       . ,(lambda (trans)
>           (reduce
>             (lambda (elem prev)
>               (if (equal? (ly:grob-property elem 'fraction)
>                           (ly:grob-property prev 'fraction))
>                   (begin
>                     (ly:grob-suicide! elem)
>                     prev)
>                   elem))
>               '()
>               (reverse time-sig))
>             (set! time-sig '()))))))
>
> suppressRedundantKeySig =
> #(lambda (ctx)
>   (let ((key-sig '()))
>    `((acknowledgers
>       (key-signature-interface
>        . ,(lambda (engraver grob source-engraver)
>            (let* ((cause (ly:grob-property grob 'cause)))
>              (if (ly:stream-event? cause)

%% instead of the line above use the following condition
%% to prevent _needed_ KeyCancellation from being deleted

             (if (and (ly:stream-event? cause)
                      (eq? (grob::name grob) 'KeySignature))

>                  (set! key-sig
>                        (cons
>                          (list
>                            grob
>                            (cons (ly:prob-property cause 'tonic)
>                                  (ly:prob-property cause 'pitch-alist)))
>                          key-sig)))))))
>      (finalize
>       . ,(lambda (trans)
>           (reduce
>             (lambda (elem prev)
>               (if (equal? (cdr elem) (cdr prev))
>                   (begin
>                     (ly:grob-suicide! (car elem))
>                     prev)
>                   elem))
>               '()
>               (reverse key-sig))
>             (set! key-sig '()))))))
>
> music = {
>    \time 3/4
>   R2.
>   \time 4/4
>   R1
>   \time 4/4
>   R1
>   \time 3/4
>   R2.
> }
>
> \score {
>   \new Staff \music
>
>   \layout {
>     \context {
>       \Score
>       \consists #suppressRedundantTimeSig
>     }
>   }
> }
>
> \score {
>   \relative c' {
>     \key d \major
>     \time 2/2 d1 |
>     d1 |
>     \key d \major \time 2/2 d1 |
>     d1 |
>     \key d \minor \time 2/2 d1 |
>     \key d \minor \time 3/4 d2. |
>   }
>   \layout {
>     \context {
>       \Score
>       \consists #suppressRedundantTimeSig
>       \consists #suppressRedundantKeySig
>     }
>   }
> }
>
>
> HTH,
>   Harm



reply via email to

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