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

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

Re: extraire une portion de musique


From: Nicolas Sceaux
Subject: Re: extraire une portion de musique
Date: Wed, 4 Jun 2008 21:23:24 +0200

Le 2 juin 08 à 13:28, Gilles THIBAULT a écrit :

Cela fait longtemps que je voulais une fonction pour extraire d'une manière simple, une portion de musique déjà entrée mais sans modifier celle- ci.

C'est ce que propose la fonction extractMusic (dans le fichier
extractMusic.ly ci-joint) :

Elle prend 3 arguments :
  - la musique à partir de laquelle se fait l'extraction
  - Combien de temps avant le début de l'extraction
  - Combien de temps dure l'extraction

Par exemple

\extractMusic \music s1*2 s1*4

copie \music de la mesure 3 pendant 4 mesures. (à  4/4  bien-sûr)


Si ça peut être util à d'autre que moi, tant mieux.

Euh, éventuellement je serai content si vous me dites s'il y a des bugs ...

J'ai souvent eu envie d'une fonction de ce genre, sans me donner la
peine de l'écrire, mais je pense que c'est très utile, dès lors
qu'on écrit conducteur et matériel d'orchestre.

Une première remarque générale : le code est très mal présenté, ce
qui le rend pénible à lire. Les règles d'indentation des idiomes de
lisp sont très simples, si tu utilises un éditeur valable il saura
le faire tout seul. Mis à part l'indentation, il existe quelques
règles d'usage à respecter, par exemple on ne laisse pas de parenthèse
seule sur une ligne, on utilise des tiret "-" dans les noms de
variables pour séparer les mots.

Voici ton code à peine retouché (j'ai juste transformé la variable
globale en variable "spéciale" au sens Common Lisp du terme)

%%%%%%%%%%% functions %%%%%%%%%%%%%%%%%
#(use-modules (srfi srfi-39))

#(define *current-moment*
   (make-parameter (ly:make-moment 0 1 0 1)))

#(define (clean-music music)
   (music-filter
    (lambda (evt)
;; don't keep simultaneous and sequential music with empty 'elements
      (or (not (eq? 'EventChord (ly:music-property evt 'name)))
          (pair? (ly:music-property evt 'elements))
          (pair? (ly:music-property evt 'articulations))
          (ly:music? (ly:music-property evt 'element))))
    (music-filter
     (lambda (evt)
       ;; don't keep articulations or slurs with no notes assigned to
       (let ((elts (ly:music-property evt 'elements)))
         (not (and (eq? (ly:music-property evt 'name) 'EventChord)
                   (pair? elts)
                   (not (memq (ly:music-property (car elts) 'name)
                              (list 'NoteEvent 'RestEvent)))))))
     music)))

#(define (extract-music music from to)
   "description... `from' and `to' as moment"
   (let ((elts (ly:music-property music 'elements))
         (elt  (ly:music-property music 'element))
         (dur (ly:music-property music 'duration))
         (result music))
     (cond ((pair? elts)
(if (not (eq? (ly:music-property music 'name) 'SimultaneousMusic)) (set! (ly:music-property music 'elements) ;% for SequentialMusic
                      (filter (lambda (evt)
                                (extract-music evt from to))
                              elts)) ; for SimultaneousMusic
                (let ((max-moment (ly:make-moment 0 1 0 1))
                      (save-moment (*current-moment*))
                      (temp-moment (ly:make-moment 0 1 0 1))
                      (res-music (make-music 'Music)))
                  (set! (ly:music-property music 'elements)
                        (filter (lambda (evt)
(set! res-music (extract-music evt from to)) (set! temp-moment (ly:moment-sub (*current-moment*) save-moment)) (if (ly:moment<? max-moment temp- moment) (set! max-moment temp-moment)) ; % keep the biggest length (*current-moment* save-moment) ; %restore the previous length
                                 res-music)
                                elts))
(*current-moment* (ly:moment-add save-moment max- moment)))))
           ((ly:music? elt)
            (extract-music elt from to))
           ((ly:duration? dur)
(*current-moment* (ly:moment-add (*current-moment*) (ly:duration-length dur)))
            (set! result (and (ly:moment<? from (*current-moment*))
(not (ly:moment<? to (*current- moment*)))))))
     result))

%%%%%%%%%%% the main function %%%%%%%%%%%%%%%%%
extractMusic =
#(define-music-function (parser location music from during)
                        (ly:music? ly:music? ly:music?)
   (let* ((from-length (ly:music-length from))
          (during-length (ly:music-length during))
          (to-length (ly:moment-add during-length from-length)))
     (parameterize ((*current-moment* (ly:make-moment 0 1 0 1)))
       (clean-music (extract-music music from-length to-length)))))

%%%%%%%%%%%%%%%%%%%%%%%%%%% tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.11.42" %% should work with 2.10

music = \relative {
  << { c4 d e f g1 } \\ { c,2 c b1 } >>
  g'4\< a b c\!
  << d1 \\ { b2\> b\! } >>
  d4( c) b-. a-.
  << { g1-> g4-. f-. e( d) } \\ { g4 f e d( e2) r } >>
  c1
}
                        
\score {
  <<
    \new Staff { \music }  %% original
    \new Staff {
      R1*2
      \extractMusic \music s1*2 s1*4
%% extract the music begining at the 2 measures and during 4 measures
      R1*2
    }
  >>
}

%%%%%%%%%%%%%%%%%%%%%%






reply via email to

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