Table of contents
Maestro: Sheet music through an external conversion pipeline
This Maestro fork connects a React upload interface to a Spring backend and external music-conversion tools. Turning a score image into MIDI passes through an optical-recognition stage and an intermediate score representation.
- Languages
- 6Code breakdown
- Documented components
- 2Explore modules
- Source documents
- 3Read the instructions
Repository languagesJava 47.34%6
Shares calculated from GitHub Linguist bytes.
| Language | % | Bytes |
|---|---|---|
| Java | 33,471 | |
| TypeScript | 22,838 | |
| Python | 11,324 | |
| Dockerfile | 2,222 | |
| HTML | 710 | |
| Shell | 138 |
1. Overview
1.1. Why it exists
Optical Music Recognition (OMR) pipeline translating sheet music scans into MIDI score sequences.
1.2. Best fit
Digitization of physical sheet music for playback and editing.
2. Use cases
Web app that turns a scanned music sheet (PDF, PNG, JPG) into a MIDI file, with optional tempo overrides.
- Upload a music sheet
- Musician
The React form in maestro-app/src/pages/MusicSheetUploadForm/MusicSheetUploadForm.tsx takes a dropped file and a MIDI file name, then useMaestroClient.ts checks GET /health before posting to /convert.
- Set tempos per measure
- Musician
The form keeps a list of tempo, measure and force entries (default 120 at measure 1) and sends it as the JSON field tempos.
- Recognize notes with Audiveris
- Audiveris OMR engine
POST /convert in ConvertController.java checks the file (10 MB limit, PDF/JPG/PNG signature) and AudiverisController.java runs Audiveris in batch mode to export a .mxl file.
- Convert MusicXML to MIDI
- music21 (Python)
backend/src/main/MxlToMidi.py loads the .mxl with music21, applies dynamics and the requested tempo marks, and writes the .mid file.
- Download the MIDI file
- Musician
The backend returns the .mid as an attachment and the frontend saves it with js-file-download; input and output folders are cleaned three seconds later.
- Switch English or French
- Musician
LanguageSwitcher.tsx toggles i18next between en-US and fr-CA, using the strings in maestro-app/public/locales/.
2.1. Scenario: Turn a PDF score into a MIDI file locally
- Copy the Audiveris bin and lib folders into backend/audiveris/dist as backend/README.md explains.
- Start both services with docker-compose up -d (backend on port 8080, frontend on port 3000).
- Open localhost:3000, drop a PDF score and enter a MIDI file name.
- Add a tempo row, for example 90 at measure 1, and submit the form.
- The backend runs Audiveris, then MxlToMidi.py, and the browser downloads the .mid file.
Files readREADME.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. Getting started
These commands come from the repository documentation. They were not run during this review.
git clone https://github.com/PrimePhil/PFE008 cd maestro-app npm install npm run startgradle testTasks declared in manifests
3.1. maestro-app/package.json
startreact-scripts startbuildreact-scripts buildtestreact-scripts test
4. Repository references
Excerpts from the repository’s guides, in their original language. Links open the inspected source revision.
Prerequisites and first run
4.1. Requirements
README.md
- Audiveris
- Java 22.0.2
- Python 3.12
- npm 8.19.4
- Nodejs 18.13.0
4.2. Getting Started
README.md
4.3. Prerequisites
backend/README.md
- Java Installation:
- Ensure you have Java installed. The version used for this project is:
- 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.
- 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.
- 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:
API and integration
4.4. Endpoint Overview
backend/README.md
Operations and troubleshooting
4.5. Deployment
README.md
Development and contributions
4.6. Tests
README.md
4.7. npm test
maestro-app/README.md
Source documentation
3 documents read from 3 candidates.
5. Features and components 2
- Upload boundary
- ConvertController accepts multipart uploads at /convert. It rejects empty files, checks the 10 MiB size limit and calls a file-signature validator before saving the input. Optional tempo input travels with the conversion request.
- External processes
- AudiverisController builds an OS-dependent command and waits for the Audiveris process. The backend also includes MxlToMidi.py. Process startup, intermediate files and the returned download are separate failure points.
6. Architecture
Expand a component to follow its connections, or explore the full diagram.
React file upload
Spring validation
Audiveris recognition
MusicXML conversion stage
MIDI download
Mermaid Interactive diagram
System overview of the components and connections verified in the repository.

flowchart LR
n0["React file upload"]
n1["Spring validation"]
n2["Audiveris recognition"]
n3["MusicXML conversion stage"]
n4["MIDI download"]
n0 --> n1
n1 --> n2
n2 --> n3
n3 --> n4
Text version of the diagram
- React file upload → Spring validation
- Spring validation → Audiveris recognition
- Audiveris recognition → MusicXML conversion stage
- MusicXML conversion stage → MIDI download
Follow one path through the code
Follow /convert into the file checks, then inspect how AudiverisController chooses its executable and output directory. A successful HTTP upload is only the start; conversion also depends on the external tool and generated files.
7. Technical dossier
Built from the source at commit 6dca488 (38 files). Each item comes from a pattern match in the code, so open the linked file before relying on it.
7.1. Layers and modules
Folders are sorted into layers by name, from the user interface down to data access. Because the sorting uses names only, the diagram says nothing about calls between layers.
Mermaid Layered view
flowchart TB
subgraph L_presentation["Presentation"]
direction TB
presentation_0["maestro-app/components<br/>5 files"]
presentation_1["maestro-app/pages<br/>3 files"]
presentation_2["maestro-app/src<br/>2 files"]
presentation_3["maestro-app/i18n<br/>1 file"]
presentation_more["+2"]
end
subgraph L_domain["Domain and business rules"]
direction TB
domain_0["maestro-app/types<br/>1 file"]
end
subgraph L_infrastructure["Data and infrastructure"]
direction TB
infrastructure_0["maestro-app/hooks<br/>1 file"]
end
subgraph L_core["Core source"]
direction TB
core_0["backend/PFE008<br/>5 files"]
core_1["backend<br/>2 files"]
core_2["maestro-app/src<br/>2 files"]
core_3["(root)<br/>1 file"]
core_more["+1"]
end
subgraph L_tests["Tests"]
direction TB
tests_0["backend<br/>4 files"]
tests_1["maestro-app<br/>1 file"]
end
subgraph L_hosting["Build, CI and hosting"]
direction TB
hosting_0["(root)<br/>4 files"]
hosting_1[".github<br/>1 file"]
end
L_presentation ~~~ L_domain
L_domain ~~~ L_infrastructure
L_infrastructure ~~~ L_core
L_core ~~~ L_tests
L_core ~~~ L_hosting
| Module | Layer | Files | Types | Extensions |
|---|---|---|---|---|
backend/PFE008 | Core source | 5 | 5 | .java |
maestro-app/components | Presentation | 5 | 1 | .tsx .ts |
maestro-app/src | Presentation | 4 | 0 | .tsx .ts |
maestro-app/pages | Presentation | 3 | 1 | .tsx |
backend | Core source | 2 | 0 | .gradle |
(root) | Core source | 1 | 0 | .sh |
backend/main | Core source | 1 | 0 | .py |
maestro-app/hooks | Data and infrastructure | 1 | 1 | .ts |
maestro-app/i18n | Presentation | 1 | 0 | .tsx |
maestro-app/mocks | Presentation | 1 | 0 | .tsx |
maestro-app/public | Presentation | 1 | 0 | .html |
maestro-app/types | Domain and business rules | 1 | 0 | .ts |
7.2. C4 model
From system context to code declarations. Each level reflects the available source evidence.
UML 1 · System context
The widest C4 view: who uses the project and which outside systems and data stores it relies on. Rendered with uml-mcp.
PlantUML source
@startuml
!include <C4/C4_Context>
LAYOUT_LEFT_RIGHT()
Person(P_http, "HTTP client")
System(SYS, "Maestro", "This Maestro fork connects a React upload interface to a Spring backe…")
Rel(P_http, SYS, "Uses")
@enduml
UML 2 · Containers
One level closer: the parts that run separately inside the project, their main language and how calls flow between them. Rendered with uml-mcp.
PlantUML source
@startuml
!include <C4/C4_Container>
LAYOUT_LEFT_RIGHT()
Person(P_http, "HTTP client")
System_Boundary(SYS, "Maestro") {
Container(C0, "maestro-backend", "Docker")
Container(C1, "maestro-frontend", "Docker")
}
Rel(P_http, C0, "Uses")
@enduml
UML 3 · Components and layers
Modules grouped by source-layer classification. Boundaries show organization, not runtime isolation or call relationships. Rendered with uml-mcp.
PlantUML source
@startuml
!include <C4/C4_Component>
LAYOUT_TOP_DOWN()
System_Boundary(SYS, "Maestro") {
Boundary(L0, "Presentation", "layer") {
Component(M0_0, "maestro-app/components", "React, TypeScript", "5 files")
Component(M0_1, "maestro-app/pages", "React", "3 files")
Component(M0_2, "maestro-app/src", "React", "2 files")
Component(M0_3, "maestro-app/i18n", "React", "1 files")
Component(M0_4, "maestro-app/mocks", "React", "1 files")
Component(M0_5, "maestro-app/public", "HTML", "1 files")
}
Boundary(L1, "Domain and business rules", "layer") {
Component(M1_0, "maestro-app/types", "TypeScript", "1 files")
}
Boundary(L2, "Data and infrastructure", "layer") {
Component(M2_0, "maestro-app/hooks", "TypeScript", "1 files")
}
Boundary(L3, "Core source", "layer") {
Component(M3_0, "backend/PFE008", "Java", "5 files")
Component(M3_1, "backend", ".gradle", "2 files")
Component(M3_2, "maestro-app/src", "TypeScript", "2 files")
Component(M3_3, "(root)", ".sh", "1 files")
Component(M3_4, "backend/main", "Python", "1 files")
}
Boundary(L4, "Tests", "layer") {
Component(M4_0, "backend", "Java, Python", "4 files")
Component(M4_1, "maestro-app", "React", "1 files")
}
Boundary(L5, "Build, CI and hosting", "layer") {
Component(M5_0, "(root)", "Dockerfile, .backend, .frontend", "4 files")
Component(M5_1, ".github", ".yml", "1 files")
}
}
@enduml
UML 4 · Code
Selected declarations, fields and methods grouped by source file. No inheritance or call edges are inferred. Rendered with uml-mcp.
PlantUML source
@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. Public interface
Outside code can use everything listed here. The project also declares 8 public types.
UML Use cases
Each actor is a kind of caller, linked to what it can ask the project to do. Rendered with uml-mcp.
PlantUML source
@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 "HTTP client" as A_http
rectangle "Maestro" {
usecase "POST /convert" as U0
usecase "GET /health" as U1
}
A_http --> U0
A_http --> U1
@enduml
HTTP routes 2
| Method | Path | Source |
|---|---|---|
| POST | /convert | backend/src/main/java/PFE008/backend/ConvertController.java:46 |
| GET | /health ops | backend/src/main/java/PFE008/backend/ConvertController.java:123 |
Routes marked ops expose health, status or admin endpoints; restrict them in production.
7.4. Private interface
These names are internal by the language’s conventions: a leading underscore, private, static or pub(crate).
- private / internal method
- 2
convertMxlToMidibackend/src/main/java/PFE008/backend/AudiverisController.java:125deleteFilesInDirectorybackend/src/main/java/PFE008/backend/FileUtil.java:87
7.5. Services
Controller 2
AudiverisControllerconvert, convertMxlToMidiConvertControllerconvert, healthCheck
7.6. Entities and data model 3
Mermaid Entity class diagram
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
}
An arrow links a field to the entity its type names.
| Entity | Kind | First fields |
|---|---|---|
MusicSheetUploadFormFooterProps | Record or interface | canResetForm, file, loading, reset |
UseMaestroClientResult | Record or interface | loading, error, convert |
MusicSheetUploaderProps | Record or interface | onFileChange, file |
7.7. Business logic
Once UI code and the services and entities above are set aside, these classes have the most methods.
ConversionResponseCore source, 6 methodsgetFileName, setFileName, getDownloadUri, setDownloadUri, getSize, setSizeFileUtilCore source, 5 methodssaveFile, getFileAsResource, isValidFile, cleanupDirectories, deleteFilesInDirectory
7.8. External integrations
HTTP clients
7.9. Stack and dependencies
JVM (Gradle) backend/build.gradle 4 runtime, 4 dev
Node.js maestro-app/package.json 27 runtime, 1 dev
External dependencies
36 declared packages (31 runtime, 5 development) in backend/build.gradle, maestro-app/package.json.
Package table 36
| Package | Version | Scope | Purpose | Registry |
|---|---|---|---|---|
org.springframework.boot:spring-boot-starter-web | — | runtime | Web framework | central.sonatype.com |
org.apache.commons:commons-lang3 | — | runtime | — | central.sonatype.com |
org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0 | — | runtime | — | central.sonatype.com |
org.apache.tika:tika-core:2.9.2 | — | runtime | — | central.sonatype.com |
org.springframework.boot:spring-boot-starter-test | — | development | Testing | central.sonatype.com |
org.junit.jupiter:junit-jupiter-api:5.9.3 | — | development | — | central.sonatype.com |
org.mockito:mockito-core:5.2.0 | — | development | — | central.sonatype.com |
org.mockito:mockito-junit-jupiter:5.2.0 | — | development | — | central.sonatype.com |
@emotion/react | ^11.11.4 | runtime | > Simple styling in React. | npmjs.com |
@emotion/styled | ^11.11.5 | runtime | styled API for emotion | npmjs.com |
@fontsource/roboto | ^5.0.13 | runtime | Self-host the Roboto font in a neatly bundled NPM package. | npmjs.com |
@hookform/resolvers | ^3.9.0 | runtime | React Hook Form validation resolvers: Yup, Joi, Superstruct, Zod, Vest, Class Validator, io-ts, Nope, computed-types, TypeBox, arktype, Typa | npmjs.com |
@mui/icons-material | ^5.15.19 | runtime | User interface | npmjs.com |
@mui/lab | ^5.0.0-alpha.170 | runtime | User interface | npmjs.com |
@mui/material | ^5.15.19 | runtime | User interface | npmjs.com |
@testing-library/jest-dom | ^5.17.0 | runtime | Testing | npmjs.com |
@testing-library/react | ^13.4.0 | runtime | Testing | npmjs.com |
@testing-library/user-event | ^13.5.0 | runtime | Testing | npmjs.com |
@types/jest | ^27.5.2 | runtime | Type checking | npmjs.com |
@types/node | ^16.18.97 | runtime | Type checking | npmjs.com |
@types/react | ^18.3.3 | runtime | Type checking | npmjs.com |
@types/react-dom | ^18.3.0 | runtime | Type checking | npmjs.com |
i18next | ^23.11.5 | runtime | i18next internationalization framework | npmjs.com |
i18next-browser-languagedetector | ^8.0.0 | runtime | language detector used in browser environment for i18next | npmjs.com |
i18next-http-backend | ^2.5.2 | runtime | i18next-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.12 | runtime | Javascript function that triggers browser to save javascript-generated content to a file | npmjs.com |
react | ^18.3.1 | runtime | User interface | npmjs.com |
react-dom | ^18.3.1 | runtime | User interface | npmjs.com |
react-dropzone | ^14.2.3 | runtime | User interface | npmjs.com |
react-hook-form | ^7.51.5 | runtime | User interface | npmjs.com |
react-i18next | ^14.1.2 | runtime | User interface | npmjs.com |
react-scripts | 5.0.1 | runtime | User interface | npmjs.com |
typescript | ^4.9.5 | runtime | Type checking | npmjs.com |
web-vitals | ^2.1.4 | runtime | Easily measure performance metrics in JavaScript | npmjs.com |
yup | ^1.4.0 | runtime | Data validation | npmjs.com |
@babel/plugin-proposal-private-property-in-object | ^7.21.11 | development | Build tooling | npmjs.com |
7.10. CI/CD pipeline
1 GitHub Actions workflow, 1 job. Each box is a job; double-bordered boxes publish or deploy, and arrows follow needs.
Mermaid Pipeline flow
flowchart LR
subgraph wf0["CI"]
direction LR
wf0_build["build<br/>ubuntu-latest"]
end
t0(["push · pull request"])
t0 --> wf0_build
| Workflow | Triggers | Jobs | Publishes to |
|---|---|---|---|
CI.github/workflows/ci.yml | push, pull request |
| — |
7.11. Deployment
Mermaid Deployment diagram
flowchart LR
repo[("GitHub repository")]
ci[["GitHub Actions<br/>1 workflow"]]
image["Docker image<br/>FROM ubuntu:latest"]
subgraph compose["Docker Compose"]
svc_maestro_backend["maestro-backend"]
svc_maestro_frontend["maestro-frontend"]
end
repo -->|"push or pull request"| ci
ci -->|"docker build"| image
image -->|"docker compose up"| compose
UML Deployment
The outer node is where the code runs. Each base image points to what it builds, solid arrows lead to databases and dashed ones to outside services. Rendered with uml-mcp.
PlantUML source
@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 : builds
artifact "FROM ubuntu:latest" as IMG1
IMG1 ..> N0 : builds
artifact "FROM ubuntu:latest" as IMG2
IMG2 ..> N0 : builds
@enduml
Where it runs
Compose services
maestro-backend maestro-frontend
Docker base images
7.12. Monitoring
What the code logs, measures and exposes to tell whether it is working.
Health and metrics routes
Container health checks
7.13. Security
Controls
Supply chain
Environment variables 1
The page lists names without their values and underlines the ones that look like secrets.
7.14. Testing
- Test files
- 5
- Source files
- 26
- Test cases, about
- 22
- Unit tests
- 4
- Integration tests
- 1
No measured coverage report in the analyzed sources.
Where the tests are
backend/src/test/java/PFE008/backend 4 maestro-app/src 1
Continuous integration
- CI
gradle test
UML CI pipeline
The main GitHub Actions workflow runs these steps. Jobs that run in parallel sit side by side. Rendered with uml-mcp.
PlantUML source
@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
Nothing found for: Database.
8. Types and file structure
12 declared types, with 12 in the base-relationship overview.
Type diagram
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
Unresolved bases remain labelled; full signatures are not reconstructed.
9. Reference
32 / 32 eligible files read (128 in the tree); 0 oversized, 0 failed reads and 0 syntax diagnostics.
What the scan covers
Known dependency/build folders, credential files and binaries are excluded. The scan covers READMEs, recognized manifests and parser-supported source files.
Linguist statistics cover the whole repository and may include other languages.
11. Files to read 4
12. Glossary
Repository
The versioned source files, configuration, and history of a project.
README
The repository’s entry document, usually covering its purpose and initial setup.
Dependency
A library, tool, or service that another component needs to build or run.
HTTP
A request-and-response protocol used by browsers and web services. A method, path, headers, and optional body describe a request.
Container
An isolated process environment created from an image. Persistent data needs storage outside the container’s disposable filesystem.
Published port
A host port mapped to a service’s container port. Publishing a port can expose that service beyond its container network.
CLI
A text interface in which commands and arguments select operations. Exit codes let scripts detect success or failure.
Build
The steps that turn source files and dependencies into a runnable program or distributable artifact.
Backend
An implementation behind a shared interface. Depending on context, it can mean a server-side service or a graphics, input, or storage implementation.
Firmware
Software running on a device or microcontroller to control its hardware and communication.
Fork
A separate repository derived from another project. A change in a fork is not automatically a change in the upstream project.
13. References
- antoinebou12. (2026, November 5). Maestro. [Software repository] github.com.
- antoinebou12. (2026, November 5). Maestro: README. [Repository documentation] github.com.
- antoinebou12. (2026, November 5). backend/src/main/java/PFE008/backend/ConvertController.java. [Source file] github.com.
- antoinebou12. (2026, November 5). backend/src/main/java/PFE008/backend/AudiverisController.java. [Source file] github.com.
- antoinebou12. (2026, November 5). backend/src/main/MxlToMidi.py. [Source file] github.com.
- antoinebou12. (2026, November 5). maestro-app/package.json. [Source file] github.com.
- Boucher, A. (2026, October 23). Maestro: Sheet music through an external conversion pipeline. [Project article] antoineboucher.info.
Sources without a publication date show the date they were last checked, November 5, 2026. File links retain the inspected revision where available.