Aller au contenu
Table des matières

Maestro : Une partition dans un pipeline de conversion

Ce fork Maestro relie une interface d’envoi React à un backend Spring et des outils de conversion musicale. Passer d’une image de partition au MIDI demande une reconnaissance optique et une représentation intermédiaire.

Application et services Fork
  • Mis à jour
  • Java · 47.34%
  • AGPL-3.0
Composants documentés
2Explorer les modules
Documents source
3Lire les instructions
Langages du dépôtJava 47.34%6

Parts calculées à partir des octets GitHub Linguist.

Java47.34%
47.34%33 471 octets
TypeScript32.3%
32.3%22 838 octets
Python16.02%
16.02%11 324 octets
Dockerfile3.14%
3.14%2 222 octets
Langage%Octets
Java47.34%33 471
TypeScript32.3%22 838
Python16.02%11 324
Dockerfile3.14%2 222
HTML1%710
Shell0.2%138

1. Aperçu

1.1. Pourquoi il existe

Pipeline de reconnaissance optique de partitions musicales (OMR) convertissant des images en fichiers MIDI.

1.2. Cas d’usage

Numérisation de partitions musicales physiques pour écoute et arrangement.

2. Cas d’utilisation

Application web qui transforme une partition numérisée (PDF, PNG, JPG) en fichier MIDI, avec tempos ajustables.

Diagramme de cas d’utilisation de Maestro : Téléverser une partition; Régler le tempo par mesure; Lire les notes avec Audiveris; Convertir MusicXML en MIDI; Télécharger le fichier MIDI; Basculer anglais ou françaisMaestroTéléverser une partitionRégler le tempo par mesureLire les notes avec AudiverisConvertir MusicXML en MIDITélécharger le fichier MIDIBasculer anglais ou françaisMusicien«système»Moteur OMR Audiveris«système»music21 (Python)
Acteurs à gauche (personnes) et à droite (systèmes externes) ; chaque ovale est un cas d’utilisation appuyé par les fichiers cités ci-dessous.
Téléverser une partition
Musicien

Le formulaire React (maestro-app/src/pages/MusicSheetUploadForm/MusicSheetUploadForm.tsx) reçoit le fichier déposé et un nom de MIDI ; useMaestroClient.ts vérifie GET /health avant d’envoyer à /convert.

Régler le tempo par mesure
Musicien

Le formulaire garde une liste de tempos, mesures et options « forcer » (120 à la mesure 1 par défaut) et l’envoie dans le champ JSON tempos.

Lire les notes avec Audiveris
Moteur OMR Audiveris

POST /convert (ConvertController.java) vérifie le fichier (10 Mo au plus, signature PDF/JPG/PNG) puis AudiverisController.java lance Audiveris en mode batch pour exporter un .mxl.

Convertir MusicXML en MIDI
music21 (Python)

backend/src/main/MxlToMidi.py charge le .mxl avec music21, applique les nuances et les tempos demandés, puis écrit le .mid.

Télécharger le fichier MIDI
Musicien

Le backend renvoie le .mid en pièce jointe et le frontend l’enregistre avec js-file-download ; les dossiers In et Out sont nettoyés trois secondes plus tard.

Basculer anglais ou français
Musicien

LanguageSwitcher.tsx bascule i18next entre en-US et fr-CA à partir des textes de maestro-app/public/locales/.

2.1. Scénario : Transformer une partition PDF en MIDI en local

  1. Copier les dossiers bin et lib d’Audiveris dans backend/audiveris/dist, comme l’indique backend/README.md.
  2. Démarrer les deux services avec docker-compose up -d (backend sur le port 8080, frontend sur le port 3000).
  3. Ouvrir localhost:3000, déposer une partition PDF et saisir un nom de fichier MIDI.
  4. Ajouter une ligne de tempo, par exemple 90 à la mesure 1, puis envoyer le formulaire.
  5. Le backend lance Audiveris puis MxlToMidi.py, et le navigateur télécharge le .mid.

Fichiers consultésREADME.mdbackend/README.mddocker-compose.ymlbackend/src/main/java/PFE008/backend/ConvertController.javabackend/src/main/java/PFE008/backend/AudiverisController.javabackend/src/main/MxlToMidi.pymaestro-app/src/hooks/useMaestroClient.tsmaestro-app/src/pages/MusicSheetUploadForm/MusicSheetUploadForm.tsxmaestro-app/src/components/languageSwitcher/LanguageSwitcher.tsx

3. Démarrage

Ces commandes viennent de la documentation du dépôt. Elles n’ont pas été exécutées pendant cette revue.

README.md · Getting Started
  git clone https://github.com/PrimePhil/PFE008
README.md · Frontend
  cd maestro-app
README.md · Frontend
  npm install
README.md · Frontend
  npm run start
README.md · Tests
gradle test
Commandes déclarées dans les manifestes

3.1. maestro-app/package.json

start
react-scripts start
build
react-scripts build
test
react-scripts test

4. Références du dépôt

Extraits des guides du dépôt, dans leur langue d’origine. Les liens ouvrent la version du code consultée.

Prérequis et premier essai

4.1. Requirements

README.md

  • Audiveris
  • Java 22.0.2
  • Python 3.12
  • npm 8.19.4
  • Nodejs 18.13.0
Lire les instructions complètes ↗

4.2. Getting Started

README.md

Start by cloning the project
Lire les instructions complètes ↗

4.3. Prerequisites

backend/README.md

  1. Java Installation:
  • Ensure you have Java installed. The version used for this project is:
  1. Gradle:
  • The project includes a Gradle wrapper, so you don’t need to install Gradle manually. If needed, you can download Gradle here. The project uses Gradle v8.8.
  1. OCR Language Data:
  • Audiveris relies on Tesseract for Optical Character Recognition (OCR). You’ll need to install language data files. Refer to the Audiveris guide for setup instructions.
  1. Audiveris Setup:
  • The Audiveris distribution is not included in the repository. You need to download it manually and place it in the backend/audiveris/dist directory.
  • Download the Audiveris distribution (Windows installer) from here.
  • After installation, copy the bin and lib directories from the Audiveris installation directory to backend/audiveris/dist/. Your project structure should look like this:
Lire les instructions complètes ↗
API et intégration

4.4. Endpoint Overview

backend/README.md

There is currently one main route in the API:
Lire les instructions complètes ↗
Exploitation et dépannage

4.5. Deployment

README.md

To run locally a docker-compose To build docker’s image move to the root (where the Dockerfile is) and use : When you have a docker’s image, you can run it with the command : Note : To deploy the application, you must install Docker before hand. you can also used an image already build on the offical Docker repo with the command : if you want to update this image, you can use the commands : Note : You need to be a member of the organization to push a new images.
Lire les instructions complètes ↗
Développement et contributions

4.6. Tests

README.md

To run the tests suites go into the backend repository and run the command It is important to note that the python’s tests will be executed with the gradle command
Lire les instructions complètes ↗

4.7. npm test

maestro-app/README.md

Launches the test runner in the interactive watch mode.
Lire les instructions complètes ↗
Documentation source

3 documents lus parmi 3 candidats.

5. Fonctions et composants 2

Frontière d’envoi
ConvertController accepte des fichiers multipart sur /convert. Il rejette les fichiers vides, contrôle la limite de 10 Mio et vérifie la signature avant sauvegarde. Un tempo optionnel accompagne la demande.
Processus externes
AudiverisController construit une commande selon le système et attend le processus Audiveris. Le backend comprend aussi MxlToMidi.py. Le démarrage, les fichiers intermédiaires et le téléchargement peuvent échouer séparément.

6. Architecture

Ouvrez un composant pour suivre ses connexions, ou explorez le diagramme complet.

Composants du système Contexte
Mermaid Diagramme interactif

Vue générale des composants et des échanges vérifiés dans le dépôt.

Vue statique de l’architecture de Maestro
Aperçu statique. Le diagramme interactif le remplace après le chargement de Mermaid.
flowchart LR
  n0["Envoi React"]
  n1["Validation Spring"]
  n2["Reconnaissance Audiveris"]
  n3["Conversion MusicXML"]
  n4["Téléchargement MIDI"]
  n0 --> n1
  n1 --> n2
  n2 --> n3
  n3 --> n4
Version texte du diagramme
  • Envoi React → Validation Spring
  • Validation Spring → Reconnaissance Audiveris
  • Reconnaissance Audiveris → Conversion MusicXML
  • Conversion MusicXML → Téléchargement MIDI
Suivre un parcours dans le code

Suivez /convert dans ses validations, puis le choix de l’exécutable et du dossier de sortie. Un envoi HTTP réussi ne suffit pas: la conversion dépend aussi de l’outil externe et de ses fichiers.

7. Dossier technique

Établi à partir du code au commit 6dca488 (38 fichiers). Chaque élément vient d’une correspondance de motif dans le code: ouvrez le fichier lié avant de vous y fier.

7.1. Couches et modules

Les dossiers sont classés par couche selon leur nom, de l’interface utilisateur jusqu’à l’accès aux données. Comme le classement repose sur les noms seulement, le diagramme ne dit rien des appels entre couches.

Mermaid Vue en couches
flowchart TB
  subgraph L_presentation["Présentation"]
    direction TB
    presentation_0["maestro-app/components<br/>5 fichiers"]
    presentation_1["maestro-app/pages<br/>3 fichiers"]
    presentation_2["maestro-app/src<br/>2 fichiers"]
    presentation_3["maestro-app/i18n<br/>1 fichier"]
    presentation_more["+2"]
  end
  subgraph L_domain["Domaine et règles métier"]
    direction TB
    domain_0["maestro-app/types<br/>1 fichier"]
  end
  subgraph L_infrastructure["Données et infrastructure"]
    direction TB
    infrastructure_0["maestro-app/hooks<br/>1 fichier"]
  end
  subgraph L_core["Source principale"]
    direction TB
    core_0["backend/PFE008<br/>5 fichiers"]
    core_1["backend<br/>2 fichiers"]
    core_2["maestro-app/src<br/>2 fichiers"]
    core_3["(root)<br/>1 fichier"]
    core_more["+1"]
  end
  subgraph L_tests["Tests"]
    direction TB
    tests_0["backend<br/>4 fichiers"]
    tests_1["maestro-app<br/>1 fichier"]
  end
  subgraph L_hosting["Build, CI et hébergement"]
    direction TB
    hosting_0["(root)<br/>4 fichiers"]
    hosting_1[".github<br/>1 fichier"]
  end
  L_presentation ~~~ L_domain
  L_domain ~~~ L_infrastructure
  L_infrastructure ~~~ L_core
  L_core ~~~ L_tests
  L_core ~~~ L_hosting
Modules et couche principale
ModuleCoucheFichiersTypesExtensions
backend/PFE008Source principale55.java
maestro-app/componentsPrésentation51.tsx .ts
maestro-app/srcPrésentation40.tsx .ts
maestro-app/pagesPrésentation31.tsx
backendSource principale20.gradle
(root)Source principale10.sh
backend/mainSource principale10.py
maestro-app/hooksDonnées et infrastructure11.ts
maestro-app/i18nPrésentation10.tsx
maestro-app/mocksPrésentation10.tsx
maestro-app/publicPrésentation10.html
maestro-app/typesDomaine et règles métier10.ts

7.2. Modèle C4

Du contexte du système aux déclarations du code. Chaque niveau conserve les limites des sources disponibles.

UML 1 · Contexte du système
1 · Contexte du système

La vue C4 la plus large : qui utilise le projet et sur quels systèmes et stockages externes il s’appuie. Rendu avec uml-mcp.

Source PlantUML
@startuml
!include <C4/C4_Context>
LAYOUT_LEFT_RIGHT()
Person(P_http, "Client HTTP")
System(SYS, "Maestro", "Ce fork Maestro relie une interface d’envoi React à un backend Spring…")
Rel(P_http, SYS, "Utilise")
@enduml
UML 2 · Conteneurs
2 · Conteneurs

Un niveau plus près : les parties qui s’exécutent séparément dans le projet, leur langage principal et le chemin des appels entre elles. Rendu avec uml-mcp.

Source PlantUML
@startuml
!include <C4/C4_Container>
LAYOUT_LEFT_RIGHT()
Person(P_http, "Client HTTP")
System_Boundary(SYS, "Maestro") {
  Container(C0, "maestro-backend", "Docker")
  Container(C1, "maestro-frontend", "Docker")
}
Rel(P_http, C0, "Utilise")
@enduml
UML 3 · Composants et couches
3 · Composants et couches

Modules regroupés par couche du code. Les limites indiquent l’organisation, sans affirmer une isolation à l’exécution ni des appels. Rendu avec uml-mcp.

Source PlantUML
@startuml
!include <C4/C4_Component>
LAYOUT_TOP_DOWN()
System_Boundary(SYS, "Maestro") {
Boundary(L0, "Présentation", "layer") {
Component(M0_0, "maestro-app/components", "React, TypeScript", "5 fichiers")
Component(M0_1, "maestro-app/pages", "React", "3 fichiers")
Component(M0_2, "maestro-app/src", "React", "2 fichiers")
Component(M0_3, "maestro-app/i18n", "React", "1 fichiers")
Component(M0_4, "maestro-app/mocks", "React", "1 fichiers")
Component(M0_5, "maestro-app/public", "HTML", "1 fichiers")
}
Boundary(L1, "Domaine et règles métier", "layer") {
Component(M1_0, "maestro-app/types", "TypeScript", "1 fichiers")
}
Boundary(L2, "Données et infrastructure", "layer") {
Component(M2_0, "maestro-app/hooks", "TypeScript", "1 fichiers")
}
Boundary(L3, "Source principale", "layer") {
Component(M3_0, "backend/PFE008", "Java", "5 fichiers")
Component(M3_1, "backend", ".gradle", "2 fichiers")
Component(M3_2, "maestro-app/src", "TypeScript", "2 fichiers")
Component(M3_3, "(root)", ".sh", "1 fichiers")
Component(M3_4, "backend/main", "Python", "1 fichiers")
}
Boundary(L4, "Tests", "layer") {
Component(M4_0, "backend", "Java, Python", "4 fichiers")
Component(M4_1, "maestro-app", "React", "1 fichiers")
}
Boundary(L5, "Build, CI et hébergement", "layer") {
Component(M5_0, "(root)", "Dockerfile, .backend, .frontend", "4 fichiers")
Component(M5_1, ".github", ".yml", "1 fichiers")
}
}
@enduml
UML 4 · Code
4 · Code

Déclarations, champs et méthodes sélectionnés, regroupés par fichier source. Aucun héritage ni appel n’est déduit. Rendu avec uml-mcp.

Source PlantUML
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
top to bottom direction
hide empty members
package "Maestro" {
package "backend/src/main/java/PFE008/backend/ConversionResponse.java" as F0 {
class "ConversionResponse" as T0_0 {
  getFileName()
  setFileName()
  getDownloadUri()
  setDownloadUri()
  getSize()
  setSize()
}
}
package "backend/src/main/java/PFE008/backend/FileUtil.java" as F1 {
class "FileUtil" as T1_0 {
  saveFile()
  getFileAsResource()
  isValidFile()
  cleanupDirectories()
  deleteFilesInDirectory()
}
}
package "maestro-app/src/pages/MusicSheetUploadForm/MusicSheetUploadFormFooter.tsx" as F2 {
class "MusicSheetUploadFormFooterProps" as T2_0 {
  canResetForm
  file
  loading
  reset
}
}
package "maestro-app/src/hooks/useMaestroClient.ts" as F3 {
class "UseMaestroClientResult" as T3_0 {
  loading
  error
  convert
}
}
package "maestro-app/src/components/musicSheetUploader/MusicSheetUploader.tsx" as F4 {
class "MusicSheetUploaderProps" as T4_0 {
  onFileChange
  file
}
}
}
@enduml

7.3. Interface publique

Du code extérieur peut utiliser tout ce qui est listé ici. Le projet déclare aussi 8 types publics.

UML Cas d’utilisation
Cas d’utilisation

Chaque acteur est un type d’appelant, relié à ce qu’il peut demander au projet. Rendu avec uml-mcp.

Source PlantUML
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
left to right direction
actor "Client HTTP" as A_http
rectangle "Maestro" {
  usecase "POST /convert" as U0
  usecase "GET /health" as U1
}
A_http --> U0
A_http --> U1
@enduml

Routes HTTP 2

Les routes marquées exploitation exposent la santé, l’état ou l’administration; restreignez-les en production.

7.4. Interface privée

Ces noms sont internes selon les conventions du langage: tiret bas initial, private, static ou pub(crate).

Méthode privée ou interne
2

7.5. Services

7.6. Entités et modèle de données 3

Mermaid Diagramme de classes des entités
classDiagram
  direction LR
  class E0["MusicSheetUploadFormFooterProps"] {
    +boolean canResetForm
    +File file
    +boolean loading
    +reset
  }
  class E1["UseMaestroClientResult"] {
    +boolean loading
    +string error
    +convert
  }
  class E2["MusicSheetUploaderProps"] {
    +onFileChange
    +File file
  }

Une flèche relie un champ à l’entité que son type nomme.

EntitéNaturePremiers champs
MusicSheetUploadFormFooterPropsEnregistrement ou interfacecanResetForm, file, loading, reset
UseMaestroClientResultEnregistrement ou interfaceloading, error, convert
MusicSheetUploaderPropsEnregistrement ou interfaceonFileChange, file

7.7. Logique métier

Une fois écartés le code d’interface et les services et entités ci-dessus, ces classes ont le plus de méthodes.

ConversionResponse Source principale, 6 méthodes
getFileName, setFileName, getDownloadUri, setDownloadUri, getSize, setSize
FileUtil Source principale, 5 méthodes
saveFile, getFileAsResource, isValidFile, cleanupDirectories, deleteFilesInDirectory

7.8. Intégrations externes

Clients HTTP

fetch

7.9. Stack et dépendances

JVM (Gradle) backend/build.gradle 4 à l’exécution, 4 dev

Ouvrir le manifeste

Node.js maestro-app/package.json 27 à l’exécution, 1 dev

Ouvrir le manifeste

Dépendances externes

36 paquets déclarés (31 à l’exécution, 5 pour le développement) dans backend/build.gradle, maestro-app/package.json.

Tableau des paquets 36
Dépendances externes
PaquetVersionUsageRôleRegistre
org.springframework.boot:spring-boot-starter-web—exécutionCadriciel webcentral.sonatype.com
org.apache.commons:commons-lang3—exécution—central.sonatype.com
org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0—exécution—central.sonatype.com
org.apache.tika:tika-core:2.9.2—exécution—central.sonatype.com
org.springframework.boot:spring-boot-starter-test—développementTestscentral.sonatype.com
org.junit.jupiter:junit-jupiter-api:5.9.3—développement—central.sonatype.com
org.mockito:mockito-core:5.2.0—développement—central.sonatype.com
org.mockito:mockito-junit-jupiter:5.2.0—développement—central.sonatype.com
@emotion/react^11.11.4exécution> Simple styling in React.npmjs.com
@emotion/styled^11.11.5exécutionstyled API for emotionnpmjs.com
@fontsource/roboto^5.0.13exécutionSelf-host the Roboto font in a neatly bundled NPM package.npmjs.com
@hookform/resolvers^3.9.0exécutionReact Hook Form validation resolvers: Yup, Joi, Superstruct, Zod, Vest, Class Validator, io-ts, Nope, computed-types, TypeBox, arktype, Typanpmjs.com
@mui/icons-material^5.15.19exécutionInterface utilisateurnpmjs.com
@mui/lab^5.0.0-alpha.170exécutionInterface utilisateurnpmjs.com
@mui/material^5.15.19exécutionInterface utilisateurnpmjs.com
@testing-library/jest-dom^5.17.0exécutionTestsnpmjs.com
@testing-library/react^13.4.0exécutionTestsnpmjs.com
@testing-library/user-event^13.5.0exécutionTestsnpmjs.com
@types/jest^27.5.2exécutionTypagenpmjs.com
@types/node^16.18.97exécutionTypagenpmjs.com
@types/react^18.3.3exécutionTypagenpmjs.com
@types/react-dom^18.3.0exécutionTypagenpmjs.com
i18next^23.11.5exécutioni18next internationalization frameworknpmjs.com
i18next-browser-languagedetector^8.0.0exécutionlanguage detector used in browser environment for i18nextnpmjs.com
i18next-http-backend^2.5.2exécutioni18next-http-backend is a backend layer for i18next using in Node.js, in the browser and for Deno.npmjs.com
js-file-download^0.4.12exécutionJavascript function that triggers browser to save javascript-generated content to a filenpmjs.com
react^18.3.1exécutionInterface utilisateurnpmjs.com
react-dom^18.3.1exécutionInterface utilisateurnpmjs.com
react-dropzone^14.2.3exécutionInterface utilisateurnpmjs.com
react-hook-form^7.51.5exécutionInterface utilisateurnpmjs.com
react-i18next^14.1.2exécutionInterface utilisateurnpmjs.com
react-scripts5.0.1exécutionInterface utilisateurnpmjs.com
typescript^4.9.5exécutionTypagenpmjs.com
web-vitals^2.1.4exécutionEasily measure performance metrics in JavaScriptnpmjs.com
yup^1.4.0exécutionValidation des donnéesnpmjs.com
@babel/plugin-proposal-private-property-in-object^7.21.11développementOutils de buildnpmjs.com

7.10. Pipeline CI/CD

1 workflow GitHub Actions, 1 tâche. Chaque boîte est une tâche ; les boîtes à double bord publient ou déploient, et les flèches suivent les dépendances needs.

Mermaid Déroulement du pipeline
flowchart LR
  subgraph wf0["CI"]
    direction LR
    wf0_build["build<br/>ubuntu-latest"]
  end
  t0(["push · demande de fusion"])
  t0 --> wf0_build
Workflows, déclencheurs, tâches et cibles
WorkflowDéclencheursTâchesPublie vers
CI
.github/workflows/ci.yml
push, demande de fusion
  • build ubuntu-latest
    Checkout code · Set up JDK 22 · Set up Python 3.12 · Install dependencies · Install and configure Flatpak · Install Gradle
—

7.11. Déploiement

Mermaid Schéma de déploiement
flowchart LR
  repo[("Dépôt GitHub")]
  ci[["GitHub Actions<br/>1 workflow"]]
  image["Image Docker<br/>FROM ubuntu:latest"]
  subgraph compose["Docker Compose"]
    svc_maestro_backend["maestro-backend"]
    svc_maestro_frontend["maestro-frontend"]
  end
  repo -->|"push ou demande de fusion"| ci
  ci -->|"docker build"| image
  image -->|"docker compose up"| compose
UML Déploiement
Déploiement

Le nœud extérieur est l’endroit où le code s’exécute. Chaque image de base pointe vers ce qu’elle construit, les flèches pleines mènent aux bases de données et les pointillées aux services externes. Rendu avec uml-mcp.

Source PlantUML
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
node "Docker Compose" as H {
  node "maestro-backend" as N0 <<container>>
  node "maestro-frontend" as N1 <<container>>
}
artifact "FROM ubuntu:latest" as IMG0
IMG0 ..> N0 : construit
artifact "FROM ubuntu:latest" as IMG1
IMG1 ..> N0 : construit
artifact "FROM ubuntu:latest" as IMG2
IMG2 ..> N0 : construit
@enduml

Où il s’exécute

Services Compose

maestro-backend maestro-frontend

Images Docker de base

ubuntu:latest ubuntu:latest ubuntu:latest

7.12. Supervision

Ce que le code consigne, mesure et expose pour savoir s’il fonctionne.

Routes de santé et de métriques

GET /health

Vérifications de santé des conteneurs

7.13. Sécurité

Contrôles

Chaîne d’approvisionnement

Variables d’environnement 1

La page reprend les noms sans leurs valeurs et souligne ceux qui ressemblent à des secrets.

BACKEND_URL

7.14. Tests automatisés

Fichiers de test
5
Fichiers source
26
Cas de test, environ
22
Tests unitaires
4
Tests intégration
1

Aucun rapport chiffré de couverture dans les sources analysées.

Où sont les tests

backend/src/test/java/PFE008/backend 4 maestro-app/src 1

Intégration continue

CI
gradle test
UML Pipeline CI
Pipeline CI

Le workflow GitHub Actions principal suit ces étapes. Les tâches lancées en parallèle sont côte à côte. Rendu avec uml-mcp.

Source PlantUML
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
title CI
start
partition "build" {
  :Checkout code;
  :Set up JDK 22;
  :Set up Python 3.12;
  :Install dependencies;
  :Install and configure Flatpak;
  :Install Gradle;
  :Build with Gradle;
  :Run Java Tests;
}
stop
@enduml

Rien trouvé pour: Base de données.

8. Types et structure des fichiers

12 types déclarés, dont 12 dans l’aperçu des relations de base.

Diagramme des types
classDiagram
direction TB
class t0fc2da07ca26["AudiverisController"] {
  AudiverisController()
  convert()
  convertMxlToMidi()
}
class te09535b4ea27["ConvertController"] {
  convert()
  healthCheck()
}
class t5b329a34a4e0["BackendApplication"] {
  main()
}
class t5026bc97d4a6["ConversionResponse"] {
  getFileName()
  setFileName()
  getDownloadUri()
  setDownloadUri()
}
class ta28a28fad99c["FileUtil"] {
  saveFile()
  getFileAsResource()
  isValidFile()
  cleanupDirectories()
}
class t3a8c9a5b3e47["AudiverisController_tests"] {
  setup()
  testConvertSuccess()
  testConvertWrongFile()
  testConvertFileOutput()
}
class tc9ddabb9fef2["ConvertControllerTest"] {
  setup()
  testConvertSuccess()
  testConvertFail()
  testConvertFileNotFound()
}
class tf78cdd633a9f["FileUtil_tests"] {
  setup()
  testSaveFile()
  testGetFileAsResource()
  testSaveFileThrowsIOException()
}
class t306c8eab2abe["TestMxlToMidi"] {
  setUp()
  test_apply_dynamics_to_notes()
  test_print_note_details()
  test_print_part_details()
}
class t5c7dff211126["MusicSheetUploaderProps"] {
  <<interface>>
}
class t28f92fc28615["UseMaestroClientResult"] {
  <<interface>>
}
class td89584c9e8be["MusicSheetUploadFormFooterProps"] {
  <<interface>>
}
class b385cfa4f4c5b["unittest.TestCase"] {
  <<unresolved_base>>
}
b385cfa4f4c5b <|-- t306c8eab2abe

Les bases non résolues restent identifiées; les signatures complètes ne sont pas reconstruites.

9. Référence

32 / 32 fichiers admissibles lus (128 dans l’arbre); 0 trop volumineux, 0 échec de lecture et 0 diagnostic de syntaxe.

Ce que couvre l’analyse

Les dossiers connus de dépendances et de compilation, les fichiers d’identifiants et les binaires sont exclus. La collecte couvre les README, les manifestes reconnus et les fichiers source pris en charge.

Les statistiques Linguist couvrent l’ensemble du dépôt et peuvent inclure d’autres langages.

11. Fichiers à lire 4

12. Glossaire

Dépôt

Les fichiers source, la configuration et l’historique versionné d’un projet.

README

Le document d’entrée du dépôt, qui présente généralement son rôle et son installation.

Dépendance

Une bibliothèque, un outil ou un service nécessaire à la compilation ou à l’exécution d’un composant.

HTTP

Un protocole de requête et réponse utilisé par les navigateurs et services web. Une requête comprend une méthode, un chemin, des en-têtes et parfois un corps.

Conteneur

Un environnement de processus isolé créé à partir d’une image. Les données persistantes nécessitent un stockage hors de son système de fichiers temporaire.

Port publié

Un port de l’hôte associé au port d’un service dans un conteneur. Sa publication peut rendre le service accessible hors du réseau des conteneurs.

Interface en ligne de commande

Une interface textuelle où les commandes et arguments choisissent les opérations. Les codes de retour permettent aux scripts de détecter un succès ou un échec.

Compilation

Les étapes qui transforment les sources et dépendances en programme exécutable ou en livrable distribuable.

Backend

Une implémentation derrière une interface commune. Selon le contexte, il peut s’agir d’un service côté serveur ou d’une implémentation graphique, d’entrée ou de stockage.

Micrologiciel

Un logiciel exécuté sur un appareil ou microcontrôleur pour contrôler son matériel et ses communications.

Fork

Un dépôt distinct dérivé d’un autre projet. Une modification du fork ne devient pas automatiquement une modification du projet amont.

13. Références

  1. antoinebou12. (2026, 5 novembre). Maestro. [Software repository] github.com.
  2. antoinebou12. (2026, 5 novembre). Maestro: README. [Repository documentation] github.com.
  3. antoinebou12. (2026, 5 novembre). backend/src/main/java/PFE008/backend/ConvertController.java. [Source file] github.com.
  4. antoinebou12. (2026, 5 novembre). backend/src/main/java/PFE008/backend/AudiverisController.java. [Source file] github.com.
  5. antoinebou12. (2026, 5 novembre). backend/src/main/MxlToMidi.py. [Source file] github.com.
  6. antoinebou12. (2026, 5 novembre). maestro-app/package.json. [Source file] github.com.
  7. Boucher, A. (2026, 23 octobre). Maestro : Une partition dans un pipeline de conversion. [Project article] antoineboucher.info.

Les sources sans date de publication indiquent la date de leur dernière vérification, le 5 novembre 2026. Les liens des fichiers conservent la révision inspectée lorsqu’elle est disponible.