[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.