Un momento.

Un marketplace de partituras que las digitaliza y corrige sin salir de la app

Explora el catálogo, compra o vende el acceso a una obra, y sube tu propia partitura escaneada para transcribirla y corregirla ahí mismo. Un motor de reconocimiento óptico mide su tonalidad, su compás y su tesitura: no hace falta escribirlos a mano, ni salir a otra aplicación.

ProyectoSheetifyAño2026RepositorioGitHub
MÚSICAMARKETPLACEOMR
RESUMEN
Tipo
Aplicación de escritorio multiplataforma
Catálogo
57 partituras · 3 épocas · 4 agrupaciones · 19 instrumentos
Motor
Audiveris 5.11, dentro de la app
Año
2026

En qué consiste

Sheetify reúne en una sola aplicación de escritorio lo que hoy obliga a usar tres: explorar un catálogo, digitalizar partituras propias y comprar o vender el acceso a ellas.

La pieza que lo hace posible es el reconocimiento óptico. Un músico sube el PDF de una obra y Audiveris la transcribe a MusicXML; de esa notación la aplicación mide los datos musicales en lugar de pedírselos a quien la sube: tonalidad, compás, tempo, número de compases, tesitura por voz e instrumentación real.

Esos datos son los que alimentan las facetas del catálogo y un índice de dificultad calculado por un servicio de Python aparte. El acceso se vende por licencias con vigencia: 90 días, 180 días, un año o permanente.

Sheetify
EL PROBLEMA

Un músico usa una herramienta para leer sus partituras, otra para comprarlas y otra para tenerlas ordenadas. Ninguna de las tres evita lo mismo: acabar tecleando a mano lo que la partitura ya dice.

DIGITALIZAR

Un escáner solo hace fotos

Pasar el papel a digital suele generar un PDF estático: para el ordenador es una imagen muda, no una partitura, y no hay forma de que la aplicación entienda la música que contiene.

MEDIR

Si nada lee la obra, todo se escribe a mano

Como el archivo es ciego, ni el marketplace donde la compras ni la carpeta donde la guardas saben de qué trata la obra: los datos los escribe a mano quien la sube, y ahí se quedan.

CENTRALIZAR

El caos del papel y los archivos sueltos

Lees en una app, compras en una web y acumulas archivos digitales que conviven con carpetas de papel en el atril de casa. Tu repertorio vive repartido entre sitios que no se hablan.

EL PIPELINE

De un escaneo a datos musicales

Todo lo que el catálogo sabe de una obra sale de este recorrido. Nada de esto lo teclea quien sube la partitura.

  • Transcripción: Audiveris 5.11 corre embebido en la propia ventana de la aplicación: transcribes con dos clics y corriges ahí mismo lo que no haya leído bien, antes de exportar. Va aparte del resto del código porque es Java y es AGPL: se ejecuta como proceso independiente en vez de enlazado a la aplicación.

  • Extracción de metadatos: del MusicXML salen tonalidad, compás, tempo, número de compases, tesitura por voz e instrumentación.

  • Características: densidad de notas, saltos interválicos, complejidad rítmica, alteraciones y polifonía.

  • Índice de dificultad: un servicio de FastAPI combina esas características, calibradas contra el corpus, en un número del 1 al 10.

El resultado se guarda en la partitura y pasa a ser una faceta más del catálogo: se puede filtrar por dificultad igual que por época o por instrumento.

Es un índice, no una predicción

No hay un conjunto de partituras etiquetadas con el que entrenar un regresor. Lo que hay es una combinación de características medidas, convertida en un número del 1 al 10.

PRODUCTO

Un recorrido completo, de explorar a vender

Explorar el catálogo, leer una partitura página a página, subir y transcribir una obra, comprar una licencia y ver lo que has vendido.

Las facetas no son etiquetas puestas a mano: son los datos que salieron del pipeline. Filtrar por compás o por dificultad funciona porque alguien los midió, no porque alguien los escribiera.

LAS COMPRAS

Comprar dos veces a la vez

El acceso se vende por licencias con vigencia, y comprar es la operación que más caro sale si falla a medias. El checkout entero pasa por cuatro garantías.

  1. Transacción única

    Se crea el pedido, se emite la licencia y se registra la venta, o no se toca nada.

    Evitaun pedido a medias, con la licencia sin emitir o la venta sin registrar
  2. Índice único parcial

    Comprar «para siempre» dos veces es imposible por construcción, sea cual sea el nivel de aislamiento. La regla completa (ya tienes esta obra con una licencia igual o superior) vive dentro de la misma transacción.

    Evitados compras simultáneas de la misma obra, las dos pasando la comprobación previa bajo Read Committed
  3. Recibo después del commit

    El PDF es un dato derivado, reconstruible desde el pedido: se genera solo cuando la transacción ya ha confirmado.

    Evitaun fallo al dibujar el PDF deshaciendo una compra ya hecha
  4. Tests contra PostgreSQL real

    Uno lanza dos checkouts a la vez y afirma un solo pedido; otro fuerza un fallo en el último paso y afirma cero filas, con el carrito intacto.

    Evitalo que un proveedor en memoria nunca demostraría
LA REESCRITURA

El mismo producto, reescrito entero

Sheetify es la reconstrucción de mi Trabajo de Fin de Grado de 2025: WinForms, solo Windows, un único proyecto sin una sola capa. Hace lo mismo que el original. La diferencia está en cómo está escrito, y se puede contar.

TFG, 2025Sheetify, 2026
AlcanceWinForms sobre .NET Framework: solo Windows.Avalonia: Windows, Linux y macOS, con tema claro y oscuro.
CobroCero transacciones. Un fallo a media compra dejaba el pedido creado y la licencia sin emitir.El checkout es una transacción única, con tests de rollback y concurrencia contra un PostgreSQL real.
PrecioSheetDetailControl y CartControl calculaban el precio cada uno por su lado; un tramo no reconocido vendía la partitura a 0 €.LicensePricing vive en Domain con un switch exhaustivo sin default: un tramo sin precio es error de compilación, no una venta a 0 €.
Acceso a datos78 SqlCommand escritos a mano dentro de clases de interfaz, 7 construidos concatenando texto del usuario.Todo el acceso pasa por repositorios e IQueryable. Ni una consulta en la capa de vista.
InterfazNi un await: la ventana se congelaba en cada consulta contra la base de datos.Todo asíncrono.
Recuperar contraseñaCódigo de seis dígitos con new Random(), guardado en memoria del cliente y comparado ahí mismo; sin límite de intentos ni de peticiones.Token de un solo uso, hasheado en servidor, caduca a los 15 minutos y máximo 3 peticiones por hora.
EstructuraUn proyecto, sin capas, sin inyección de dependencias, sin logging y sin tests.Cinco proyectos con las dependencias verificadas por tests de arquitectura.
Código, decisiones y arquitectura en el repositorio.GitHub
SIGUIENTE PROYECTO
MedFlow