Problème de rendu lorsqu'un R2 est en premier instrument?

Bonsoir à tous,

J'ai un comportement plutôt étrange au rendu pdf d'un conducteur: une des mesures 2/4 est gravée comme suit: image

(Je détaille ici les étapes que j'ai suivies pour expliquer; si vous voulez la conclusion directement, elle est décrite en gras au tout dernier point)

J'ai fait un certains nombres d'essais pour tenter de circonscrire le problème, et voici ce qui en ressort.

  • Dans la structure du conducteur, je commentant les groupes d'instruments les uns après les autres, et seul commenter le groupe flûtes+hanches doubles induit une gravure correcte; dans le groupe en question, il faut commenter les 2 flûtes pour que la gravure soit correcte. Donc le problème semble venir des flûtes
    Sauf que le problème est bien plus compliqué que cela...

Je poursuis les tests:

  • Je réplique l'intégralité des notes d'un autre instrument (clarinette I) sur les flûtes => le problème disparaît. Donc il s'agit bien d'un problème dans l'écriture des parties.
  • Je réplique les notes clarinette I jusque juste avant la partie problématique, et laisse les instruments avec leur écriture propre à partir de là: le problème subsiste => ce n'est pas un problème caché qui se manifeste plus loin: la source du problème est bien là où il apparaît visuellement (oui, j'ai vécu dans un monde où printf plantait 1000 lignes plus bas que le débordement mémoire :wink: ).
  • Note intéressante: La clarinette II a le même schéma de partition, mais ne pose aucun problème. Par contre si je la mets en premier instrument, la gravure fautive survient. => Il semble qu'il y ait un problème de positionnement en plus.
  • L'écriture est apparemment banale, et ne concerne que des silences: R1*3 R2 R1, ou R1*9/2, donnent le même résultat.
  • J'opte pour l'écriture R1*3 R2 R1 plutôt que R1*9/2 et je me concentre sur les 2 parties de flûtes; je définis les variables d'événement suivantes:
    • Écriture des silences: R2 ou r2 pour fluteI et fluteII
    • ordre des parties dans le pupitre de flutes: fluteI puis fluteII ou fluteII puis fluteI.
  • Enfin je dénombre les combinatoires possibles, la conclusion (appuyée par l'image plus bas) est la suivante:
    • Le problème survient en fait lorsque la première voix à apparaître sur le conducteur contient le silence sous la forme R2. À partir du moment où le silence est sous la forme r2, le problème disparaît pour tous les instruments du conducteur (n'importe quel instrument plus bas peut contenir R2, la gravure se fera correctement.

Est-ce que quelqu'un connaît ce comportement? Y a-t-il un contournement, à part le r2 qui n'est pas super esthétique?

Bonne soirée à tous!
Emmanuel

Résultat combinatoire

Bonjour Emmanuel,

Face à un problème de ce genre, la procédure usuelle est d'essayer de recréer un fichier lilypond minimaliste, sans aucune dépendance, qui mette l'inconvénient en évidence, et de fournir le code de ce fichier en mode texte dans votre message, afin que tout un chacun puisse simplement le copier-coller dans son éditeur et constater qu'il s'agit bien d'un problème propre à lilypond et non à votre configuration. Cela simplifie également les recherches de contournement.

Bien à vous,

Ben

Bonjour Emmanuel

Il me semble que le R2 doit être précédé par un changement de métrique, de même que le R1 qui le suit, sinon lilypond ne peut pas placer de barre de mesure.
R1*3 \time 2/4 R2 \time 4/4 R1
devrait résoudre le problème.

Sébastien

Bonsoir à tous,

(pour la solution, sauter à Solution de l'énigme)

Je réponds de façon globale pour la mémoire et la clôture de ce thread avec la solution.

Tout d'abord, merci @Ben pour le rappel de la procédure: mon problème était que je suspectais que le bug n'était pas un bug direct, mais le résultat d'un entremêlât de conjonctures qui conduisaient au problème; de ce fait, construire un fichier minimaliste me semblait hors de portée. Désolé donc.

@Seb79 , merci pour ta réponse : le \time 2/4 était dans la partie structure, le problème ne venait pas de là. Ce qui corrobore la remarque de @Ben: donner l'exemple clé en main aurait évité de t'induire en erreur. My bad. Mais encore une fois, je ne voyais pas comment je pouvais proposer un extrait minimaliste. Si quelqu'un a une méthodologie pour arriver à construire un tel exemple minimaliste pour un bug complexe, je suis preneur.

Enfin et surtout, un immense merci à @LucDR qui a pris sur ses vacances pour éplucher un code dont il n'a pas l'habitude (on a des philosophies de codage vraiment différentes :wink: ), dérouler les différentes pelotes d'\include et enfin trouver la racine du problème, qui n'était ni sur la flûteI, ni sur la flûteII, mais bien sur... le piano (26e staff du conducteur !!! :open_mouth: )

Solution de l'énigme: c'est un bug que j'ai en plus déjà eu sur Lilypond, qui vient les problèmes que peuvent poser les \acciaccatura lors d'une rupture de structure (\bar, \time, etc.).
Luc m'a rappelé la méthode pour ne pas avoir le pb: s'assurer que la structure "couvre" l'\acciaccatura par un \grace de même longueur de la structure.

J'avoue que j'ai adopté une autre stratégie: j'ai enlevé l\acciaccatura en question, et ce pour 2 raisons:

  1. Il était vraiment optionnel à l'exécution, et m'en passer me simplifie la vie.
  2. Je ne suis vraiment pas à l'aise avec ce comportement de Lilypond: la partie DevNull (qui contient la structure abstraite du morceau) donne les éléments constitutifs de la partition, sur lesquels chaque Staff va s'appuyer. Elle a donc une valeur globale. Au contraire, l'\acciaccatura a une valeur d'exception, qui ne prend pas sur la longueur du morceau, mais s'insère localement dans la partie en question.
    Pour le dire de façon imagée, le Staff se débrouille en interne pour "caler l'\acciaccatura" dans ses valeurs normales.
    Devoir déclarer un \grace dans la structure globale n'a aucun sens.
    Pire encore, le fait de devoir déclarer le \grace dans la structure pour satisfaire la partie de piano devrait mettre en rogne lilypond pour toutes les autres parties qui ne "respectent" pas l'\acciaccatura. Il y a donc à mon sens quelque chose d'illogique là-dedans.

Ce qui fait que, sauf à avoir un besoin vital de l'\acciaccatura, je ferai sans doute le choix de ne pas l'utiliser, ce qui m'évitera d'aliéner la partie structure, qui devrait être selon moi le socle en marbre sur lequel on peut compter pour caler proprement les différentes parties.

Voilà pour l'explication, la solution, et mon malaise devant cette solution. :wink:

Après il est tout à fait possible que mon malaise vienne du fait qu'il y a une partie de la philosophie de Lilypond que je n'aurais pas comprise.

Merci encore à @LucDR , à tous ceux qui ont répondu.
Bonne fin de soirée!

Bonjour Emmanuel,

La procédure peut paraître fastidieuse, mais en réalité elle est assez rapide même sur un gros projet:

  1. Vous dupliquez le projet
  2. Vous supprimez dans le duplicata une première moitié de code qui vous paraît innocente du problème et non destructrice à une bonne compilation
  3. Vous compilez: si le bug est encore présent, vous dupliquez le duplicata et vous refaites la procédure avec le nouveau duplicata. Si le bug n'est plus présent, vous revenez à la dernière version, vous la dupliquez et vous supprimez de manière plus prudente.

S'il faut une dizaine de duplicatas pour isoler le problème, ce qui peut être réaliste même sur un très gros projet, et que la procédure d'un duplicata (copie, suppression, compilation) dure une minute, cela prendra dix minutes, soit souvent moins de temps que de se prendre la tête avec un long message sur un forum.

Mais l'essentiel est que quelqu'un ait pu vous dépanner avec succès.

Bien à vous,

Ben

Merci beaucoup @Ben ! Je connais la procédure dichotomique, je viens d'une culture C (même pas ++) :wink: Vu que mon projet compte, 6 répertoires et une 30aine de fichiers inclus, je pense que j'espérais un miracle du type DWIM...

Mais vous avez raison, la procédure dicho est la plus efficace, même si fastidieuse.
Le seul point que je contesterai ici est la définition de "semble innocent", parce que, dans un cas comme celui-là, le diable s'habille en nénuphar, et se cache dans la fourberie de l'innocuité des détails innocents:laughing:

Merci encore pour l'échange! :folded_hands: