In breve

spArtitI è una (web)app (Python/FastAPI e Next.js) basata su software open source che trasforma l'URL di un video YouTube, un MP4 o un MP3 di pianoforte — solo o in un mix, anche solo uno spezzone — in MP3, MIDI, MusicXML e PDF con diteggiatura proposta. La sequenza di operazioni che esegue è: estrazione dell'audio con yt-dlp e FFmpeg, separazione facoltativa del pianoforte con Demucs, trascrizione con Transkun, partitura con music21 e PDF con MuseScore 4. Su un brano reale di 6,7 minuti la pipeline impiega circa 100 secondi su una GPU RTX 4070 con 8 GB di VRAM, circa 3,5 volte di più su CPU. Da poco accetta anche un PDF di spartito (anche scansionato) o un'immagine, riconosciuti con homr (OMR open source) e poi trattati come un MusicXML in ingresso. I limiti sono dichiarati:

La sequenza di operazioni di spartiti Sorgente (URL YouTube, MP4 o MP3), audio con yt-dlp e FFmpeg, separazione facoltativa con Demucs, trascrizione con Transkun in MIDI, partitura MusicXML con music21, PDF con MuseScore 4, player sincronizzato. Sorgente URL YouTube · MP4 · MP3 (Inizio/Fine) 1 · Audio yt-dlp + FFmpeg → MP3 2 · Separazione (facoltativa) Demucs htdemucs_6s → pianoforte isolato 3 · Trascrizione Transkun → MIDI 4 · Partitura music21 → MusicXML, diteggiatura 5 · PDF MuseScore 4 da riga di comando Player sincronizzato spartito che scorre · tastiera 88 tasti · pedale
La sequenza di operazioni di spArtitI; il passo tratteggiato è facoltativo
L'interfaccia di spartiti in tema scuro: i sei passi della pipeline, il campo per l'URL YouTube con Inizio e Fine, il caricamento di un MP3 o MP4 e il pannello Job
L'interfaccia di spArtitI: l'indirizzo del video, lo spezzone, i sei passi e il pannello Job — clic per ingrandire
Parte 1 · Il problema

Ascoltare un brano e volerlo suonare.

Sono un pianista autodidatta e lo scorso anno ho deciso di frequentare un breve corso (16 lezioni di 2 ore) sul pianoforte, la sua storia, la musica classica… e un po' di pratica sullo strumento. E dopo il corso…

Capita a chiunque suoni: senti un pezzo per pianoforte, magari in un video, e vorresti avere lo spartito davanti. A volte esiste, a volte costa, a volte è la trascrizione di qualcun altro che non somiglia a quello che stai ascoltando. La domanda è se un computer possa ascoltare e scrivere al posto tuo.

Trascrivere musica da un file audio è difficile per una ragione semplice: l'audio è un'unica onda in cui tutte le note, i pedali, il riverbero della sala e gli altri strumenti sono già mescolati. Il pianoforte poi complica le cose, perché suona molte note insieme e il pedale le tiene vive anche dopo che il tasto è stato rilasciato. Una nota che nello spartito dura una semiminima, nella registrazione può risuonare molto più a lungo.

Cos'è un brano musicale per un computer

Un brano musicale è un segnale acustico multidimensionale composto da:

Come faccio di solito, se non trovo l'applicazione giusta me la scrivo (o meglio la faccio scrivere alla AI) : non volevo usare un servizio esterno e non volevo che si fermasse al MIDI: il MIDI da solo non si legge, e un MIDI «grezzo» trasformato in partitura produce di solito pagine illeggibili. Servivano uno spartito vero, con la diteggiatura, e un modo per ascoltarlo e correggerlo.

Il player di spartiti in tema scuro: pannello Correzioni con una nota selezionata, spartito con diteggiatura, tastiera a 88 tasti e indicatore del pedale
Le correzioni, lo spartito con le dita e la tastiera con il pedale — clic per ingrandire
✦
Parte 2 · La catena

Da un URL a un PDF in cinque passi.

Ogni passo della pipeline legge e scrive file, e si può provare da solo. Questo è il percorso completo, dall'indirizzo del video al foglio da mettere sul leggio.

1. Audio

Da un URL, yt-dlp e FFmpeg scaricano il video (al più 720p) e ne estraggono l'audio in MP3; da un MP4 o un MP3 caricato si parte direttamente da lì. Puoi indicare un Inizio e una Fine per lavorare solo su uno spezzone, e ottieni anche il video ritagliato.

2. Separazione (se serve)

Se il brano non è per pianoforte solo, Demucs (htdemucs_6s) divide l'audio in sei tracce — voce, batteria, basso, chitarra, pianoforte, altro — e isola il pianoforte. In modalità automatica l'app misura quanta energia ha la traccia del pianoforte e, se supera il 90%, usa direttamente l'audio originale.

3. Trascrizione

Transkun (licenza MIT, motore predefinito) trasforma l'audio in MIDI: quali note, quando iniziano, quanto durano, con che intensità. In alternativa si può scegliere il modello di ByteDance.

4. Partitura

music21 costruisce il MusicXML: divide le mani, quantizza il ritmo, stima la tonalità, aggiunge dinamiche, pedale e diteggiatura. Qui si decide anche il tempo, ed è il passo più delicato (ne parlo nella Parte 3).

5. PDF

MuseScore 4, da riga di comando, impagina la partitura in PDF. Nel browser lo spartito si vede con OpenSheetMusicDisplay, che alimenta il player.

yt-dlp + FFmpeg — audio e video
Demucs — separazione delle tracce
Transkun — audio in MIDI
music21 — MIDI in partitura
MuseScore 4 — PDF
Cos'è il MIDI

Il MIDI (Musical Instrument Digital Interface) non contiene suono: contiene istruzioni, come uno spartito per macchine. Per ogni nota dice quale tasto, quando inizia, quanto dura e con che intensità è stato premuto, più eventi come il pedale. Per questo un file MIDI pesa pochi kilobyte, si può far suonare da qualunque strumento virtuale e si può correggere nota per nota, cosa impossibile con un MP3. È il ponte tra l'audio, che il trascrittore ascolta, e la partitura, che music21 scrive.

Quale motore di trascrizione? Un confronto su tre brani veri.

Prima di scegliere ho fatto un confronto A/B su tre brani reali: La cura di Franco Battiato, In The Air Tonight di Phil Collins e Una lunga storia d'amore di Gino Paoli. Ha vinto Transkun applicato al pianoforte isolato da Demucs. Un'altra strada, togliere solo la voce dal mix con BS-RoFormer e trascrivere il resto, non ha migliorato il risultato e costa circa una volta la durata del brano, quindi non è entrata nella pipeline.

Pianoforte solo

Trascrizione diretta

  • Nessuna separazione: l'audio va dritto al trascrittore
  • Il trascrittore riceve l'audio originale, senza gli artefatti della separazione
  • Più veloce: manca il passo Demucs
Mix con altri strumenti

Separazione + trascrizione

  • Demucs isola il pianoforte, che resta «sporco»
  • Transkun scrive da 2 a 8 volte meno note del modello ByteDance ed è stabile
  • La separazione aggiunge circa il 10–20% della durata del brano su GPU

C'è un dettaglio che ha fatto la differenza anche sul pianoforte solo. Transkun scrive la durata reale del tasto, non quella della nota percepita sotto il pedale. Senza correzione, su un brano di pianoforte solo la durata mediana delle note era di 0,23 secondi contro gli 0,83 della versione corretta: una partitura spezzettata in note brevissime. Per questo l'app allunga le note rilasciate mentre il pedale è premuto.

✦
Parte 3 · Il tempo

Il giorno in cui il Clementi suonava a 108 invece che a 205.

Per scrivere uno spartito serve il tempo, cioè quanti battiti al minuto (BPM). L'app stima questo valore analizzando l'audio attraverso due indizi principali: la frequenza delle note (il ritmo dei singoli attacchi) e la cadenza dei cambi armonici (ogni quanto varia l'accordo). Sui brani provati la stima dà 95 per In The Air Tonight, 61 per Una lunga storia d'amore, 90 per La cura e 70 per A Whiter Shade of Pale. Il beat tracking standard di librosa sul mix, per La cura, dava invece 129.

Poi, il 20 ottobre 2026, ho provato la Sonatina op. 36 n. 1 di Clementi, un pezzo vivace, e la stima è uscita a 108 BPM. Il PDF si riempiva di crome e semicrome, illeggibile.

Dove stava l'errore

Ho misurato gli attacchi: Do a 0,98 s, Mi a 1,28, Do a 1,39, Sol a 1,53, Sol a 1,84, Do a 2,15. Una battuta dura 1,17 s, quindi una semiminima circa 0,29 s: circa 205 BPM, non 108. La stima era giusta nel metodo e sbagliata nel risultato perché la ricerca era limitata a 60–180 BPM, e il tempo vero, fuori dall'intervallo, veniva dimezzato.

È bastato alzare il limite superiore a 240 BPM per far saltare la stima del Clementi da 108 a 214 BPM, lasciando intatti i risultati degli altri quattro brani. Il problema stava tutto lì: bloccando la ricerca a 180 BPM, l'algoritmo veniva forzato a dimezzare il tempo reale, anche se il punteggio di questa metà era appena il 43% rispetto a quello del tempo vero.

Una bella lezione: i parametri tarati solo su pochi brani lenti si rompono al primo pezzo veloce. In fondo, le stime automatiche restano sempre un punto di partenza. Non a caso nell'app il campo BPM si può correggere a mano, con i tasti rapidi ÷2 e ×2 per sistemare al volo i raddoppi e i dimezzamenti tipici dei brani in 2/2.

Un numero che funziona su cinque brani non è una legge: è un'ipotesi in attesa del sesto.

E il rubato? Un metronomo che si riaggancia.

Nessuno suona a tempo perfettamente costante. Per questo la partitura non usa un metronomo rigido: un metronomo adattivo (un anello ad aggancio di fase) si riallinea agli attacchi che cadono vicino alla griglia delle crome e corregge il periodo man mano, entro il ±25% del tempo iniziale. Le costanti sono state tarate sul Clementi stesso: i due passaggi del primo ritornello, trascritti separatamente, coincidono al 99% per posizione e altezza delle note. Il player usa la stessa mappa, quindi cursore e spartito restano allineati anche quando chi suona accelera o rallenta.

Due spartiti del Clementi op. 36 n. 1: con il tempo stimato a 108 BPM, pieno di crome e semicrome, e con il tempo corretto a 214 BPM, molto più leggibile
Il Clementi con la stima a 108 BPM (sopra) e a 214 BPM (sotto) — clic per ingrandire
✦
Parte 4 · Le dita

Una proposta di diteggiatura, non un'edizione.

Per ogni mano l'app sceglie le dita con un algoritmo di Viterbi: cerca il percorso di diteggiatura che, su tutta la frase, minimizza le estensioni della mano, gli incroci e i salti. I pesi sono euristici e stanno in cima al modulo. La diteggiatura viene aggiunta a livello di accordo, una per ogni altezza; con più di cinque note nello stesso accordo non ne assegna nessuna.

Va detto chiaramente: è una proposta. Non sostituisce quella di un'edizione curata da un pianista, che tiene conto della musica, non solo della geometria della mano. Serve a darti un punto di partenza che puoi correggere nota per nota.

✦
Parte 5 · Correggere e riascoltare

L'editor, il player e un pianoforte nel browser.

La trascrizione automatica è imperfetta, e fingere il contrario sarebbe disonesto. Per questo, dopo l'elaborazione, l'app non si ferma al PDF:

Il pannello delle correzioni di spartiti in tema scuro: comandi di ascolto, spostamento, altezza, durata, nota e cronologia (Annulla, Ripeti, Azzera modifiche, Salva modifiche), con sotto lo spartito e la tastiera
Il pannello delle correzioni, con lo spartito e la tastiera sotto — clic per ingrandire

Fermare un'elaborazione lunga

Un brano lungo occupa l'unica coda di lavoro e, all'inizio, non c'era modo di fermarlo se non riavviare il server, perdendo tutti i job. Oggi il pannello Job elenca quelli noti al server — in coda, in corso (con passo e percentuale), finiti, in errore, interrotti — e il pulsante Interrompi ferma un job in pochi secondi, libera la GPU e cancella i file temporanei, come i download parziali. Un job interrotto non è un errore e non offre file.

I job finiti, in errore o interrotti si possono togliere dall'elenco (Rimuovi) o eliminare insieme alla loro cartella sul disco (Cancella, dopo una conferma). Le cartelle non modificate da più di un giorno si cancellano da sole all'avvio del server e a ogni nuovo job, mai quelle dei job in corso o in coda; il limite si cambia con una variabile d'ambiente. Al primo avvio con questa regola sono sparite 34 cartelle su 50, da circa 923 a 311 MB.

L'interruzione è cooperativa: ogni job ha un proprio token e i passi lo controllano. Un sottoprocesso come FFmpeg o MuseScore viene terminato, la separazione si ferma tra un blocco da 60 secondi e il successivo, la trascrizione controlla a ogni segmento.

L'interfaccia è in italiano, inglese e spagnolo, con tema automatico, chiaro o scuro e note scritte come Do Re Mi oppure come A B C.

✦
Parte 6 · Dalla carta

Anche da un PDF o dalla foto di uno spartito.

Finora spArtitI partiva sempre dall'audio. Ora si può trascinare nell'app anche un PDF di spartito (anche scansionato) o un'immagine (.png, .jpg, .jpeg). Un passo nuovo, Riconoscimento, trasforma le pagine in MusicXML con homr, un software open source di riconoscimento ottico della musica (OMR, con modelli ONNX). Da lì il percorso è quello del MusicXML in ingresso: spartito con diteggiatura proposta, tastiera virtuale, editor, PDF e pianoforte sintetico nel browser. Non c'è un audio originale: si ascolta solo il pianoforte sintetizzato.

Cos'è l'OMR

L'OMR (Optical Music Recognition, riconoscimento ottico della musica) è l'equivalente dell'OCR per la notazione musicale: prende l'immagine di uno spartito — scansione, foto o PDF — e la trasforma in un formato che il computer capisce, come il MusicXML. Deve riconoscere righi, chiavi, armature, note (altezza e durata), pause, legature e ritornelli. È più difficile dell'OCR perché il significato di un simbolo dipende dalla posizione e dal contesto, i simboli si sovrappongono e il ritmo va sommato dentro la battuta: per questo sbaglia più spesso i ritmi che le altezze. È un problema diverso dalla trascrizione audio: Transkun ascolta un brano e scrive le note, homr guarda una pagina già scritta.

Come funziona: omr.py converte il PDF in immagini in scala di grigi a 200 dpi con PyMuPDF (lato lungo al massimo 4000 pixel) e passa ogni pagina a homr. Le pagine, fino a 30, vengono unite in ordine in un solo spartito e la numerazione delle battute continua. I ritornelli di fine senza un inizio corrispondente sono corretti, altrimenti il player suonerebbe di nuovo le pagine precedenti. Una pagina illeggibile o vuota si salta con un avviso; l'errore scatta solo se nessuna pagina viene riconosciuta. Il titolo è il nome del file, perché l'OCR del titolo sbaglia spesso. Per l'app è un nuovo tipo di job, con i passi riconoscimento, partitura e PDF.

Un riconoscimento da controllare

L'OMR sbaglia soprattutto i ritmi (arpeggi tra i righi, due voci) e meno le altezze. Per questo, a job finito, l'app mostra un riquadro ambra con l'avviso «Riconoscimento automatico: controlla ritmi e battute» e il pulsante per scaricare il MusicXML riconosciuto. All'inizio era una riga grigia piccola: troppo facile non vederla. Il percorso consigliato per un risultato esatto è scansione, riconoscimento, correzione in MuseScore e ricarica del MusicXML corretto. Non riporto percentuali di accuratezza perché non le ho misurate: su tre pagine reali la catena ha prodotto 534 note.

Anche homr usa la GPU: misurato su una pagina, l'inferenza per rigo impiega 0,44 secondi su una RTX 4070 contro 2,0 su CPU, e una pagina costa circa 16–18 secondi con l'avvio compreso (su CPU la prima misura era di circa 1 minuto e 44 secondi a pagina). Al primo uso si scaricano circa 130 MB di pesi, quindi serve la rete.

Poi c'è una domanda nata proprio dall'OMR: homr riconosce le legature di frase (poco affidabili) e non il pedale, mentre il percorso «da spartito» scartava comunque entrambi. Ora l'app legge dal MusicXML pedale e legature di frase. La sorpresa tecnica: expandRepeats() di music21 scollega questi segni dalle note (l'ho verificato su un file di prova), quindi si leggono dal file non espanso e si riportano sulle ripetizioni in base al numero di battuta. Il pedale arriva a timeline, tastiera, pianoforte sintetico e PDF; le legature a PDF e spartito mostrato, senza cambiare il suono. Una nota cancellata dall'editor porta via la sua legatura.

✦
Parte 7 · Limiti e scelte

Cosa non fa, e perché gira tutto in locale.

Preferisco un elenco di limiti scritto oggi a una sorpresa tra sei mesi. Questi sono quelli noti:

Quanto alla scelta del locale: l'app si avvia con uv run spartiti-serve (oppure con lo script avvia.bat) e il server ascolta solo su 127.0.0.1. La musica non passa da nessun servizio di trascrizione esterno. La rete serve per scaricare il video da YouTube, per il modello Demucs (circa 300 MB, al primo uso) e per i campioni del pianoforte (una volta sola). Un promemoria che vale sempre: scarica soltanto contenuti di cui hai diritto di fare una copia personale, nel rispetto dei termini di YouTube e del diritto d'autore.

Per ora, quindi, spArtitI gira in locale, sul mio computer. In futuro potrà essere spostata sui server virtuali già in funzione, la cui architettura è descritta in Due VPS, una GPU che si sveglia da sola: un server ARM64 sempre acceso e una GPU A10 che parte solo quando serve.

✦
Nota sul metodo

Come è stato costruito.

spArtitI è sviluppato con Claude Code, partendo da una specifica e da un piano scritti prima del codice. Usa soltanto librerie open source. Per l'ingresso da PDF ho seguito lo stesso schema (brainstorming, specifica, piano, un implementatore e un revisore per ogni task): la revisione finale dell'intero ramo ha trovato quattro problemi importanti che le revisioni dei singoli task non avevano visto — ritornelli che fanno suonare di nuovo le pagine precedenti, titolo preso dall'OCR, PNG trasparenti, pagina vuota. L'episodio del Clementi insegna comunque che i test su dati preparati non sostituiscono la prova su un brano vero, mai visto prima.

✦
FAQ

Domande frequenti.

Come si trasforma un video di YouTube in uno spartito?

Con spArtitI incolli l'URL del video (facoltativamente indichi Inizio e Fine dello spezzone): l'app estrae l'audio, lo trascrive in MIDI con Transkun e produce MusicXML e PDF con diteggiatura proposta. Su un brano di 6,7 minuti servono circa 100 secondi su una GPU RTX 4070.

Funziona anche con brani con più strumenti?

Sì, ma con risultati più incerti. Demucs isola prima il pianoforte dal mix, però la traccia risultante contiene artefatti e il trascrittore può inventare o perdere note. Funziona meglio con il pianoforte solo; sui mix conviene giudicare il risultato all'orecchio.

Quanto è accurata la trascrizione?

È buona ma imperfetta, e per questo l'app include un editor. Il confronto su tre brani reali ha premiato Transkun sul pianoforte isolato: scrive da 2 a 8 volte meno note del modello ByteDance ed è stabile. Il tempo è stimato e si corregge a mano.

Posso correggere lo spartito?

Sì. Puoi modificare una nota alla volta (altezza, durata, mano, dito), eliminarla o aggiungerne una, con «Annulla» e «Ripeti», anche da tablet grazie ai comandi a pulsanti. «Salva modifiche» rigenera PDF, MusicXML e MIDI con le correzioni. L'MP3 e il video non cambiano.

La diteggiatura è affidabile?

È una proposta calcolata con un algoritmo di Viterbi che riduce estensioni, incroci e salti della mano. Non sostituisce la diteggiatura di un'edizione curata da un pianista: usala come punto di partenza.

Posso interrompere un'elaborazione lunga?

Sì. Il pannello Job elenca i job in coda, in corso, finiti, in errore e interrotti, e «Interrompi» ferma un job in pochi secondi, libera la GPU e cancella i file temporanei. Fa eccezione il download da URL con Inizio e Fine, che si ferma solo quando termina.

Posso partire da un PDF o dalla foto di uno spartito?

Sì. Trascini nell'app un PDF (anche scansionato, fino a 30 pagine) o un'immagine PNG o JPG: homr riconosce le pagine e le trasforma in MusicXML, poi il percorso è quello dello spartito con diteggiatura proposta, editor e PDF. L'OMR sbaglia soprattutto i ritmi, quindi conviene scaricare il MusicXML riconosciuto, correggerlo in MuseScore e ricaricarlo.

Serve una GPU? I miei dati restano sul mio computer?

Una GPU NVIDIA non è obbligatoria: senza, l'app usa la CPU ed è circa 3,5 volte più lenta. L'elaborazione avviene in locale e il server ascolta solo sul tuo computer; la rete serve soltanto per scaricare il video, il modello Demucs e i campioni del pianoforte.

✦
Demo

Guardalo all'opera.

▶ Demo
spArtitI — video dimostrativo
Dal link di YouTube allo spartito con la diteggiatura.