Subject: Arranger.ly dispatch-chords

From: Clement Caillol <[email-masked]>
Date: Sun, 1 Nov 2020 12:07:21 +0100

Bonjour,

merci pour votre réponse, mais ce n'est effectivement pas ce à quoi je 
pensais.

Je vais essayer d'être plus clair. En fait ma question est assez générale :

quel est le meilleur moyen pour passer d'une musique en accords, 
éventuellement même une réduction harmonique, à une orchestration 
complexe, ou chaque instrument ne joue pas toujours la même note de 
l'accord (par exemple le cor ne jouera pas toujours la 3è note, parfois 
la 2è, la 4è)

pour l'instant j'ai essayé deux solutions.

La première c'est de n'avoir qu'un accord dans chaque musique :

chordI= {<c c' e' g' c'' e'' c'''>4 r4 r2}
chordII= {<g b d' g' b' d'' b'' d'''>4 r4 r2}
chordIII= {<fis a d' a' c'' d'' a'' c'''>4 r4 r2}

#(begin
   (dispatch-chords '(fl1 (fl2 htb1) (htb2 tp1) cor1 tp2 (fag1 cor2) 
fag2) 21 chordI)
   (dispatch-chords '(fl1 fl2 (htb1 tp1) htb2  tp2 (cor1 fag1) fag2 
cor2) 23 chordII)
   (dispatch-chords '(fl1 fl2 (tp1 tp2) htb1 htb2 (cor1 cor2) fag1 fag2 
) 25 chordIII)

   )

La deuxième c'est d'écrire mes accords avec les notes déjà organisées 
orchestralement :

chords = {<g d' g' d''  d d' g' b' b'' d'''>1 <c' d' c'' d''  d d' fis' 
c'' a'' c''' >
           <g d' g' d'' g d' g' b' g'' b''>4 r4 r2}

#(begin

     (dispatch-chords (lst vents) 52 chords)

)

La première ne me semble pas économe et très redondante, et la deuxième 
m'embête car elle est très opaque, on ne voit pas du tout 
l'orchestration en un coup d’œil.

en gros je cherche quelque chose du genre :

chords = {<c e g> <c f a> <c e g> <b, d g>}

#(begin

     (multi-dipatch-chords (orchestrationAccrd1 orchestrationAccord2 
orchestrationAccord3 orchestrationAccord4) 52 chords)

)

A la limite j'aimerais bien coder la fonction en question, mais je n'ai 
pas encore les skills...

Merci !

Le 28/10/2020 à 22:51, Gilles Thibault a écrit :
> Le 2020-10-28 17:50, Clément CAILLOL a écrit :
>> Encore bonjour,
>>
>> J'ai une question à poser à ceux qui utilisent la bibliothèque 
>> arranger.ly.
>>
>> Est-ce que vous connaissez un moyen pour faire la même chose que la
>> fonction dispatch-chords, mais avec la possibilité de spécifier
>> l'orchestration de chaque accord contenu dans la musique qu'on veut
>> dispatcher ?
>>
>> Par exemple, si j'ai une musique avec quatre accords, et que je veux
>> les dispatcher de quatre manières un peu différentes entre mes
>> instruments.
>>
>> Merci !
>>
>> Bien cordialement,
>>
>> Clément Caillol
>
> Hum, un petit exemple de ce que vous voulez faire serait le bienvenu.
> On peut par exemple renverser chaque accord par la fonction reverse-chords
> (p17 de l'aide
> http://gillesth.free.fr/Lilypond/arranger-docs/arrangerDoc-fr.pdf )
> mais c'est probablement pas ça que vous souhaitez.
>

---

From: Gilles Thibault <[email-masked]>
Date: Mon, 02 Nov 2020 15:01:01 +0100

>   (dispatch-chords '(fl1 fl2 (tp1 tp2) htb1 htb2 (cor1 cor2) fag1 fag2

Bon moi pour le moment, j'ai toujours fait en adaptant l'accord à la 
liste d'instrument mais je reconnais qu'il faut effectivement beaucoup 
se concentrer quand l'orchestration est importante.
Ci dessous 2 methodes pour adapter la liste d'instruments à chaque 
accord. La méthode 2 devrait ressembler à ce que vous demandez. La 
méthode 1 est celle que vous avez donnée, et est là pour vérifier que la 
2 produit le même résultat.
À expérimenter et probablement améliorer.

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

\version "2.20.0"
\include "arranger.ly"

%%%%%%%%%%%%%% Préparation

#(define* (part-combine-instru instru1 instru2 #:optional (clef 
"treble"))
(sim  ; << ... >>
   (make-clef-set clef)
   global
   #{ \set Staff.instrumentName = \markup \center-column {
          #(symbol->string instru1)    % 'fl1 -> "fl1"
          #(symbol->string instru2)
          } #}
   (part-combine (obj->music instru1)  ; 'fl1 -> \fl1
                 (obj->music instru2))))

global = s1*10
vents = #'(fl1 fl2 htb1 htb2 fag1 fag2 tp1 tp2 cor1 cor2)
#(init vents)

%%%%%%%%%%%%%% méthode accord par accord

#(begin
   (dispatch-chords '(fl1 (fl2 htb1) (htb2 tp1) cor1 tp2 (fag1 cor2) 
fag2) 2 chordI)
   (dispatch-chords '(fl1 fl2 (htb1 tp1) htb2  tp2 (cor1 fag1) fag2 cor2) 
3 chordII)
   (dispatch-chords '(fl1 fl2 (tp1 tp2) htb1 htb2 (cor1 cor2) fag1 fag2 ) 
4 chordIII)
   )

\markup "méthode accord par accord"
{ <<
   \new Staff $(part-combine-instru 'fl1 'fl2)
   \new Staff $(part-combine-instru 'htb1 'htb2)
   \new Staff $(part-combine-instru 'tp1 'tp2)
   \new Staff $(part-combine-instru 'cor1 'cor2)
   \new Staff $(part-combine-instru 'fag1 'fag2 "bass")

>> }

%%%%%% méthode tous les accords dans une seule musique
#(init vents) % efface le travail précédent
chords = { \chordI \chordII \chordIII } % les accords mis à la suite

#(begin
(for-each
    (lambda(instrus where chord)
       (dispatch-chords instrus where chord))
     ;; une liste de liste d'instruments
    '((fl1 (fl2 htb1) (htb2 tp1) cor1 tp2 (fag1 cor2) fag2)
      (fl1 fl2 (htb1 tp1) htb2  tp2 (cor1 fag1) fag2 cor2)
      (fl1 fl2 (tp1 tp2) htb1 htb2 (cor1 cor2) fag1 fag2))
    '(2 3 4)  ; la liste des positions pour chaque accords.
              ; On peut mettre aussi : (iota 3 2)
    (extract-named-music chords 'EventChord)) ; liste des accords 
(fonction Lilypond)
;; On doit maintenant mettre le bon rythme aux accords.
;; Ici on récupère celui de chords mais on peut créer son propre pattern
(apply-to vents (set-pat chords #t) 2 5)
)

\markup "méthode tous les accords dans une seule musique"
{ <<
   \new Staff $(part-combine-instru 'fl1 'fl2)
   \new Staff $(part-combine-instru 'htb1 'htb2)
   \new Staff $(part-combine-instru 'tp1 'tp2)
   \new Staff $(part-combine-instru 'cor1 'cor2)
   \new Staff $(part-combine-instru 'fag1 'fag2 "bass")

>> }

-- 
Gilles

---

From: Clément CAILLOL <[email-masked]>
Date: Mon, 2 Nov 2020 16:18:52 +0000

Merci beaucoup ! Je vais essayer de comprendre comment ça fonctionne, et je vais utiliser ça !

Clément Caillol

________________________________
From: Gilles Thibault <[email-masked]>
Sent: Monday, November 2, 2020 3:01:01 PM
To: Clement Caillol <[email-masked]>
Cc: [email-masked] <[email-masked]>; lilypond-user-fr <lilypond-user-fr-bounces+gillesth=[email-masked]>
Subject: Re: Arranger.ly dispatch-chords

\version "2.20.0"
\include "arranger.ly"

global = s1*10

#(begin

#(begin
(for-each

--
Gilles

---

From: Gilles Thibault <[email-masked]>
Date: Wed, 04 Nov 2020 00:54:04 +0100

> Merci beaucoup ! Je vais essayer de comprendre comment ça fonctionne,
Bon finalement il semble qu'une fonction multi-dispatch-chords est 
possible.
J'essaierai de la tester dans mes arrangements pour voir si on peut 
l'intégrer à arranger.ly

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.20.0"
\include "arranger.ly"

#(define* (part-combine-instru instru1 instru2 #:optional (clef 
"treble"))
"Combine 2 instruments in 1 part"
(sim  ; << ... >>
   (make-clef-set clef)
   global
   #{ \set Staff.instrumentName = \markup \center-column {
          #(symbol->string instru1)    % 'fl1 -> "fl1"
          #(symbol->string instru2)
          } #}
   (part-combine (obj->music instru1)  ; 'fl1 -> fl1
                 (obj->music instru2))))

global = s1*5
#(init '(fl1 fl2 htb1 htb2 fag1 fag2 tp1 tp2 cor1 cor2))

%%%%%%%%%%%%%% multi-dispatch-chords

#(define (multi-dispatch-chords list-of-instrus-list where-pos 
music-with-chords)
"Dispatches chord 1 of music-with-chords into the instruments of the 
first list of
list-of-instrus-list, then goes on with the 2nd chord and the 2nd list 
etc..."
(let((n (pos:num where-pos))) ; arranger.ly internal func: '(7 4 2) -> 7
   (let loop ((chords-list (extract-named-music music-with-chords 
'EventChord))
              (instr-list list-of-instrus-list)
              (mom (pos:remain where-pos))) ; '(7 4 2) -> <mom 1/4> + 
<mom 1/2>
     (if (and (pair? chords-list)
              (pair? instr-list))
       (let((instrus (car instr-list))
            (chord (car chords-list)))
          (dispatch-chords instrus (list n mom) chord)
          (loop (cdr chords-list)
                (cdr instr-list)
                (ly:moment-add mom (ly:music-length chord))))
       (apply-to (delete-duplicates (flat-lst list-of-instrus-list) eq?) 
; minimum list
                 (set-pat music-with-chords #t) ; rhythm pattern applied 
to each instru
                 where-pos (list n mom))))))    % from to parameters

#(multi-dispatch-chords
   '((fl1 (fl2 htb1) (htb2 tp1) cor1 tp2 (fag1 cor2) fag2)
     (fl1 fl2 (htb1 tp1) htb2  tp2 (cor1 fag1) fag2 cor2)
     (fl1 fl2 (tp1 tp2) htb1 htb2 (cor1 cor2) fag1 fag2))
   2
   #{ <c c' e' g' c'' e'' c'''>4 r r2
      <g b d' g' b' d'' b'' d'''>4 r r2
      <fis a d' a' c'' d'' a'' c'''>4 r r2
   #})

\markup "multi-dispatch-chords"
{ <<

-- 
Gilles