Subject: CC dans le fichier MIDI

From: Christophe Pochon <[email-masked]>
Date: Sun, 30 May 2021 12:06:00 +0200

Bonjour,

Y a-t-il un moyen d'intégrer des messages CC (ModWheel, Expression...) dans
le fichier MIDI généré par Lilypond ?

Je fais en ce moment beaucoup d'exercices d'orchestration et la plupart des
modules de sons d'orchestre symphonique gère les nuances beaucoup plus
finement avec des paramètres de ce type. Cela permet par exemple d'avoir
des crescendi sur des longues notes.

Pour l'instant je demande à Logic Pro X de récupérer les valeurs de
vélocité pour les mettre en valeur CC1 et CC11, mais je me demandais si ce
n'était pas possible de faire en sorte que Lilypond le fasse.

Dans ce contexte, j'ai déjà découvert les commandes midiMinimumVolume =
#0.0 et midiMaximumVolume = #1.0 qui permettent de régler une dynamique
complète et identique pour tous les instruemnts.

Bon dimanche ensoleillé !

Christophe Pochon

---

From: Christophe Pochon <[email-masked]>
Date: Sun, 30 May 2021 12:16:10 +0200

Il semble qu'il fut question de s'occuper de cela en 2016 sur la liste des
développeurs :
https://lists.gnu.org/archive/html/lilypond-devel/2016-01/msg00100.html

Christophe Pochon

Le dim. 30 mai 2021 à 12:06, Christophe Pochon <[email-masked]>
a écrit :

> Bonjour,
>
> Y a-t-il un moyen d'intégrer des messages CC (ModWheel, Expression...)
> dans le fichier MIDI généré par Lilypond ?
>
> Je fais en ce moment beaucoup d'exercices d'orchestration et la plupart
> des modules de sons d'orchestre symphonique gère les nuances beaucoup plus

---

From: Christophe Pochon <[email-masked]>
Date: Sun, 30 May 2021 12:36:03 +0200

J'ai trouvé aussi midiExpression, qui permet d'envoyer du CC 11. On devrait
pouvoir adapter ça pour envoyer d'autres Control Changes, mais je ne trouve
pas où est défini midiExpression.

Christophe Pochon

Le dim. 30 mai 2021 à 12:16, Christophe Pochon <[email-masked]>
a écrit :

> Le dim. 30 mai 2021 à 12:06, Christophe Pochon <
> [email-masked]> a écrit :
>
>> Bonjour,
>>

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 30 May 2021 13:32:24 +0200

Bonjour,

Le 30/05/2021 à 12:06, Christophe Pochon a écrit :
> Je fais en ce moment beaucoup d'exercices d'orchestration et la 
> plupart des modules de sons d'orchestre symphonique gère les nuances 
> beaucoup plus finement avec des paramètres de ce type. Cela permet par 
> exemple d'avoir des crescendi sur des longues notes.
>
> vélocité pour les mettre en valeur CC1 et CC11, mais je me demandais 
> si ce n'était pas possible de faire en sorte que Lilypond le fasse.

Je ne le crois pas, malheureusement, car la sortie MIDI
est implémentée en C++, sans possibilités de personnalisation
en Scheme.

> Dans ce contexte, j'ai déjà découvert les commandes midiMinimumVolume 
> = #0.0 et midiMaximumVolume = #1.0 qui permettent de régler une 
> dynamique complète et identique pour tous les instruemnts.
>

Ensoleillé… Parle pour toi !

> Il semble qu'il fut question de s'occuper de cela en 2016 sur la liste 
> des développeurs : 
> <https://lists.gnu.org/archive/html/lilypond-devel/2016-01/msg00100.html>

En effet, mais il manquait encore de l'infrastructure interne pour
que le code ajouté ne soit pas une casserole à traîner par la suite
(il nous faudrait probablement une notion de Mob, comme les Grobs).

> J'ai trouvé aussi midiExpression, qui permet d'envoyer du CC 11. On 
> devrait pouvoir adapter ça pour envoyer d'autres Control Changes, mais 
> je ne trouve pas où est défini midiExpression.

Tout dépend de ce que tu entends par « adapter » : il faut ajouter
du code C++ et recompiler. En l'occurrence, une recherche :

jean@laptop-jean:~/repos/lilypond$ git grep "midiExpression"
Documentation/ca/notation/input.itely:3715:@funindex midiExpression
Documentation/ca/notation/input.itely:3758:@item @code{Staff.midiExpression}
Documentation/en/notation/input.itely:3773:@funindex midiExpression
Documentation/en/notation/input.itely:3813:@item @code{Staff.midiExpression}
Documentation/es/notation/input.itely:3938:@funindex midiExpression
Documentation/es/notation/input.itely:3982:@item @code{Staff.midiExpression}
Documentation/fr/notation/input.itely:3928:@funindex midiExpression
Documentation/fr/notation/input.itely:3970:@item @code{Staff.midiExpression}
Documentation/it/notation/input.itely:3680:@funindex midiExpression
Documentation/it/notation/input.itely:3718:@item @code{Staff.midiExpression}
Documentation/ja/notation/input.itely:3715:@funindex midiExpression
Documentation/ja/notation/input.itely:3752:@item @code{Staff.midiExpression}
lily/midi-cc-announcer.cc:52:  { "midiExpression", 0.0, 1.0, 11, 43 },
lily/midi-cc-performer.cc:145:                "midiExpression "
scm/define-context-properties.scm:477:     (midiExpression ,number? 
"Expression control for the MIDI

nous mène à midi-cc-announcer.cc :

/*
   Context properties for setting MIDI controls.  Each MIDI control
   specification has the following components:
     1. The name of the LilyPond context property used to change the 
value of
        the MIDI control.
     2. The lower bound for the numeric range of the LilyPond context 
property.
     3. The upper bound for the numeric range of the LilyPond context 
property.
     4. The MIDI control number for setting the most significant 7 bits 
of the
        control value.
     5. The MIDI control number for setting the least significant 7 bits 
of the
        control value, if the control supports 14-bit ("fine") 
resolution.  If
        the control supports only 7-bit ("coarse") resolution, the LSB 
control
        number should be negative.
*/
const Midi_control_change_announcer::Control_spec
Midi_control_change_announcer::controls_[]
=
{
   { "midiBalance", -1.0, 1.0, 8, 40 },
   { "midiPanPosition", -1.0, 1.0, 10, 42 },
   { "midiExpression", 0.0, 1.0, 11, 43 },
   { "midiReverbLevel", 0.0, 1.0, 91, -1 },
   { "midiChorusLevel", 0.0, 1.0, 93, -1 },
   // This element should be kept last in the array.
   { 0, 0.0, 0.0, 0, 0 }
};

En ajoutant des valeurs à ce tableau suivant le même modèle, sans
oublier les définitions dans scm/define-context-properties.scm, on
peut effectivement définir de nouveaux messages CC.

Cordialement,
Jean

---

From: Jacques Menu <[email-masked]>
Date: Sun, 30 May 2021 14:37:13 +0200

> Ensoleillé… Parle pour toi !

Il parle pour moi aussi, je soupçonne que Christophe n’est pas très loin donc…

JM

---

From: Christophe Pochon <[email-masked]>
Date: Sun, 30 May 2021 15:06:40 +0200

Merci pour ces explications Jean !
C'est frustrant de ne pas pouvoir ajouter les autres CC plus facilement. Ou
de pouvoir passer le numéro de CC en paramètre.
Bon, si je peux déjà faire quelque chose avec le midiExpression ça me fera
déjà gagner du temps.
Mais il faudrait que je trouve le moyen de récupérer à tout moment la
valeur de vélocité. J'ai trouvé dans midi.scm les correspondances des
nuances avec les valeurs de vélocité, mais comment et où sont gérés les
accents, crescendi, etc. ? Idéalement j'aimerais créer une fonction qui
ajouterait automatiquement des \set midiExpression = #x.x . Exemple :

musique = \relative c' { c4\p c c-> c\ff c\ppp }

exprMusique = \expr \musique

et le résultat serait que exprMusique contiendrait :

{
    \set midiExpression = #0.55 c4\p c \set midiExpression = #0.60 c-> \set
midiExpression = #0.8 c\ff \set midiExpression = #0.42 c\ppp
}

Mais bon, je crois que je vais continuer à demander à Logic Pro X de gérer
cela :-)

A+

Christophe Pochon

Le dim. 30 mai 2021 à 13:32, Jean Abou Samra <[email-masked]> a écrit :

> > <https://lists.gnu.org/archive/html/lilypond-devel/2016-01/msg00100.html
> >
>

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 30 May 2021 16:53:31 +0200

Le 30/05/2021 à 15:06, Christophe Pochon a écrit :
> C'est frustrant de ne pas pouvoir ajouter les autres CC plus 
> facilement. Ou de pouvoir passer le numéro de CC en paramètre.

C'est ce que devait faire le patch que tu as trouvé, mais il n'était pas 
complet.

> Bon, si je peux déjà faire quelque chose avec le midiExpression ça me 
> fera déjà gagner du temps.
> nuances avec les valeurs de vélocité, mais comment et où sont gérés 
> les accents, crescendi, etc. ?

Les accents sont gérés directement par le Note_performer. Quant aux 
nuances (\p comme \<), elles sont traitées par le Dynamic_performer. 
Leurs codes respectifs sont dans les fichiers lily/note-performer.cc et 
lily/dynamic-performer.cc, dont on peut lire les sources ici par exemple :

https://gitlab.com/lilypond/lilypond/-/blob/master/lily/note-performer.cc

> Idéalement j'aimerais créer une fonction qui ajouterait 
> automatiquement des \set midiExpression = #x.x . Exemple :
>
>     \set midiExpression = #0.55 c4\p c \set midiExpression = #0.60 c-> 
> \set midiExpression = #0.8 c\ff \set midiExpression = #0.42 c\ppp
> }

\version "2.22.0"

#(use-modules (srfi srfi-26))

expr =
#(define-music-function (music) (ly:music?)
    (let ((last-expression #f))
      (music-map
        (lambda (m)
          (if (music-is-of-type? m 'note-event)
              (let* ((articulations (ly:music-property m 'articulations))
                     (dynamics (filter (cute music-is-of-type? <> 
'absolute-dynamic-event)
                                       articulations)))
                (for-each
                  (lambda (d)
                    (set! last-expression
                          (default-dynamic-absolute-volume
                            (ly:music-property d 'text))))
                  dynamics)
                (if last-expression
                    (make-sequential-music
                      (list
                        (make-property-set 'midiExpression last-expression)
                        m))
                    m))
              m))
        music)))

\displayLilyMusic \expr \musique

Note bien les limitations :

- Dans de la musique parallèle << >>, il faudra sans doute l'appliquer à 
chaque tronçon de musique séquentielle { } (pas le temps de tester pour 
le moment),
- Les articulations ne sont pas prises en charge,
- Les crescendi et decrescendi non plus.

> Mais bon, je crois que je vais continuer à demander à Logic Pro X de 
> gérer cela :-)

Sage décision à mon avis.

Cordialement,
Jean