rox

Cue sheets, y rips que se comportan como álbumes

Si copiaste CD antes de que partirlos fuera lo normal, un buen trozo de tu biblioteca es un FLAC por disco con un archivo de texto al lado. Casi todos los reproductores o ignoran el sheet o tratan lo que describe como material de segunda. Esto es lo que hace rox con ello.

Qué es en realidad un rip con cue

Un archivo de audio con un disco entero dentro, y un sheet .cue que lista dónde empieza cada pista. Es la forma exacta de conservar un CD, porque los huecos entre pistas son parte del disco y partirlo los tira. También es el formato que rompe la suposición sobre la que se construye cualquier biblioteca de música: que un archivo es una pista.

Los reproductores lo resuelven de una de tres formas. Ignorar el sheet y mostrar una pista de setenta minutos. Mostrar las pistas del sheet pero mantenerlas aparte de la biblioteca real, de modo que la búsqueda, el orden y las listas se comporten distinto con ellas. O hacer real la ruptura y absorberla de una vez.

Filas de verdad, no fragmentos

rox indexa cada tramo del sheet como una fila normal de la biblioteca, identificada por su archivo más su número de pista. Todo lo que viene después la lee como una pista, porque para todo lo que viene después lo es. Las listas la congelan, las escuchas se le enganchan, la búsqueda la encuentra y las columnas de orden la ordenan. Ninguna sabe que once filas apuntan al mismo FLAC.

La alternativa que elige la mayoría de implementaciones es una ruta sintética, album.flac#3, que mantiene la base de datos ordenada y traslada el problema a cada trozo de código que abra esa ruta más tarde. Un recorte que se olvide ahí es un fallo silencioso que lee bytes de etiqueta de la nada. Una biblioteca sin cue sheets no paga nada por todo esto: los tramos viven en una tabla aparte, y nada de las rutas calientes los lee.

Reproducir un tramo como un archivo

El motor toma un tramo como el mundo entero de esa pista: un posicionamiento exacto hasta su inicio, un recorte con precisión de muestra en los dos extremos, y un límite final que sigue el mismo camino que un final de archivo real. La reproducción sin huecos, el fundido encadenado, el parar tras la actual y la repetición funcionan todos sin saber que existen los tramos.

El recorte de cabeza es el detalle que importa. Un posicionamiento exacto aterriza en un límite de paquete y no en la muestra exacta, así que sin descartar los fotogramas entre el aterrizaje y el inicio del tramo, cada pista empieza con la cola de la anterior. Ese es el sonido de una implementación de cue que nadie terminó.

Las pistas consecutivas de un rip comparten grupo de álbum, que es lo que evita que el fundido encadenado se coma los empalmes sin huecos del propio disco. Un rip suena como el disco del que se sacó.

Escanear, y cambiar de idea

El sheet reclama su imagen. Mientras un cue lista un archivo, ese archivo no tiene fila propia, así que no acabas con once pistas más un duplicado de setenta minutos. La frescura se calcula con el que se modificó más tarde de los dos, así que editar el sheet o el audio vuelve a cortar el rip en el siguiente escaneo. Borra el sheet y la imagen se pliega de vuelta a una fila normal.

Los metadatos prefieren el sheet y recurren a las etiquetas de la propia imagen. Los sheets escritos antes de que la disciplina UTF-8 fuera una cosa reciben un respaldo en cp1252, porque los rips antiguos son exactamente la población para la que existe esta función.

Valoraciones que no marcan el disco entero

rox normalmente escribe las valoraciones en los propios archivos, que es lo correcto cuando un archivo es una pista. En un rip con cue no lo es: la imagen pertenece a las once pistas, así que una escritura por pista marcaría a todas con las mismas estrellas.

El escritor rechaza la mitad de archivo para estas filas y la base de datos guarda el valor. Lo mismo con las ediciones de etiquetas. Consigues valoraciones por pista en un rip, y tu imagen sale de ahí idéntica byte a byte.

Las partes que solo notarías más adelante

  • La exportación a m3u escribe los tramos como path#N, y la importación prefiere una coincidencia exacta de ruta, así que una lista va y vuelve por otro programa sin colapsar en la imagen.
  • El scrobbling y el "sonando ahora" deduplican sobre el par, así que las once pistas de un disco se scrobblean como once pistas y no como una muy larga.
  • Las escuchas se vuelven a enganchar por tramo tras un reescaneo, así que un disco mantiene su historial de reproducción por pista incluso cuando todos los tramos llevan etiquetas idénticas.
  • Solo se traslada el par de valores de álbum de ReplayGain. Los valores de pista escritos contra una imagen de disco entero describen el disco, así que se ignoran en vez de darlos por buenos.

La medida de esto no es si un rip suena. Es si, un mes después, algo de la biblioteca sigue comportándose distinto por haber salido de una imagen.

Apúntalo al estante que nunca partiste

El escáner recoge los sheets en su primera pasada, junto con todo lo demás. Más sobre qué se rompe a escala de biblioteca.

Descargar rox

¿En Arch o NixOS? Instálalo desde el AUR o el flake de Nix en su lugar.

v1.26.4 · Linux, macOS, Windows · todas las descargas