lilypond-user-fr
[Top][All Lists]
Advanced

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

Re: Passage noires à blanches


From: Valentin Villenave
Subject: Re: Passage noires à blanches
Date: Wed, 25 Dec 2019 13:22:35 +0000

On 12/23/19, Jean-Julien Fleck <address@hidden> wrote:
> Est-ce facilement faisable de manière automatique ?

Facilement, c’est certain pour quelqu’un qui s’y connaît vraiment (ce
qui, hélas, n’est toujours pas mon cas).

J’ai essayé de faire ça de façon sophistiquée et intelligente, mais je
ne parviens qu’à donner un grand coup de massue à la fin avec un code
qui fonctionne mais qui génère tout plein d’erreurs. (La chose
élégante à faire serait d’utiliser 'void, mais pour une raison bizarre
ça ne marche pas.)

Voici :

%%%%

% Pompé sur Gilles:
% http://gillesth.free.fr/Lilypond/extractMusic/extractMusic.ly

#(define (moment->rhythm moment)
   "Try to convert moment to a duration suitable for displaying a note
or a rest,
so in the following form : (ly:make-duration k dots 1 1)
Note that, if moment=5/8, for example, no duration of this form is possible."
   (let* ((p (ly:moment-main-numerator moment))
          (q (ly:moment-main-denominator moment))
          (k (- (ly:intlog2 q) (ly:intlog2 p))))
     (if (< (ash p k) q) (set! k (1+ k)))
     (if (> k 6)
         (ly:make-duration 6 0)
         (let loop ((p1 (- (ash p k) q))
                    (dots 0))
           (let ((p2 (ash p1 1)))
             (if (>= p2 q)
                 (loop (- p2 q) (1+ dots))
                 (let* ((dur (ly:make-duration k dots))
                        (dur-len (ly:duration-length dur))
                        (frac (ly:moment-div moment dur-len)))
                   (ly:make-duration k dots
                     (ly:moment-main-numerator frac)
                     (ly:moment-main-denominator frac)))))))))

simplify =
#(define-music-function (dur m) ((ly:duration? '()) ly:music?)
   (music-map
    (lambda (ev)
      (make-sequential-music
       (list
        (make-apply-context
         (lambda (ctx)
           (let ((pos (ly:moment-main
                       (ly:context-property ctx 'measurePosition)))
                 (len (ly:context-property ctx 'measureLength)))
             (if (and
                  (ly:moment? len)
                  (music-is-of-type? ev 'rhythmic-event))
                 (if (eq? pos 0)
                     (ly:music-set-property! ev 'duration
                       (if (null? dur)
                           (moment->rhythm len)
                           dur))
   ;; Moche, mais efficace…
                     (ly:music-set-property! ev 'name 'portnawak))))))
        ev)))
    m))

\relative {
  \time 2/4
  \simplify {
    a8\f b c b
    r8 a b4~
    \time 3/4
    b a8 b c d
    e4 e e
  }
  \time 5/8
% Pour des mesures plus compliquées,
% indiquer la valeur rythmique souhaitée :
  \simplify 2.*5/6 {
    c8 d e d e f4. e8 d c2*5/4
  }
}

%%%%

V.



reply via email to

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