- Para músicos que tocan ampliando PDFs A4 en pantallas móviles pequeñas, hace falta un renderizado de partituras fluido y responsivo en la web
Prototipo de Scribe
- En el pasado se creó como prototipo un renderizador musical llamado Scribe que generaba SVG a partir de JSON
- El objetivo original era crear un renderizador musical responsivo, pero era difícil avanzar porque había que escribir un complejo motor de maquetación multipaso
- Más adelante, al introducir CSS Grid en el proyecto, pareció que podía ser la respuesta al problema de maquetación que Scribe estaba tratando
Clase .stave
Colocar alturas en el pentagrama
Clase .bar y compás
Colocar símbolos en el pulso
- Esta vez se usa el atributo
data-beat para asignar un pulso a cada elemento y reglas CSS para mapear el pulso a columnas de la cuadrícula
- El mapa CSS está compuesto por una regla por cada 1/24 de pulso
- Al usar el selector de atributo de inicio
^=, la regla tolera pequeñas imprecisiones
- Al combinarlo con la clase
.stave, se pueden colocar símbolos por pulso y por altura configurando data-beat con valores entre 1 y 5 y data-pitch con el nombre de la nota
Partitura fluida y responsiva
- Si se colocan varios de estos compases dentro de un contenedor flexbox, se obtiene una partitura responsiva
- Todavía faltan muchas cosas, pero es una buena base para empezar
- Ya hace saltos de línea de una forma mucho más elegante que los renderizadores musicales en línea
Espacio entre notas
- Las cabezas de nota que ocurren en momentos más cercanos entre sí se renderizan un poco más juntas
- Es un efecto sutil e intencional creado por un
column-gap pequeño, que actúa como una especie de "éter" temporal donde encajan los elementos simbólicos
- Las columnas en sí tienen ancho 0 si no hay cabezas de nota, pero entre eventos más alejados en el pulso hay más espacios entre columnas (24 por pulso), así que aparece más distancia
- Se puede ajustar el margen de los símbolos para controlar un espaciado constante
Claves y compases
- La razón para usar clases separadas para el espaciado vertical y horizontal es que una puede sustituirse sin tocar la otra
- Para mostrar la misma melodía en clave de fa, basta con sustituir la clase
.stave por una clase bass-stave que mapee los mismos atributos data-pitch a las filas del pentagrama de bajo
- Si con CSS se mapea
data-duration="5" a las 120 columnas de la plantilla de cuadrícula de .bar, se puede dar al mismo pentagrama un compás de 5/4
Acordes y letra
- Con CSS Grid también se pueden alinear otros símbolos dentro de la cuadrícula de la partitura
- Se pueden alinear y extender acordes, letra, dinámicas, etc., con eventos ubicados en el tiempo
Plicas
- Las plicas, los acordes y algunos silencios largos se hacen abarcar columnas mapeando el atributo
data-duration a un valor de rango en grid-column-end
Escalado
- Todo el sistema usa unidades
em, así que se puede escalar solo cambiando font-size
Límites de Flex y Grid
- No es un sistema perfecto. Tiene estas limitaciones:
- CSS no puede colocar automáticamente una nueva clave o armadura al hacer salto de línea
- No puede conectar ligaduras de corcheas con notas nuevas en la siguiente línea
- Las plicas inclinadas son difíciles de alinear porque su posición exacta solo se conoce después de que Grid hace la colocación
- Para terminarlo por completo hace falta un poco de JavaScript de limpieza, pero como CSS se encarga de la mayor parte del trabajo de maquetación, en JavaScript queda mucho menos trabajo de layout
Elemento personalizado
- Se escribió un intérprete alrededor de este nuevo sistema CSS y se envolvió en un elemento
- Todavía no está listo para producción, pero ya puede renderizar lead sheets responsivas y notación de batería, así que resulta interesante y útil
- Renderiza partituras a partir de los datos del contenido, de archivos obtenidos con el atributo
src y de objetos de JS establecidos en la propiedad .data del elemento
- La compilación de desarrollo actual puede importarse en una página web para probarla
Planes a futuro
- Además de las mejoras de Scribe 0.3, estas son funciones que se quieren investigar a largo plazo:
- Soporte para fuentes SMuFL: cambiar la fuente usada para los símbolos musicales
- Soporte para secuencias anidadas: habilitar piezas de múltiples partes
- Renderizado de pentagramas divididos: colocar varias partes en un solo pentagrama
- Renderizado de múltiples pentagramas: colocar varias partes en varios pentagramas alineados
Opinión de GN⁺
- Renderizar partituras de forma fluida y responsiva en la web parece algo muy útil tanto para músicos como para aficionados a la música. Podría resolver la incomodidad de ver partituras PDF haciendo zoom en pantallas pequeñas
- El enfoque que aprovecha los layouts Grid y Flex de CSS resulta interesante. Es un buen ejemplo de cómo CSS por sí solo puede resolver bastante sin necesidad de un motor de maquetación complejo
- Aun así, por la naturaleza de la partitura, hay partes donde CSS por sí solo tiene límites. En aspectos que requieren entender el contexto musical, como colocar automáticamente claves o armaduras al cambiar de línea, o conectar ligaduras de corcheas, hará falta ayuda de JavaScript
- Ya se han implementado bastantes cosas, como el renderizado de partituras lead y el soporte para partituras de batería, así que parece posible que pronto mejore hasta un nivel bastante utilizable. Si se libera como código abierto y el desarrollo continúa, podría convertirse en una buena alternativa a editores de partituras existentes como MuseScore
- Si se implementan funciones futuras como soporte para fuentes SMuFL y renderizado de múltiples partes y múltiples pentagramas, la calidad de representación de partituras podría subir mucho. Es un proyecto prometedor
2 comentarios
Debe haber una razón para que haga esto.
Opiniones en Hacker News
[...]) de CSS resultó impresionante. Ejemplo:.stave > [data-pitch^="A"][data-pitch$="5"] { grid-row-start: A5; }<scribe-music>