Subject: [LilyPond] extraire position graphique des notes dansles images générées

From: Franck Revolle via LilyPond <[email-masked]>
Date: Mon, 21 Apr 2025 20:12:36 +0000

Pour connaitre ls positions graphiques des notes dans les fichiers PNG générés par Lilypond, j'ai fait ce contournement assez complexe. Peut-être qu'il existe une méthode plus rapide ?
*Ligne de commande :
        lilypond.exe -dinclude-settings=event-listener.ly -dseparate-page-formats=pdf,png myscore.ly
Cette command génère un fichier PDF et PNG par page, avec le event-listener.ly standard de lilypond qui dumpe les événements compilés et leur point-click
* Analyse des fichiers PDF 
Elle permet de lire les positions graphiques et leur point-click. Exemple avec un point-click 128:5:6
    <<...Rect [402.632 226.067 410.763 232.778] ... myscore.ly:128:5:6)>>
* les point-click en pivot
Les point-click servent de jointure entre :
     - la position dans la partition source lilypond
     - les événements compilés par lilypond dans le event-listerner
     - la position graphique dans les pages générés par Lilypond dans le PDF
* coordonnées PNG
Les coordonnées dans le PDF doivent être converties par règle de 3 ( taille PNG / taille PDF), car ce rapport change avec la résolution PNG demandée.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/extraire-position-graphique-des-notes-dansles-images-generees/5895/1).

Pour créer un nouveau sujet, écrivez à [[email-masked]](mailto:[email-masked]) ou visitez la [page d'accueil de lilypond.community](https://lilypond.community).

---

From: Michel Guénard via LilyPond <[email-masked]>
Date: Tue, 22 Apr 2025 10:52:14 +0000

[quote="frevolle, post:1, topic:5895, full:true"]
Pour connaitre ls positions graphiques des notes dans les fichiers PNG générés par Lilypond, j'ai fait ce contournement assez complexe. Peut-être qu'il existe une méthode plus rapide ?
*Ligne de commande :
lilypond.exe -dinclude-settings=event-listener.ly -dseparate-page-formats=pdf,png myscore.ly
Cette command génère un fichier PDF et PNG par page, avec le event-listener.ly standard de lilypond qui dumpe les événements compilés et leur point-click

* Analyse des fichiers PDF
Elle permet de lire les positions graphiques et leur point-click. Exemple avec un point-click 128:5:6
<<...Rect [402.632 226.067 410.763 232.778] ... myscore.ly:128:5:6)>>
* les point-click en pivot
Les point-click servent de jointure entre :
  * la position dans la partition source lilypond
  * les événements compilés par lilypond dans le event-listerner
  * la position graphique dans les pages générés par Lilypond dans le PDF
* coordonnées PNG
Les coordonnées dans le PDF doivent être converties par règle de 3 ( taille PNG / taille PDF), car ce rapport change avec la résolution PNG demandée.
[/quote]

la réponse de l'IA qui pointe vers la documentation de lilyplayer
Points Clés

* Il semble probable qu'une méthode plus rapide existe pour obtenir les positions graphiques des notes dans les fichiers PNG générés par LilyPond, en utilisant la sortie SVG.

* La sortie SVG contient des coordonnées vectorielles exactes, ce qui simplifie l'extraction des positions par rapport à votre méthode actuelle.

* Vous devrez peut-être générer SVG et PNG séparément, car les formats nécessitent des exécutions distinctes de LilyPond.

---

Réponse Directe

Introduction

Votre méthode actuelle pour obtenir les positions graphiques des notes dans les fichiers PNG générés par LilyPond semble complexe, car elle implique l'analyse de fichiers PDF et des conversions. Heureusement, il existe une approche plus simple et rapide.

Utilisation de la Sortie SVG

Vous pouvez générer un fichier SVG avec la commande suivante :

```
lilypond -dbackend=svg myscore.ly
```

Le fichier SVG contient les coordonnées exactes de chaque élément graphique, comme les têtes de notes, sous forme vectorielle. Cela vous permet d'extraire directement les positions sans analyser de PDF.

Ajout de Métadonnées

Pour faciliter l'identification, ajoutez des attributs personnalisés dans votre fichier LilyPond, par exemple :

lilypond

```
{ \once \override NoteHead.output-attributes = #'((id . "note1")) c' }
```

Cela ajoute un identifiant dans le SVG, rendant l'extraction plus simple.

Extraction des Positions

Analysez le fichier SVG avec un parseur XML (comme en Python avec xml.etree.ElementTree) pour extraire les positions à partir des attributs transform, par exemple translate(100,200) pour x=100, y=200.

Adaptation aux PNG

Si vous avez besoin des positions dans les fichiers PNG, générez-les séparément avec -fpng et adaptez les coordonnées SVG en fonction de la résolution PNG, en utilisant un rapport comme la largeur SVG/largeur PNG.

Cette méthode est plus rapide et précise, évitant les étapes complexes de votre approche actuelle.

---

---

Note Détaillée

Cette section explore en profondeur les méthodes pour obtenir les positions graphiques des notes dans les fichiers PNG générés par LilyPond, en examinant les alternatives à votre méthode actuelle et en fournissant une analyse complète pour les utilisateurs avancés. L'objectif est de proposer une approche plus rapide et efficace, en s'appuyant sur les fonctionnalités de LilyPond et les outils disponibles.

Contexte et Objectif

LilyPond est un programme de gravure musicale qui génère des partitions dans divers formats, notamment PDF, PNG, SVG et MIDI. Vous cherchez actuellement à obtenir les positions graphiques des notes dans les fichiers PNG générés, en utilisant une méthode complexe impliquant l'exécution de LilyPond avec des options spécifiques (-dinclude-settings=event-listener.ly -dseparate-page-formats=pdf,png), l'analyse des fichiers PDF pour extraire les positions via les informations "point-click", et la conversion de ces positions en coordonnées PNG via un ratio basé sur les tailles des fichiers. Cette approche est laborieuse, car elle nécessite plusieurs étapes et une conversion entre formats.

L'objectif est de trouver une méthode plus rapide, en exploitant les capacités de LilyPond pour fournir directement les positions graphiques, idéalement sans passer par des conversions complexes.

Analyse de la Méthode Actuelle

Votre méthode actuelle repose sur :

1. L'utilisation de l'option -dinclude-settings=event-listener.ly pour générer un fichier d'événements avec des informations "point-click", qui servent de jointure entre la partition source, les événements compilés et les positions graphiques dans le PDF.

2. L'analyse des fichiers PDF pour extraire les rectangles de position (par exemple, Rect [402.632 226.067 410.763 232.778] ... myscore.ly:128:5:6), qui correspondent aux éléments graphiques.

3. La conversion de ces positions en coordonnées PNG en utilisant un ratio basé sur la taille des fichiers PNG et PDF, car ce rapport change avec la résolution demandée pour le PNG.

Cette méthode est complexe en raison du besoin d'analyser les PDF, qui sont des formats binaires, et de convertir les positions, ce qui peut introduire des erreurs, surtout si les résolutions varient.

Proposition d'une Méthode Alternative : Utilisation de la Sortie SVG

Une approche plus rapide et directe consiste à utiliser la sortie SVG de LilyPond, qui offre plusieurs avantages :

* Format Vectoriel : Le SVG est un format basé sur XML, contenant des coordonnées exactes pour chaque élément graphique, comme les têtes de notes. Cela élimine le besoin de conversion entre formats raster et vectoriel.

* Facilité d'Analyse : Étant un fichier texte, le SVG peut être facilement analysé avec des parseurs XML standard, comme ceux disponibles en Python (xml.etree.ElementTree, lxml), ce qui simplifie l'extraction des positions.

* Précision : Les positions dans le SVG sont indépendantes de la résolution, contrairement aux PNG, qui sont des images raster et nécessiteraient des techniques de traitement d'image pour extraire des positions, ce qui est moins précis.

Étapes pour Implémenter la Méthode SVG

1. Génération de la Sortie SVG :

  * Exécutez LilyPond avec l'option -dbackend=svg pour générer un fichier SVG :

```
lilypond -dbackend=svg myscore.ly
```

  * Cela produit un fichier SVG (par exemple, myscore.svg) contenant la partition sous forme vectorielle. Notez que, selon la documentation ([SVG Output](http://lilypond.org/doc/v2.25/Documentation/notation/svg-output)), SVG utilise un backend spécifique et ne peut pas être généré dans la même exécution que d'autres formats comme PNG ou PDF. Vous devrez donc exécuter LilyPond deux fois si vous avez besoin des deux formats.
2. Ajout de Métadonnées pour Faciliter l'Identification (Optionnel) :

  * Pour rendre l'extraction des positions plus simple, vous pouvez ajouter des attributs personnalisés aux éléments graphiques dans votre fichier LilyPond. Par exemple, pour les têtes de notes, utilisez :

lilypond

```
{ \once \override NoteHead.output-attributes = #'((id . "note1")) c' }
```

  * Cela ajoute un attribut id="note1" à l'élément SVG correspondant à la tête de note, facilitant l'identification lors de l'analyse. La documentation ([Alternative output formats](https://lilypond.org/doc/v2.24/Documentation/notation/alternative-output-formats)) explique comment utiliser la propriété output-attributes pour ajouter des métadonnées, comme des identifiants ou des classes standard SVG (id, class) ou des attributs personnalisés (préfixe data-).
3. Extraction des Positions des Notes :

  * Une fois le fichier SVG généré, utilisez un parseur XML pour extraire les positions. Les positions sont généralement stockées dans les attributs transform des éléments SVG, par exemple :

    * Un élément <g transform="translate(100,200)"> indique une position x=100, y=200.
  * Vous pouvez écrire un script pour parcourir le SVG et extraire les positions des éléments avec des attributs spécifiques. Voici un exemple de script Python pour extraire les positions :

python

```
import xml.etree.ElementTree as ET

# Charger le fichier SVG
tree = ET.parse('myscore.svg')
root = tree.getroot()

# Trouver tous les éléments <g> avec un attribut id (par exemple, "note1")
note_elements = root.findall('.//{[invalid url, do not cite])

# Extraire les positions
positions = {}
for element in note_elements:
    id = element.get('id')
    transform = element.get('transform')
    # Extraire les coordonnées x et y du transform (exemple : translate(100,200))
    if transform and 'translate' in transform:
        x, y = map(float, transform.split('(')[1].split(')')[0].split(','))
        positions[id] = (x, y)

# Afficher les positions
for id, (x, y) in positions.items():
    print(f"Note {id} : Position (x={x}, y={y})")
```

  * Ce script suppose que vous avez ajouté des identifiants aux notes. Sinon, vous pouvez identifier les éléments par leurs classes ou structures spécifiques (par exemple, les éléments <path> ou <circle> correspondant aux têtes de notes).

Comparaison avec la Méthode Actuelle

Voici un tableau comparant les deux approches :

|Aspect|Méthode Actuelle (PDF/PNG)|Méthode Proposée (SVG)|
| --- | --- | --- |
|Étapes|Analyse PDF, conversion via ratio, mapping point-click|Génération SVG, analyse XML, extraction directe|
|Précision|Moins précise (dépend de la résolution PNG)|Très précise (vectoriel, indépendant de la résolution)|
|Complexité|Élevée (analyse PDF, conversion)|Moyenne (analyse XML, script nécessaire)|
|Outils Requis|Analyse PDF, calculs de ratio|Parseur XML (par exemple, Python)|
|Temps d'Exécution|Plus long (plusieurs étapes)|Plus rapide (analyse directe)|

Considérations Techniques

* Compatibilité et Versions : Assurez-vous d'utiliser une version récente de LilyPond (par exemple, 2.24 ou plus récente) pour bénéficier des fonctionnalités de sortie SVG les plus récentes. Consultez la documentation ([LilyPond Changes]([invalid url, do not cite])) pour les améliorations récentes.

* Performance : La génération de SVG peut être légèrement plus lente que celle des PNG, mais l'analyse des positions est beaucoup plus simple et rapide, compensant le temps supplémentaire.

* Besoin de PNG : Si vous avez besoin des fichiers PNG pour d'autres raisons (par exemple, pour l'affichage ou l'intégration dans des applications), vous pouvez les générer séparément avec -fpng. Les positions extraites du SVG peuvent être adaptées aux PNG en tenant compte de la résolution, mais pour l'extraction des positions, le SVG est préférable.

* Outils Existants : Bien que je n'aie pas trouvé d'outils spécifiques pour extraire automatiquement les positions des notes à partir de SVG, des projets comme Lilyplayer ([Lilyplayer's documentation](https://s-d-m.github.io/lilydumper/print.html)) montrent que l'analyse de SVG est courante pour des tâches similaires, comme la mise en évidence graphique des notes, ce qui valide cette approche.

Conclusion

En utilisant la sortie SVG de LilyPond et en analysant directement le fichier SVG pour extraire les positions des notes, vous pouvez éviter les étapes complexes de votre méthode actuelle. Cette approche est plus rapide, plus précise et plus facile à implémenter, en particulier grâce à la nature vectorielle et textuelle du SVG, qui facilite l'extraction des coordonnées. Assurez-vous de générer SVG et PNG séparément si nécessaire, et envisagez d'ajouter des métadonnées pour simplifier l'identification des éléments.

---

Key Citations

* [SVG Output LilyPond Notation Reference](http://lilypond.org/doc/v2.25/Documentation/notation/svg-output)

* [Alternative output formats LilyPond Notation Reference](https://lilypond.org/doc/v2.24/Documentation/notation/alternative-output-formats)

* [Lilyplayer's documentation on SVG parsing](https://s-d-m.github.io/lilydumper/print.html)
extrait de la doc de lilyplayer
Now the idea is thus to extract all the "point and click" and their bounding boxes in all pages. Lilypond produces pdf files by default, however parsing pdf files to extract this data proved to require significant efforts. Instead of working with pdf files, I used another output format provided by lilypond: svg. Svg files are a special "kind" of xml files and therefore can easily be analysed with a text editor or worked on with any XML parser.

To get lilypond to output svg files, one had to pass the `-dbackend=svg` option to lilypond. This will generate one file per page, and to ensure lilypond generates these precious point-and-click elements, one has to also pass the `-dpoint-and-click` option.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/extraire-position-graphique-des-notes-dansles-images-generees/5895/2).