routine pour arpèges ou accords

4 messages Options
Embed this post
Permalink
jp lanquetin

routine pour arpèges ou accords

Reply Threaded More More options
Print post
Permalink
Bonjour,

Avec ma formation de programmeur, je suis persuadé
qu'on peut dans Lilypond utiliser un système analogue
aux routines ou sous-programmes ( ou encore fonctions )
qui permette une économie de notation, et qui confectionne le code
complet à partir d'éléments synthètiques comme :

arpège ( do ) ==> do8 mi sol mi sol mi
ou bien
arpège (do mi sol ; 1 2 3 2 3 2 ) ==> do mi sol mi sol mi

ou bien valse ( do : m ) ==> do4 <mib sol> <mib sol>
pour faire simple

je suis tombé sur un morceau de code nommé rhythm.ly
qui ressemble furieusement à ce que je cherche,  mais comment
l'utiliser ?

Merci de toute piste

J.P. LANQUETIN

\version "2.11.37   " %%devrait marcher aussi pour la 2.10

#(define rhythmVectorIndex 0)

#(define (transformEachNote chordElt rhythmVector)
(begin
        (if (eq? 'NoteEvent (ly:music-property chordElt 'name))
                (set! (ly:music-property chordElt 'duration) (vector-ref rhythmVector rhythmVectorIndex))
        )
        chordElt
))

#(define (getChords musicElt rhythmVector)
(begin
        (if (eq? 'EventChord (ly:music-property musicElt 'name))
                (begin
                        (map
                                (lambda (x) (transformEachNote x rhythmVector))
                                (ly:music-property musicElt 'elements)
                        )
                        (set! rhythmVectorIndex (1+ rhythmVectorIndex))
                        (if (= rhythmVectorIndex (vector-length rhythmVector)) (set! rhythmVectorIndex 0))
                )
        )
        musicElt
))

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

#(define (string->duration strElt)
(
  let*(
                (ptindex (string-index strElt #\. ))
                                                        ;; position of "." in "4." for exemple. #f if no ".".
                (ptnumber 0)
                (val (string->number (if ptindex (substring strElt 0 ptindex) strElt)))
                                                        ;; val = 1 2 4 8 ... (without the ".")
                (dur (ly:intlog2 val))
                                                        ;; dur = 0 1 2 3 ... (need for ly:make-duration)
        )
                                                        ;; find the number of "." in Duration
    (while ptindex (
                begin
                        (set! ptnumber (1+ ptnumber))
                        (set! ptindex (string-index strElt #\.  (1+ ptindex) ))
                        )
        )
        (ly:make-duration dur ptnumber 1 1)
))



#(define (string->vectorDuration str)
(   let* (
                (i 0)
                (strList (string-split str #\space ))
                (len (length strList))
                (v (make-vector len))
                )
        (map  
                (lambda (x)
                        (begin
                                (vector-set! v i (string->duration x))
                                (set! i (1+ i))
                        )
                        x
                )
                strList
        )
        v
))

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

makeRhythm  = #(define-music-function (parser location m str) (ly:music? string?)
( let* (
                        (prevWasSpace #t)
                        (trimmedStr
                                (string-delete  
                                        (string-trim-right str)
                                        (lambda (c)
                                                ( let*
                                                        (
                                                                (currentIsSpace (char=? c #\space))
                                                                (res (and prevWasSpace currentIsSpace))
                                                        )
                                                        (if (not res) (set! prevWasSpace currentIsSpace))
                                                        res
                                                )
                                        )
                                )
                        )
                )
        (set! rhythmVectorIndex 0)
        (music-map
                (lambda (x)
                        (getChords x (string->vectorDuration trimmedStr)))
                m
        )
))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%
_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Martial-2

Re: routine pour arpèges ou accords

Reply Threaded More More options
Print post
Permalink
> je suis tombé sur un morceau de code nommé rhythm.ly
> qui ressemble furieusement à ce que je cherche,  mais comment
> l'utiliser ?

comme ça : (je ne sais plus qui est l'auteur)
%%----------------------
\version "2.12.2"
\include "rhythm.ly"

makeCrochePointeeDouble = #(define-music-function (parser location
music) (ly:music?)
#{
        \makeRhythm $music "8. 16"
#})


makeCrocheDeuxDoubles = #(define-music-function (parser location music)
(ly:music?)
#{
        \makeRhythm $music "8 16 16"
#})

makeBarcaroleSicilienne  = #(define-music-function (parser location
music) (ly:music?)
#{
        \makeRhythm $music "4 8 8. 16 8"
#})


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

{ \new Staff \relative
        {
                \makeCrochePointeeDouble  {c d e f g f e d <c e> <d f> <e g> <d f> }
                <c e>2 \break
          \makeCrocheDeuxDoubles  {c d e d e f e f g f <e g> <f a> }
                <e gis>2. a4 \break
                \time 6/8
                \makeBarcaroleSicilienne
                        {
                                c d e f e
                                d b g a b
                                c a a gis a
                                b gis
                        }
                        e4.
        }
}

%%----------------------


--
Martial
http://cathemline.org




_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Gilles THIBAULT

Re: routine pour arpèges ou accords

Reply Threaded More More options
Print post
Permalink

>je suis tombé sur un morceau de code nommé rhythm.ly
>qui ressemble furieusement à ce que je cherche,  mais comment
>l'utiliser ?

Je recommande d'utiliser plutôt ce snippet
http://lsr.dsi.unimi.it/LSR/Snippet?id=487
qui fait la même chose que rhythm.ly mais en plus puissant car il copie
aussi les articulations (en autres), et permet d'utiliser des silences dans
le modèle à répeter.

>arpège ( do ) ==> do8 mi sol mi sol mi
>ou bien
>arpège (do mi sol ; 1 2 3 2 3 2 ) ==> do mi sol mi sol mi

Je ne sais pas si les 2 snippets ci-dessus peuvent aider pour ça, car ce
qu'il faudrait plutôt (si  j'ai bien compris), c'est une fonction adaptée de
la function \transpose.
A une époque, j'avais fait des essais autour de cette question (sous les
conseils précieux de Nicolas Sceaux).
On peut faire par exemple comme ceci  :

%%%%%%%%%%%%%%%%%%
\include "italiano.ly"
modele =  \relative {do8 mi sol mi sol mi}

arpege = #(define-music-function (parser location note) (ly:music?)
 (let* (
  (copy-modele  (ly:music-deep-copy modele))
  (from (ly:make-pitch 0 0 0))
  (to (ly:music-property (car (ly:music-property note 'elements)) 'pitch))
  (delta (ly:pitch-diff to from)))
      (ly:music-transpose copy-modele delta)
))

\new Voice {
 \time 3/4
 \arpege do'
 \arpege fa'
 \arpege sol'
 \arpege do'

}
%%%%%%%%%%%%%%

Gilles




_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
Daniel Cartron

Re: routine pour arpèges ou accords

Reply Threaded More More options
Print post
Permalink
In reply to this post by jp lanquetin
Le jeudi 23 avril 2009, jp lanquetin a écrit :
> Avec ma formation de programmeur, je suis persuadé
> qu'on peut dans Lilypond utiliser un système analogue
> aux routines ou sous-programmes

Perso après avoir essayé de comprendre comment utiliser scheme, qui ne me
semble pas simple, j'ai fini par me faire un script (et bientôt d'autres) en
python. Ce n'est pas utilisé directement dans mon code, mais
en "post-production", j'applique le script au fichier en cours et il est
immédiatement modifié selon mes goûts. Pour l'instant j'ai juste écrit celui
qui me permet de générer des voix bidons pour produire des tablatures
d'accordéon diatonique (j'y reviendrai dans le fil dédié une fois le débogage
fini). Comme je travaille avec un éditeur perso (bricolage lourd de kile)
j'ai installé une icône dans la barre d'outil qui me permet de lancer
directement le script sur le fichier courant. Super cool. On peut comme ça
envisager quasiment n'importe quel traitement...

Pourquoi python ? Parce que c'est portable sous tous les OS, que c'est facile
à apprendre (en 1 journée j'ai appris ce qu'il me fallait pour faire mon
script) et qu'on peut faire plein de choses avec.

--
Cordialement, Daniel Cartron
« Pourquoi mépriser les prostituées, ce sont des femmes qui gagnent à être
connues. »
Gavarni




_______________________________________________
liste de diffusion lilypond-user-fr
[hidden email]
http://lists.gnu.org/mailman/listinfo/lilypond-user-fr