Subject: routine pour arpèges ou accords

From: jp lanquetin <[email-masked]>
Date: Thu, 23 Apr 2009 09:55:29 +0200

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
	)
)) 

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

---

From: Martial <[email-masked]>
Date: Fri, 24 Apr 2009 06:47:51 +0200

> qui ressemble furieusement à ce que je cherche,  mais comment

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

---

From: "Gilles THIBAULT" <[email-masked]>
Date: Fri, 24 Apr 2009 10:23:24 +0200

>qui ressemble furieusement à ce que je cherche,  mais comment

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

---

From: Daniel Cartron <[email-masked]>
Date: Sat, 25 Apr 2009 08:33:38 +0200

Le jeudi 23 avril 2009, jp lanquetin a écrit :
> 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