[Top][All Lists]
[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
}
>>
}
%%%%%%%%%%%%%%%%%%%%%%
Re: extraire une portion de musique,
Nicolas Sceaux <=