Subject: Bug de LilyPond : \bar "" avec note*a/b

From: Jean ABOU SAMRA <[email-masked]>
Date: Mon, 3 Dec 2018 18:42:24 +0100

Bonjour,
Je rencontre une erreur de LilyPond en mélangeant deux constructions utilisées assez rarement : d'une part, placer une barre de mesure vide \bar "" à la toute fin d'un morceau, d'autre part, toujours à la fin, rallonger explicitement la durée d'une note en lui adjoignant une fraction : c1*a/b .

Mon exemple minimal se trouve à la fin de ce message.

Je suis parvenu à ce problème en recopiant une pièce sans barres de mesures. Les sauts de page pouvaient apparaître n'importe où, ce qui m'a poussé à définir "|" = \bar "" pour l'indiquer plus facilement. J'ai utilisé des variables, à la fin desquelles j'ai mis des | pour autoriser le saut de page. En terminant mon morceau par une de ces variables, j'ai rencontré le problème.

Auriez-vous des idées pour résoudre le bug ? (Je présume que c’en est un à cause du message « erreur de programmation ».) Je ne pense pas que ce soit un comportement voulu de LilyPond, y a-t-il des moyens de le contourner ?

Ce serait encore mieux si le problème pouvait être résolu dans une future version, ou si au moins le message pouvait être plus clair.

Merci de votre aide,
Jean Abou Samra.

%%%%%%%%%%%
% Jean Abou Samra -- [email-masked]
% exemple minimal d'un bug de LilyPond

\version "2.18.2"

%{
Dans cet exemple, LilyPond donne un message d'erreur :
    erreur de programmation : Loose column does not have right side to attach to.
    poursuite ; croisons les doigts.

De plus, les lignes de la première portée sont orientées vers la gauche de la page.  
%}

% aucune erreur en plaçant les portées en dehors d'un StaffGroup
\new StaffGroup <<
    \new Staff {
        % le problème semble provenir de la barre de mesure vide en fin de morceau
        % en ajoutant une note juste après, le problème disparaît
        c'1 \bar ""
    }
    \new Staff {
        % le problème se produit dès que la durée de la note excède une mesure complète
        % en ajoutant une note juste après,
            % le message persiste
            % mais la première portée est orientée correctement
        d'1*9/8
    }

---

From: Valentin Villenave <[email-masked]>
Date: Mon, 3 Dec 2018 19:23:31 +0100

On 12/3/18, Jean ABOU SAMRA <[email-masked]> wrote:
> Je rencontre une erreur de LilyPond en mélangeant deux constructions
> utilisées assez rarement : d'une part, placer une barre de mesure vide \bar
> "" à la toute fin d'un morceau, d'autre part, toujours à la fin, rallonger
> explicitement la durée d'une note en lui adjoignant une fraction : c1*a/b .

Bonjour,
intéressant. Votre exemple peut d’ailleurs même être résumé encore
plus succinctement :
<<
  { c'2 \bar "" }
  { d'2. }
(Et cela se vérifie même en intervertissant les deux portées.)
C’est un bug connu, je viens d’y ajouter votre exemple qui est
effectivement frappant :
https://sourceforge.net/p/testlilyissues/issues/4084/#0d4b
D’une façon générale, LilyPond n’aime guère que des valeurs enjambent
une mesure à la fin de la partition. (D’ailleurs, d’un point de vue
musical je ne crois pas avoir rencontré de situations qui le
nécessitaient ; si vous avez un exemple de partition, ça m’intéresse.)

Si vous avez besoin de ce style de notations, il reste évidemment
possible de changer le contexte dans lequel sont gérées les barres de
mesure, ce qui règle le problème :

\layout {
  \context {
    \Score
    \remove Default_bar_line_engraver
  }
  \context {
    \Staff
    \consists Default_bar_line_engraver
  }
}

Cordialement,
V.V.

---

From: Jean-Jacques Gerbaud <[email-masked]>
Date: Mon, 3 Dec 2018 19:57:30 +0100

>   { d'2. }

Il faut chercher... et trouver !

Si on enlève le point de d'2(.) à la 2ème portée, tout rentre dans l'ordre !

Pas mal, hein ?

-- 

JJG

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 9 Dec 2018 20:02:16 +0100

On 12/9/18, Jean ABOU SAMRA <[email-masked]> wrote:
> Bonjour,
> Merci pour vos réponses rapides.

De rien ; n’oubliez pas d’inclure la liste si vous souhaitez que la
discussion puisse se prolonger de façon plus élargie.

> Pour ce qui est du point ou non de « d2 », il est vrai que de le supprimer
> fait revenir le fonctionnement à la normale. Toutefois, il ne s’agit pas
> d’une faute de frappe mais bien d’un ajout délibéré : il est vrai que
> LilyPond gère la situation lorsque le ré est une blanche, mais il relève du
> bug qu’il échoue à faire la même chose avec une blanche pointée. D’ailleurs,
> selon mes expérimentations,  le problème se produit lorsque la durée du ré
> de la portée du bas devient supérieure à celle du do de la portée du haut
> (testé à l’aide d’un script qui a généré cent partitions et relevé les
> erreurs).

Oui, d’ailleurs peu importe l’ordre des deux portées, le bug se
produit de toute façon.

Plus intéressant : si l’on donne à la commande \bar un argument
qu’elle connaît, le bug n’advient pas.

\bar "|" % -> pas de bug
\bar "||" % -> pas de bug
\bar "|." % -> pas de bug
\bar "n'importequoi" % -> bug
\bar "" % -> bug

C’est ici que réside, à mon sens, le véritable bug : \bar "" est une
syntaxe tout à fait admise et recommandée officiellement, or il se
comporte comme un argument non-reconnu.

> Pour ce qui est de trouver un exemple de musique où l’on a besoin de notes
> qui chevauchent une mesure à la fin du morceau, voici un aperçu du genre de
> musique sur lequel je travaillais :
>
> \version "2.18.2"
> % exemple où l'on a besoin d'une note à cheval sur deux mesures en fin de
> morceau
> % les deux \omit et le \autoBeamOff peuvent se résumer dans un \cadenzaOn
> % cela évite l’espacement anormal sur la deuxième portée
> % et cela fige la mesure en cours
> <<
>   \new Staff \relative c' {
>     % désactiver l'impression de l'armure et des barres de mesure
>     \omit Staff.TimeSignature
>     \omit Staff.BarLine
>     % désactiver les ligatures automatiques
>     \autoBeamOff
>     f8 e f d e c d d1*15/8
>     \undo \omit Staff.BarLine
>     \bar "|."
>   }
>   \new Staff \relative c' {
>     \omit Staff.TimeSignature
>     \omit Staff.BarLine
>     \autoBeamOff
>     r1*7/8 f8 e f d e c d d1
>     \undo \omit Staff.BarLine
>   }
>>>
>
> Il s’agit d’une notation un peu ancienne transcrite avec des glyphes récents
> (d’où le choix dans l'exemple de la phrase du Dies Iræ). La ronde n’indique
> pas vraiment une durée de huit croches mais une note longue, de durée
> étirable, et l’alignement vertical avec l’autre portée doit indiquer
> l’endroit où l’on reprend.

Oui, c’est exactement ce à quoi sert \cadenzaOn comme vous le faites
remarquer. Sauf que ce que vous faites ici ne correspond pas
exactement à ce que fait \cadenzaOn, comme vous pouvez le voir dans le
fichier property-init.ly dans le répertoire ly/ de votre installation
de LilyPond :

cadenzaOn  = \set Timing.timing = ##f

cadenzaOff = \set Timing.timing = ##t

cadenzaOn a pour effet de désactiver entièrement (et pour toutes les
voix, toutes les portées) le compteur de temps et de mesures ; il n’y
a donc plus de barres de mesure ni de ligatures.

> Notez bien que dans cet exemple, les mesures sont bien présentes, même si
> l’on a désactivé l’affichage de l’armure et des barres de mesure. Pour
> preuve, il y a un espace anormal sur la deuxième portée entre la première et
> la deuxième croche, à l’endroit où l’on devrait normalement trouver une
> barre de mesure.

Cet inconvénient ne se produirait pas avec cadenzaOn, comme vous
l’avez fait remarquer. Une autre possibilité serait d’enlever
complètement le graveur de barres de mesure (ce qui n’affecte pas la
double barre finale) :

\layout {
  \context {
    \Score

> Néanmoins, le bug constaté semble provenir de causes plus profondes que le
> chevauchement d’une mesure en fin de morceau, comme le montre la
> constatation plus haut : dans la nouvelle formulation proposée — qui est
> effectivement étonamment simple — le ré blanche pointée ne traverse pas la
> mesure à 4/4. De plus, j’avais été confronté au problème en utilisant
> \cadenzaOn plutôt que les deux \omit , or la commande \cadenzaOn est censée
> figer la mesure en cours, donc pas de chevauchement de mesure.

Donc si je comprends bien, vous avez besoin que les mesures existent
quand même, sans qu’on n’en voie aucune trace ? (Quid des numéros de
mesure en début de système, par exemple ?)

Posé comme cela, il me semble que le problème est moins d’adapter la
durée des rondes que celle des croches, de façon à les faire rentrer
dans des mesures à 4 temps, comme ceci :

  f8*8/7 e f d e c d d1

Ou bien en utilisant \scaleDurations :

<<
  \new Staff \relative c' {
    \omit Staff.TimeSignature
    \omit Staff.BarLine
    \autoBeamOff
    \scaleDurations 8/7 {f8 e f d e c d} d1*2
    \scaleDurations 8/9 {f8 g f e d c e f e} d1*2
    \undo \omit Staff.BarLine
    \bar "|."
  }
  \new Staff \relative c' {
    \omit Staff.TimeSignature
    \omit Staff.BarLine
    \autoBeamOff
    r1
    \scaleDurations 8/7 {f8 e f d e c d} d1
    r
    \scaleDurations 8/9 {f8 g f e d c e f e} d1
    \undo \omit Staff.BarLine
  }

D’ailleurs je viens d’ajouter le snippet suivant sur le LSR, qui
offrirait une fonction encore plus simple d’utilisation que
\scaleDurations :

\scaleToLength 1 {f8 e f d e c d}

http://lsr.di.unimi.it/LSR/Item?id=1077

En tout cas puisque vous n’utilisez pas \cadenzaOn, vous avez la
possibilité d’utiliser bel et bien les mesures à quatre temps pour la
synchronisation verticale entre les voix, mais en adaptant ce qui se
passe à l’intérieur plutôt que de laisser les barres de mesure
(invisibles ou non) tomber au milieu des croches.

Cordialement,
V. Villenave.

---

From: Jean ABOU SAMRA <[email-masked]>
Date: Sun, 9 Dec 2018 20:29:10 +0100

> Début du message réexpédié :
> 
> De: Jean ABOU SAMRA <[email-masked]>
> Objet: Rép : Bug de LilyPond : \bar "" avec note*a/b
> Date: 9 décembre 2018 à 17:59:50 UTC+1
> À: Jean-Jacques Gerbaud <[email-masked]>, Valentin Villenave <[email-masked]>
> 
> Bonjour,
> Pour ce qui est du point ou non de « d2 », il est vrai que de le supprimer fait revenir le fonctionnement à la normale. Toutefois, il ne s’agit pas d’une faute de frappe mais bien d’un ajout délibéré : il est vrai que LilyPond gère la situation lorsque le ré est une blanche, mais il relève du bug qu’il échoue à faire la même chose avec une blanche pointée. D’ailleurs, selon mes expérimentations,  le problème se produit lorsque la durée du ré de la portée du bas devient supérieure à celle du do de la portée du haut (testé à l’aide d’un script qui a généré cent partitions et relevé les erreurs).
> 
> Pour ce qui est de trouver un exemple de musique où l’on a besoin de notes qui chevauchent une mesure à la fin du morceau, voici un aperçu du genre de musique sur lequel je travaillais :
> 
> \version "2.18.2"
> % exemple où l'on a besoin d'une note à cheval sur deux mesures en fin de morceau
> Il s’agit d’une notation un peu ancienne transcrite avec des glyphes récents (d’où le choix dans l'exemple de la phrase du Dies Iræ). La ronde n’indique pas vraiment une durée de huit croches mais une note longue, de durée étirable, et l’alignement vertical avec l’autre portée doit indiquer l’endroit où l’on reprend.
> 
> Notez bien que dans cet exemple, les mesures sont bien présentes, même si l’on a désactivé l’affichage de l’armure et des barres de mesure. Pour preuve, il y a un espace anormal sur la deuxième portée entre la première et la deuxième croche, à l’endroit où l’on devrait normalement trouver une barre de mesure.
> 
> Néanmoins, le bug constaté semble provenir de causes plus profondes que le chevauchement d’une mesure en fin de morceau, comme le montre la constatation plus haut : dans la nouvelle formulation proposée — qui est effectivement étonamment simple — le ré blanche pointée ne traverse pas la mesure à 4/4. De plus, j’avais été confronté au problème en utilisant \cadenzaOn plutôt que les deux \omit , or la commande \cadenzaOn est censée figer la mesure en cours, donc pas de chevauchement de mesure.
> 
> Merci d’avoir signalé le problème, j’espère que ces considérations vous aideront un tant soit peu.
> 
> Cordialement,
> Jean Abou Samra.
> 
>> Le 3 déc. 2018 à 19:57, Jean-Jacques Gerbaud <[email-masked] <mailto:[email-masked]>> a écrit :
>>

---

From: Jean ABOU SAMRA <[email-masked]>
Date: Sun, 16 Dec 2018 18:08:57 +0100

Bonjour,

Je me rends compte que mon exemple, que j'avais voulu simplifier, n'était peut-être pas très clair.

En fait, la musique est écrite sans barres de mesure, mais, comme vous l'avez deviné, j'aimerais quand même profiter des numéros en début de système dans le but de faciliter le travail de répétition. Ceux-ci seraient incrémentés à chaque croche.
Donc, je ne peux pas utiliser \cadenzaOn car cela arrête complètement le Timing comme vous l'avez bien montré. Je ne peux pas non plus supprimer le "Bar_engraver" car je souhaite avoir malgré tout une double barre à la fin du morceau.

Je préférerais que les rondes s'adaptent aux croches plutôt que l'inverse car ce sont elles qui ont une durée fixe ; si je fais rentrer les séries de croches dans les rondes, comme j'ai des nombres de croches différents à chaque fois, elles ne prennent plus le même espace ; de plus, mettre plusieurs croches dans la même mesure pose des problèmes au niveau des sauts de ligne.
Ayant réfléchi à nouveau au problème et fouillé la documentation, j'ai trouvé quelques propriétés d'espacement qui permettent un résultat acceptable.

Mon nouvel exemple se trouve à la fin de ce message.

J'avoue que certaines choses sont un peu tordues mais je n'ai pas trouvé mieux. Il faut :
— définir le chiffrage à 1/8 (pour les numéros de mesure) ;
— le cacher ;
— supprimer les barres de mesure ;
— annuler cette suppression pour la dernière barre de mesure ;
— activer deux propriétés “magiques” du SpacingSpanner pour supprimer l'espace inséré normalement entre deux mesures.

Cordialement,

Jean Abou Samra

\version "2.18.2"
% exemple où l'on a besoin d'une note à cheval sur deux mesures en fin de morceau
% on ne peut pas utiliser \cadenzaOn car on souhaite des numéros de mesure
% on va donc imiter ses effets un par un sans supprimer vraiment les mesures

phraseUne = \relative c' { f8 e f d e c d }
phraseDeux = \relative c' { f8 f g f e d c e f e }

portéeHaut = {
    \phraseUne
    d1*7/8
    \phraseDeux
    d1*10/8
    \phraseUne
    d1*7/8
    \phraseDeux
    d1*11/8
}

portéeBas = {
    s1*7/8
    \transpose d b, \phraseUne
    b1*10/8
    \transpose d b, \phraseDeux
    b1*7/8
    \transpose d b, \phraseUne
    b1*10/8
    \transpose d b, \phraseDeux
    b1*1/8

\layout {
  \context {
    \Staff
    % désactiver l'impression de l'armure
    \omit TimeSignature
    % supprimer les barres de mesure
    \omit BarLine
  }
  \context {
    \Score
    % réglages d'espacement
    \override SpacingSpanner.strict-note-spacing = ##t
    \override SpacingSpanner.uniform-stretching = ##t
  }
}

<<
  \new Staff \relative c' {
    % les numéros de mesure s'incrémenteront à chaque croche
    % de plus, cela fait porter à chaque note ses altérations accidentelles
    % les ligatures automatiques sont désactivées de fait
    \time 1/8
    \portéeHaut
    \undo \omit Staff.BarLine
    \bar "|."
  }
  \new Staff \relative c' {
    \portéeBas
    \undo \omit Staff.BarLine
  }

> Le 9 déc. 2018 à 20:02, Valentin Villenave <[email-masked]> a écrit :
> 
> On 12/9/18, Jean ABOU SAMRA <[email-masked] <mailto:[email-masked]>> wrote:
>> Bonjour,
> fichier property-init.ly <http://property-init.ly/> dans le répertoire ly/ de votre installation
> de LilyPond :
> 
> http://lsr.di.unimi.it/LSR/Item?id=1077 <http://lsr.di.unimi.it/LSR/Item?id=1077>
>

---

From: Valentin Villenave <[email-masked]>
Date: Sun, 16 Dec 2018 19:37:46 +0100

On 12/16/18, Jean ABOU SAMRA <[email-masked]> wrote:
> Je préférerais que les rondes s'adaptent aux croches plutôt que l'inverse
> car ce sont elles qui ont une durée fixe

Dans ce cas, effectivement, \time 1/8 est ce qu’il vous faut.
(Attention, il manque une accolade fermante dans le code que vous avez
posté). Je ne sais pas de quelle façon vous allez travailler pendant
les répétitions, mais je dois avouer que ça me fait un peu bizarre de
voir des numéros de «mesure» en début de système qui augmentent de
façon aussi rapide ; d’où ma suggestion précédente de faire rentrer
les croches dans les rondes plutôt que l’inverse (de cette façon les
numéros ont un peu plus de sens).

La seule suggestion que je pourrais ajouter est d’utiliser quelque chose comme
\override SpacingSpanner.common-shortest-duration = #(ly:make-moment 1)
plutôt que strict-note-spacing, qui est vraiment bête est méchant ;
vous pouvez voir par exemple la différence en fin de système. (Et du
coup pas besoin de uniform-stretching non plus.)

Cordialement,
V. V.