De transcripciones, MIDIs y otros demonios ((Un)jammit! – Parte 0)

Érase una vez un chamaco de 16 años, bien metalero, que quería interpretar sus piezas favoritas (que no necesariamente canciones) tal como si se tratara de una grabación profesional en estudio, o tan siquiera que no dieran pena.
Idealmente, esto se hace con amigos disponibles, dispuestos, y con gustos musicales alineados. Pero eso es tema de otra publicación. El chiste era que, cuando menos, el mozuelo y sus amigos se presentarían al menos una vez al año en el H.H.H. Colegio México Bachillerato. Y para eso, había que ensayar. Y para ensayar, había que aprenderse las piezas. Y para aprenderse las piezas, había que tener de dónde.

En aquellos entonces, los recursos para aprender a tocar una canción de rock pesado o metal ochentero/noventero eran bastantes, y bastaban:
Tablaturas, partituras oficiales (o sus respectivas fotocopias), pistas originales (o sus respectivas copias), videos instructivos (que ni por accidente encontrabas sus originales) o de plano, tu maestro de música (quien probablemente pensaba: “Covers de Metallica. ¡Qué original!”).

Por cierto, odio con todo mi ser a Wolf Marshall.

La cosa se puso buena cuando el imberbe en cuestión, luego de casi un año de no escuchar el “Images & Words” que le prestó su amigo y colega guitarrista, descubrió a Dream Theater.
“¡Bolas!”, dijeron sus oídos.
“¿Eso se puede?”, dijo su cerebro.
“¡Yo también quiero!”, maquinó su ego.
“¡JAJAJAJA! Oilo…”, le impusieron realidad y sus manos.

Dado que, para sorpresa de nadie, la excelencia académica, deportiva y la vida social no eran prioridad, muchas horas habrían de invertirse en el régimen cuasi atlético de práctica mecánica para lograr hacer sonar lo más accesible de aquel inigualable catálogo de arte supra humana en todos aspectos, especialmente en el técnico. Pero era la prepa. No es como que tuviera otras cosas que hacer.

El otro problema era de dónde. Las tablaturas y transcripciones en  línea eran muy incompletas e imprecisas.
Ahí es donde la World Wide Web (“Internet”, para los cuates) llegaría al rescate.
Luego de una intensa investigación en Yahoo! y Terra, encontré un sitio súper guay llamado Barnes & Noble. Y ahí, el libro con transcripciones bien hechas (no como las hace el despreciable de Wolf Marshall) del mejor álbum de Dream Theater, y por ley de transitividad, de la historia de la humanidad. Esa fue oficialmente mi primera compra en línea. Cualquiera hubiera pensado que tratándose de un libro habría sido por Amazon, pero no.

¿Problema resuelto? Ni de chiste.
Como mencionaba antes, esto de ser metalero no es un camino solitario, y en cuestiones de Rock, Metal y derivados, la guitarra eléctrica es el instrumento con más demanda y por lo tanto, con más mercado.
Por lo mismo, no existían libros con transcripciones para los demás instrumentos. Muy en especial para el teclado. Había que invocar a la creatividad.

En esos tiempos, antes del internet de alta velocidad (sí, ESO que usas hoy se es internet de altísima veliocidad. Incluso si te lo malprovee la rata de Carlos Slim), antes de los flujos de audio digital de resolución supra humana, de las transmisiones de las transmisiones de video en vivo en 4K…
En esos tiempos, pues, la forma más sensata para publicar y distribuir música ligera (no la de los roqueros argentinos, sino la que “pesa” pocos kilobytes) era el formato MIDI.
Más allá de ser fácilmente producible con instrumentos digitales, generalmente teclados, y ser un estándar bien definido que funcionaba en cualqiuer computadora y navegador web, servía también como una suerte de transcripción. Al ser digital, su contenido por instrumento estaba discretamente separado y delimitado. Como con cualquier documento digital.

Estos archivos de sonido eran también el medio dominante en la música de fondo de las páginas web personales, y hasta de varios videojuegos de Nintendo 64 o PlayStation.

Ahí cambió un poco la suerte. Si algo no faltaba era aficionados que, aunque fuera a medias, interpretaban uno o varios instrumentos de casi cualquier obra musical, incluyendo las de Dream Theater, y las publicaban de manera gratuita y desinteresada. A veces, hasta anónima.

Así logré encontrar, al menos parcialmente, interpretaciones aproximadas de instrumentos clave en las canciones que anhelaba interpretar. Y gracias a un maestro de composición y producción musical, descubrió la recientemente publicada versión 2.1 del software de notación Sibelius, que entre sus cientas (hoy miles) de funcionalidades, estaba importar archivos MIDI y convertirlos (más o menos) en una partitura estructurada.

Restaba bastante trabajo para que el tecladista (léase, el cuate del salón que tocaba Imagine de Los Beattles y tampoco tenía nada mejor que hacer el día del concierto de alumnos) tuviera una buena partitura con la cuál guiarse.

Había que darle formato a la partitura importada, escuchar la pista minuciosamente una y otra vez, echando mano si era necesario de la grabadora de sonidos de Windows 98 para ralentizar un fragmento de esta (pero ¡aguas! si el fragmento era demasiado grande, tardaba una eternidad, y se te podía acabar la memoria del programa), corregir las notas imprecisas, agregar las notas faltantes, deducir los acordes (una reverenda chinga cuando se usaba un sonido de cuerdas, o cualquier otro timbre etéreo), pegar bien el oído a los audífonos de baja calidad (eso de tener equipo profesional para pasatiempos adolescentes era considerado fifí), practicar el instrumento propio y evetualmente, dormir.

El método tuvo varias iteraciones, y el último año de la prepa hasta produjo una partitura íntegra de todos los instrumentos de Metropolis – Pt1 “The Miracle and The Sleeper”.

Pero ahora había otro problema a considerar.
Como buenos hijos de familia clasemediera, la disponibilidad para ensayar era limitada, y practicar las obras junto con la pista original no permitía apreciar lo pobre y defectuosa que era la interpretación, ya que el instrumento original maquillaba los errores. Al llegar a los ensayos, la realidad se volvía a mofar de todos y cada uno.

Una vez más, ¡los MIDIs al rescate!
Como ya mencioné, esos archivos son representaciones digitales y discretas (no, no como tú te veías al viborear a quien te caía gordo en las pedas de la universidad, sino como el antónimo matemático de contínuo) de cada instrumento utilizado en la pieza musical.
Siendo así, cualquier software decente (es decir, no el que venía incluído en tu sistema operativo) sería capaz de silenciar una o varias pistas para que el equivalente a tu instrumento no se translape con el tuyo y puedas oír tus errores de ejecución con perfecta y deprimente claridad.

Sin tanto rollo, el santo grial era estudiar, practicar y grabar las canciones de mi predilección, sin que la pista para mi instrumento estorbara.

Claramente, los archivos MIDI eran una solución limitada y de baja calidad, pero tenían su encanto. Uno se sentía como cantante versátil de bar de Sanborns (propiedad también del p**o de Slim).

Números Romanos – Parte I

Durante una entrevista de trabajo, me plantearon el siguiente problema:
Dado un número decimal, conviértelo a notación romana.

Es decir, convertir:

  • 42 en XLII
  • 1000 en M
  • 2013 en MMXIII
  • 69 en XXX :P, etc.
Pequeño recordatorio de cómo funciona dicho sistema…
Los dígitos romanos pueden ser vistos como una dupla (magnitud, potencia), donde la magnitud puede ser 1 o 5, y la potencia varía de 0 a 3.
De este modo, los dígitos romanos y su valor se componen como sigue:
Dígito Valor
I 1 * 100
V 5 * 100
X 1 * 101
L 5 * 101
C 1 * 102
D 5 * 102
M 1 * 103
Posteriormente, como recordamos (y si no recordamos, ¡a recursar la primaria!), los valores (independientemente de su potencia) del 2 al 4 y del 6 al 9 se componen combinando aditivamente a la derecha o substractivamente a la izquierda los dígitos para 1 y 5. Ejemplos:

Decimal Romano
2 II
3 III
4 IV
6 VI
8 VIII
9 IX

Dado este patrón, una solución común suele involucrar el tomar los dígitos base y generar las combinaciones dinámicamente. Véase el siguiente código:
http://discuss.leetcode.com/questions/194/integer-to-roman?page=1&focusedAnswerId=380#380

La implementación es correcta, pero redundante. ¿Qué necesidad hay de ensamblar manualmente cada número romano, cuando las combinaciones pueden ser mapeadas directamente a cada dígito decimal del número a convertir? Es decir:
1985 = 1*103 + 9*102 + 8*101 + 5*0, se representa como: {“M”, “CM”, “LXXX”, “V” } = “MCMLXXXV”.
Para 101 = 1*102 + 0*101 + 1 *100, tenemos {“C”, “”, “I”} = “CI”.

Para mi fortuna, noté ese patrón polinomial mientras analizaba el problema en la entrevista, y me di cuenta que hay una solución totalmente lineal. En lugar de almacenar únicamente los dígitos como constantes en un vector, podemos almacenar todos los posibles números representables por un dígito decimal. Por suerte, los numerales romanos sólo representan del 1 al 3999 (Wikipedia dice que 4999, pero para fines de este artículo da lo mismo). De este modo, podemos utilizar la siguiente tabla:

Magnitud 100 101 102 103
0
1 I X C M
2 II XX CC MM
3 III XXX CCC MMM
4 IV XL CD
5 V L D
6 VI LX DC
7 VII LXX DCC
8 VIII LXXX DCCC
9 IX XC CM

De este modo, la implementación queda como sigue:

package net.rochsquadron.blog;

public class Romans {

public static int MIN_VALUE = 0;
public static int MAX_VALUE = 3999;

private static String[][] DIGITS = {
{ "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" }, // 10^0
{ "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" }, // 10^1
{ "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" }, // 10^2
{ "", "M", "MM", "MMM" }, // 10^3
};

public static String valueOf(int input) {
// Validate boundaries
if (input < MIN_VALUE || input > MAX_VALUE )
throw new IndexOutOfBoundsException(
String.format("Number out of range: %d", input)
);

// For each power (0 to 3), locate and add the corresponding number:
// [power][digit]
String value = "";
for(int i = 0; i < DIGITS.length; i++) {
value = DIGITS[i][input % 10] + value;
input /= 10;
}

return value;
}

public static void main(String... args) throws Exception {
for(String s : args) {
int number = Integer.parseInt(s);
String roman = valueOf(number);
System.out.println(roman);
}
}
}

Supuestamente, el entrevistador no había visto este tipo de respuesta antes (que tampoco es tan innovadora; aparece en los primeros resultados de StackOverflow) y esta solución me ayudó a ganar bastantes puntos.