En breve

spArtitI es una (web)app (Python/FastAPI y Next.js) basada en software de código abierto que convierte la URL de un vídeo de YouTube, un MP4 o un MP3 de piano — solo o en una mezcla, incluso solo un fragmento — en MP3, MIDI, MusicXML y un PDF con digitación propuesta. La secuencia de operaciones que ejecuta es: extracción del audio con yt-dlp y FFmpeg, separación opcional del piano con Demucs, transcripción con Transkun, partitura con music21 y PDF con MuseScore 4. En una pieza real de 6,7 minutos el proceso tarda unos 100 segundos en una GPU RTX 4070 con 8 GB de VRAM, y unas 3,5 veces más en CPU. Ahora acepta también un PDF de partitura (incluso escaneado) o una imagen, reconocidos con homr (OMR de código abierto) y tratados después como un MusicXML de entrada. Los límites se declaran abiertamente:

La secuencia de operaciones de spartiti Origen (URL de YouTube, MP4 o MP3), audio con yt-dlp y FFmpeg, separación opcional con Demucs, transcripción con Transkun a MIDI, partitura MusicXML con music21, PDF con MuseScore 4, reproductor sincronizado. Origen URL de YouTube · MP4 · MP3 (Inicio/Fin) 1 · Audio yt-dlp + FFmpeg → MP3 2 · Separación (opcional) Demucs htdemucs_6s → piano aislado 3 · Transcripción Transkun → MIDI 4 · Partitura music21 → MusicXML, digitación 5 · PDF MuseScore 4 desde la línea de comandos Reproductor sincronizado partitura que avanza · teclado de 88 teclas · pedal
La secuencia de operaciones de spArtitI; el paso discontinuo es opcional
La interfaz de spartiti en tema oscuro: los seis pasos del proceso, el campo para la URL de YouTube con Inicio y Fin, la carga de un MP3 o MP4 y el panel de trabajos
La interfaz de spArtitI: la dirección del vídeo, el fragmento, los seis pasos y el panel de trabajos — clic para ampliar
Parte 1 · El problema

Escuchar una pieza y querer tocarla.

Soy pianista autodidacta y el año pasado decidí hacer un breve curso (16 clases de 2 horas) sobre el piano, su historia, la música clásica… y un poco de práctica con el instrumento. Y después del curso…

Le pasa a cualquiera que toque: oyes una pieza para piano, quizá en un vídeo, y te gustaría tener la partitura delante. A veces existe, a veces cuesta dinero, a veces es la transcripción de otra persona que no se parece a lo que estás escuchando. La pregunta es si un ordenador puede escuchar y escribir por ti.

Transcribir música a partir de un archivo de audio es difícil por una razón sencilla: el audio es una única onda en la que todas las notas, los pedales, la reverberación de la sala y los demás instrumentos ya están mezclados. Además, el piano complica las cosas, porque toca muchas notas a la vez y el pedal las mantiene vivas incluso después de soltar la tecla. Una nota que en la partitura dura una negra puede seguir sonando mucho más tiempo en la grabación.

Qué es una pieza musical para un ordenador

Una pieza musical es una señal acústica multidimensional compuesta por:

Como suelo hacer, si no encuentro la aplicación adecuada me la escribo yo (o mejor dicho, se la hago escribir a una IA): no quería usar un servicio externo y no quería que se quedara en el MIDI. El MIDI por sí solo no se lee, y un MIDI «en bruto» convertido en partitura suele producir páginas ilegibles. Necesitaba una partitura de verdad, con digitación, y una forma de escucharla y corregirla.

El reproductor de spartiti en tema oscuro: panel de correcciones con una nota seleccionada, partitura con digitación, teclado de 88 teclas e indicador del pedal
Las correcciones, la partitura con los dedos y el teclado con el pedal — clic para ampliar
✦
Parte 2 · La cadena

De una URL a un PDF en cinco pasos.

Cada paso del proceso lee y escribe archivos, y se puede probar por separado. Este es el recorrido completo, desde la dirección del vídeo hasta la hoja que pones en el atril.

1. Audio

A partir de una URL, yt-dlp y FFmpeg descargan el vídeo (como máximo a 720p) y extraen su audio a MP3; con un MP4 o un MP3 cargado se parte directamente de ahí. Puedes indicar un Inicio y un Fin para trabajar solo con un fragmento, y obtienes también el vídeo recortado.

2. Separación (si hace falta)

Si la pieza no es para piano solo, Demucs (htdemucs_6s) divide el audio en seis pistas — voz, batería, bajo, guitarra, piano, otros — y aísla el piano. En modo automático la app mide cuánta energía tiene la pista del piano y, si supera el 90%, usa directamente el audio original.

3. Transcripción

Transkun (licencia MIT, motor predeterminado) convierte el audio en MIDI: qué notas, cuándo empiezan, cuánto duran, con qué intensidad. Como alternativa se puede elegir el modelo de ByteDance.

4. Partitura

music21 construye el MusicXML: separa las manos, cuantiza el ritmo, estima la tonalidad, añade dinámicas, pedal y digitación. Aquí se decide también el tempo, y es el paso más delicado (hablo de ello en la Parte 3).

5. PDF

MuseScore 4, desde la línea de comandos, maqueta la partitura en PDF. En el navegador la partitura se ve con OpenSheetMusicDisplay, que alimenta el reproductor.

yt-dlp + FFmpeg — audio y vídeo
Demucs — separación de pistas
Transkun — de audio a MIDI
music21 — de MIDI a partitura
MuseScore 4 — PDF
Qué es el MIDI

El MIDI (Musical Instrument Digital Interface) no contiene sonido: contiene instrucciones, como una partitura para máquinas. Para cada nota dice qué tecla, cuándo empieza, cuánto dura y con qué intensidad se pulsó, además de eventos como el pedal. Por eso un archivo MIDI pesa unos pocos kilobytes, lo puede tocar cualquier instrumento virtual y se puede corregir nota a nota, algo imposible con un MP3. Es el puente entre el audio, que escucha el transcriptor, y la partitura, que escribe music21.

¿Qué motor de transcripción? Una comparación con tres piezas reales.

Antes de elegir hice una comparación A/B con tres piezas reales: La cura de Franco Battiato, In The Air Tonight de Phil Collins y Una lunga storia d'amore de Gino Paoli. Ganó Transkun aplicado al piano aislado por Demucs. Otro camino, quitar solo la voz de la mezcla con BS-RoFormer y transcribir el resto, no mejoró el resultado y cuesta aproximadamente una vez la duración de la pieza, así que no entró en el proceso.

Piano solo

Transcripción directa

  • Sin separación: el audio va directo al transcriptor
  • El transcriptor recibe el audio original, sin los artefactos de la separación
  • Más rápido: falta el paso de Demucs
Mezcla con otros instrumentos

Separación + transcripción

  • Demucs aísla el piano, que sigue «sucio»
  • Transkun escribe entre 2 y 8 veces menos notas que el modelo de ByteDance y es estable
  • La separación añade alrededor del 10–20% de la duración de la pieza en GPU

Hay un detalle que marcó la diferencia incluso con piano solo. Transkun escribe la duración real de la tecla, no la de la nota percibida bajo el pedal. Sin corrección, en una pieza de piano solo la duración mediana de las notas era de 0,23 segundos frente a los 0,83 de la versión corregida: una partitura fragmentada en notas brevísimas. Por eso la app alarga las notas soltadas mientras el pedal está pisado.

✦
Parte 3 · El tempo

El día en que Clementi sonaba a 108 en lugar de a 205.

Para escribir una partitura hace falta el tempo, es decir, cuántos pulsos por minuto (BPM). La app estima este valor analizando el audio a través de dos indicios principales: la frecuencia de las notas (el ritmo de los ataques individuales) y la cadencia de los cambios armónicos (cada cuánto varía el acorde). En las piezas probadas la estimación da 95 para In The Air Tonight, 61 para Una lunga storia d'amore, 90 para La cura y 70 para A Whiter Shade of Pale. El beat tracking estándar de librosa sobre la mezcla, para La cura, daba en cambio 129.

Después, el 20 de octubre de 2026, probé la Sonatina op. 36 n.º 1 de Clementi, una pieza viva, y la estimación salió a 108 BPM. El PDF se llenó de corcheas y semicorcheas, ilegible.

Dónde estaba el error

Medí los ataques: 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. Un compás dura 1,17 s, por tanto una negra unos 0,29 s: unos 205 BPM, no 108. La estimación era correcta en el método e incorrecta en el resultado porque la búsqueda estaba limitada a 60–180 BPM, y el tempo verdadero, fuera del intervalo, se reducía a la mitad.

Bastó subir el límite superior a 240 BPM para que la estimación de Clementi saltara de 108 a 214 BPM, dejando intactos los resultados de las otras cuatro piezas. El problema estaba todo ahí: al bloquear la búsqueda en 180 BPM, el algoritmo se veía obligado a reducir a la mitad el tempo real, aunque la puntuación de esa mitad fuera apenas el 43% de la del tempo verdadero.

Una buena lección: los parámetros ajustados solo con unas pocas piezas lentas se rompen a la primera pieza rápida. Al fin y al cabo, las estimaciones automáticas siguen siendo siempre un punto de partida. No por casualidad, en la app el campo BPM se puede corregir a mano, con los botones rápidos ÷2 y ×2 para arreglar al instante los dobles y las mitades típicos de las piezas en 2/2.

Un número que funciona con cinco piezas no es una ley: es una hipótesis a la espera de la sexta.

¿Y el rubato? Un metrónomo que se vuelve a enganchar.

Nadie toca a un tempo perfectamente constante. Por eso la partitura no usa un metrónomo rígido: un metrónomo adaptativo (un bucle de enganche de fase) se realinea con los ataques que caen cerca de la cuadrícula de corcheas y corrige el período poco a poco, dentro del ±25% del tempo inicial. Las constantes se ajustaron con la propia pieza de Clementi: las dos pasadas del primer estribillo, transcritas por separado, coinciden en un 99% en posición y altura de las notas. El reproductor usa el mismo mapa, de modo que cursor y partitura siguen alineados incluso cuando quien toca acelera o frena.

Dos partituras de Clementi op. 36 n.º 1: con el tempo estimado en 108 BPM, llena de corcheas y semicorcheas, y con el tempo corregido a 214 BPM, mucho más legible
Clementi con la estimación a 108 BPM (arriba) y a 214 BPM (abajo) — clic para ampliar
✦
Parte 4 · Los dedos

Una propuesta de digitación, no una edición.

Para cada mano la app elige los dedos con un algoritmo de Viterbi: busca el recorrido de digitación que, en toda la frase, minimiza las extensiones de la mano, los cruces y los saltos. Los pesos son heurísticos y están al principio del módulo. La digitación se añade a nivel de acorde, una por cada altura; con más de cinco notas en el mismo acorde no asigna ninguna.

Hay que decirlo claramente: es una propuesta. No sustituye a la de una edición preparada por un pianista, que tiene en cuenta la música, no solo la geometría de la mano. Sirve para darte un punto de partida que puedes corregir nota a nota.

✦
Parte 5 · Corregir y volver a escuchar

El editor, el reproductor y un piano en el navegador.

La transcripción automática es imperfecta, y fingir lo contrario sería deshonesto. Por eso, después del procesamiento, la app no se queda en el PDF:

El panel de correcciones de spartiti en tema oscuro: comandos de escucha, desplazamiento, altura, duración, nota e historial (Deshacer, Rehacer, Restablecer cambios, Guardar cambios), con la partitura y el teclado debajo
El panel de correcciones, con la partitura y el teclado debajo — clic para ampliar

Detener un procesamiento largo

Una pieza larga ocupa la única cola de trabajo y, al principio, no había forma de detenerla salvo reiniciando el servidor, perdiendo todos los trabajos. Hoy el panel Trabajos enumera los que conoce el servidor — en cola, en curso (con paso y porcentaje), terminados, con error, interrumpidos — y el botón Interrumpir detiene un trabajo en pocos segundos, libera la GPU y borra los archivos temporales, como las descargas parciales. Un trabajo interrumpido no es un error y no ofrece archivos.

Los trabajos terminados, con error o interrumpidos se pueden quitar de la lista (Quitar) o eliminar junto con su carpeta en el disco (Borrar, tras una confirmación). Las carpetas no modificadas desde hace más de un día se borran solas al iniciar el servidor y con cada trabajo nuevo, nunca las de los trabajos en curso o en cola; el límite se cambia con una variable de entorno. En el primer arranque con esta regla desaparecieron 34 carpetas de 50, de unos 923 a 311 MB.

La interrupción es cooperativa: cada trabajo tiene su propio token y los pasos lo comprueban. Un subproceso como FFmpeg o MuseScore se termina, la separación se detiene entre un bloque de 60 segundos y el siguiente, y la transcripción comprueba en cada segmento.

La interfaz está en italiano, inglés y español, con tema automático, claro u oscuro, y las notas escritas como Do Re Mi o como A B C.

✦
Parte 6 · Desde el papel

También desde un PDF o una foto de la partitura.

Hasta ahora spArtitI partía siempre del audio. Ahora también se puede arrastrar a la app un PDF de partitura (incluso escaneado) o una imagen (.png, .jpg, .jpeg). Un paso nuevo, Reconocimiento, convierte las páginas en MusicXML con homr, un software de código abierto de reconocimiento óptico de música (OMR, con modelos ONNX). A partir de ahí el camino es el del MusicXML de entrada: partitura con digitación propuesta, teclado virtual, editor, PDF y piano sintetizado en el navegador. No hay audio original: solo se escucha el piano sintetizado.

Qué es el OMR

El OMR (Optical Music Recognition, reconocimiento óptico de música) es el equivalente del OCR para la notación musical: toma la imagen de una partitura — un escaneo, una foto o un PDF — y la convierte en un formato que el ordenador entiende, como el MusicXML. Debe reconocer pentagramas, claves, armaduras, notas (altura y duración), silencios, ligaduras y ritornelos. Es más difícil que el OCR porque el significado de un símbolo depende de la posición y del contexto, los símbolos se superponen y el ritmo hay que sumarlo dentro del compás: por eso falla más en los ritmos que en las alturas. Es un problema distinto de la transcripción de audio: Transkun escucha una pieza y escribe las notas, homr mira una página que ya está escrita.

Cómo funciona: omr.py convierte el PDF en imágenes en escala de grises a 200 dpi con PyMuPDF (lado largo de 4000 píxeles como máximo) y pasa cada página a homr. Las páginas, hasta 30, se unen en orden en una sola partitura y la numeración de los compases continúa. Los ritornelos de final sin un inicio correspondiente se corrigen; si no, el reproductor volvería a tocar las páginas anteriores. Una página ilegible o vacía se omite con un aviso; el error solo salta si no se reconoce ninguna página. El título es el nombre del archivo, porque el OCR del título falla a menudo. Para la app es un nuevo tipo de trabajo, con los pasos reconocimiento, partitura y PDF.

Un reconocimiento que hay que revisar

El OMR falla sobre todo en los ritmos (arpegios entre pentagramas, dos voces) y menos en las alturas. Por eso, al terminar el trabajo, la app muestra un recuadro ámbar con un aviso para revisar ritmos y compases y el botón para descargar el MusicXML reconocido. Al principio era una línea gris pequeña: demasiado fácil de pasar por alto. El camino recomendado para un resultado exacto es escaneo, reconocimiento, corrección en MuseScore y recarga del MusicXML corregido. No cito porcentajes de precisión porque no los he medido: en tres páginas reales la cadena produjo 534 notas.

homr también usa la GPU: medido en una página, la inferencia por pentagrama tarda 0,44 segundos en una RTX 4070 frente a 2,0 en CPU, y una página cuesta unos 16–18 segundos con el arranque incluido (en CPU la primera medición fue de aproximadamente 1 minuto y 44 segundos por página). En el primer uso se descargan unos 130 MB de pesos, así que hace falta red.

Después vino una pregunta nacida del propio OMR: homr reconoce las ligaduras de frase (con poca fiabilidad) y no el pedal, mientras que el camino «desde partitura» descartaba ambos de todos modos. Ahora la app lee del MusicXML el pedal y las ligaduras de frase. La sorpresa técnica: expandRepeats() de music21 desvincula estas marcas de las notas (lo comprobé con un archivo de prueba), así que se leen del archivo sin expandir y se trasladan a las repeticiones según el número de compás. El pedal llega a la línea de tiempo, al teclado, al piano sintetizado y al PDF; las ligaduras, al PDF y a la partitura mostrada, sin cambiar el sonido. Una nota borrada en el editor se lleva consigo su ligadura.

✦
Parte 7 · Límites y decisiones

Lo que no hace, y por qué todo funciona en local.

Prefiero una lista de límites escrita hoy a una sorpresa dentro de seis meses. Estos son los conocidos:

En cuanto a la decisión de trabajar en local: la app se inicia con uv run spartiti-serve (o con el script avvia.bat) y el servidor escucha solo en 127.0.0.1. La música no pasa por ningún servicio de transcripción externo. La red hace falta para descargar el vídeo de YouTube, para el modelo Demucs (unos 300 MB, en el primer uso) y para las muestras del piano (una sola vez). Un recordatorio que siempre vale: descarga solo contenidos de los que tengas derecho a hacer una copia personal, respetando las condiciones de YouTube y los derechos de autor.

Por ahora, pues, spArtitI funciona en local, en mi ordenador. En el futuro podrá trasladarse a los servidores virtuales que ya están en funcionamiento, cuya arquitectura se describe en Dos VPS, una GPU que se despierta sola: un servidor ARM64 siempre encendido y una GPU A10 que arranca solo cuando hace falta.

✦
Nota sobre el método

Cómo se construyó.

spArtitI está desarrollado con Claude Code, a partir de una especificación y un plan escritos antes del código. Usa solo bibliotecas de código abierto. Para la entrada desde PDF seguí el mismo esquema (brainstorming, especificación, plan, un implementador y un revisor por tarea): la revisión final de toda la rama encontró cuatro problemas importantes que las revisiones de cada tarea no habían visto: ritornelos que vuelven a tocar las páginas anteriores, título tomado del OCR, PNG transparentes y página vacía. El episodio de Clementi enseña, en todo caso, que las pruebas con datos preparados no sustituyen a la prueba con una pieza real, nunca vista antes.

✦
FAQ

Preguntas frecuentes.

¿Cómo se convierte un vídeo de YouTube en una partitura?

Con spArtitI pegas la URL del vídeo (opcionalmente indicas el Inicio y el Fin del fragmento): la app extrae el audio, lo transcribe a MIDI con Transkun y produce MusicXML y un PDF con digitación propuesta. En una pieza de 6,7 minutos hacen falta unos 100 segundos en una GPU RTX 4070.

¿Funciona también con piezas de varios instrumentos?

Sí, pero con resultados más inciertos. Demucs aísla primero el piano de la mezcla, pero la pista resultante contiene artefactos y el transcriptor puede inventar o perder notas. Funciona mejor con piano solo; en las mezclas conviene juzgar el resultado de oído.

¿Qué precisión tiene la transcripción?

Es buena pero imperfecta, y por eso la app incluye un editor. La comparación con tres piezas reales favoreció a Transkun sobre el piano aislado: escribe entre 2 y 8 veces menos notas que el modelo de ByteDance y es estable. El tempo es una estimación y se corrige a mano.

¿Puedo corregir la partitura?

Sí. Puedes modificar una nota cada vez (altura, duración, mano, dedo), eliminarla o añadir una, con «Deshacer» y «Rehacer», incluso desde una tableta gracias a los comandos con botones. «Guardar cambios» regenera PDF, MusicXML y MIDI con las correcciones. El MP3 y el vídeo no cambian.

¿Es fiable la digitación?

Es una propuesta calculada con un algoritmo de Viterbi que reduce las extensiones, los cruces y los saltos de la mano. No sustituye a la digitación de una edición preparada por un pianista: úsala como punto de partida.

¿Puedo interrumpir un procesamiento largo?

Sí. El panel de trabajos enumera los trabajos en cola, en curso, terminados, con error e interrumpidos, y «Interrumpir» detiene un trabajo en pocos segundos, libera la GPU y borra los archivos temporales. La excepción es la descarga desde una URL con Inicio y Fin, que se detiene solo cuando termina.

¿Puedo partir de un PDF o de una foto de una partitura?

Sí. Arrastras a la app un PDF (incluso escaneado, hasta 30 páginas) o una imagen PNG o JPG: homr reconoce las páginas y las convierte en MusicXML; después el camino es el de la partitura con digitación propuesta, editor y PDF. El OMR falla sobre todo en los ritmos, así que conviene descargar el MusicXML reconocido, corregirlo en MuseScore y volver a cargarlo.

¿Hace falta una GPU? ¿Mis datos se quedan en mi ordenador?

Una GPU NVIDIA no es obligatoria: sin ella, la app usa la CPU y es unas 3,5 veces más lenta. El procesamiento se hace en local y el servidor escucha solo en tu ordenador; la red solo hace falta para descargar el vídeo, el modelo Demucs y las muestras del piano.

✦
Demo

Vélo en acción.

▶ Demo
spArtitI — vídeo de demostración
Del enlace de YouTube a la partitura con digitación.