Subject: [Scheme] Voix séparées ou ensemble - suite

From: Olivier Miakinen <[email-masked]>
Date: Sat, 11 Nov 2017 14:05:12 +0100

Bonjour,

Il y a quelques jours je demandais comment concilier l'affichage
d'une partition avec le rendu MIDI, dans le cas où une voix se
partage parfois en deux sur une seule portée, mais que je veux
faire deux fichiers MIDI séparés, un pour chaque voix.

J'en suis venu à créer quatre fonctions, \upSplit et \downSplit
pour saisir les notes du haut et du bas quand les voix se
séparent, et \upTogether et \downTogether quand elles se
rejoignent. Le résultat est ici : <http://lilybin.com/bw68to/3>.

Ce qui m'embête, c'est que la fonction \downTogether a besoin
de deux paramètres, l'un étant la musique à afficher, et l'autre
une série de \skip ou s de même durée.

Définition :
  downTogether = #
  (define-music-function
   (parser location musique silence) (ly:music? ly:music?)
   #{
     \voiceTwo
     \tag #'midi $musique
     \tag #'print $silence
   #})

Usage :
  \downTogether { c''8 r f' r f'' r g' r } { s1 }

Aussi, je me demande s'il n'y a pas moyen en Scheme de lui passer une
expression musicale et qu'il remplace cette expression en une série
de \skip de durée équivalente.

Par exemple, en lui passant { c''8 r f' r f'' r g' r }, il pourrait
retourner { s1 } ou (ce qui revient au même) { s8 s s s s s s s }.

Cordialement,
-- 
Olivier Miakinen

---

From: Olivier Miakinen <[email-masked]>
Date: Tue, 14 Nov 2017 22:53:51 +0100

Le 11/11/2017 14:05, j'écrivais :
>
> [...] je me demande s'il n'y a pas moyen en Scheme de lui passer une

En cherchant dans le répertoire scm, je crois que j'ai trouvé ce dont
j'ai besoin dans le fichier music-functions.scm :

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-public (skip-of-length mus)
  "Create a skip of exactly the same length as @var{mus}."
  (let* ((skip
          (make-music
           'SkipEvent
           'duration (ly:make-duration 0 0))))

    (make-event-chord (list (ly:music-compress skip (ly:music-length
mus))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Mais c'est une fonction définie par define-public et non par
define-music-function. Est-ce que je peux l'appeler directement
depuis lilypond, ou bien est-ce que je dois l'enrober d'une
manière ou d'une autre ?

---

From: Olivier Miakinen <[email-masked]>
Date: Wed, 15 Nov 2017 01:15:48 +0100

Le 14/11/2017 22:53, j'écrivais :
> [...]

Je pense que j'ai résolu mon petit problème, en tout cas ceci semble
fonctionner :

=====================================================================
\version "2.18.2"

silence = #(define-music-function
            (parser location musique) (ly:music?)
            (skip-of-length musique))

notes = { a'4 b'8. c''16 d''2 }

<<
  { \notes | \notes | \silence \notes | }
  \\
  { \notes | \silence \notes | \notes | }
=====================================================================

De même qu'avec ça :

=====================================================================
silence = #(define-music-function
            (parser location musique) (ly:music?)
            #{
              #(skip-of-length musique)
            #})
=====================================================================

---

From: Olivier Miakinen <[email-masked]>
Date: Wed, 15 Nov 2017 01:52:38 +0100

Le 15/11/2017 01:15, Olivier Miakinen a écrit :
> 
> Je pense que j'ai résolu mon petit problème [...]

Je dirais même plus :

http://lilybin.com/bw68to/4

Lorsqu'un passage est commun à \voiceOne et \voiceTwo, il
suffit de le mettre à l'identique dans les deux parties,
pour l'un comme paramètre à \voiceOneWithTwo, pour l'autre
comme paramètre à \voiceTwoWithOne. Ensuite la partition
pour impression sera précédée d'un \keepWithTag #'print
tandis que celle pour le midi aura un \keepWithTag #'midi.