programación.

31 resultados, página 1 de 7.

  1. Ben Frederickson, un desarrollador de software que vive en Vancouver, ha publicado un par de entradas en su blog sobre cómo calcular la similitud entre dos artistas en términos de distancia. Para ello hace uso de un conjunto de datos sacados de last.fm en 2008 para plantear y desarrollar distintos métodos.

    En la primera entrada parte de un criterio de similitud sencillo: el número de usuarios que dos artistas tienen en común. Rápidamente identifica como problema que los grupos más populares los tendrán casi todos los usuarios, con lo que la métrica no resulta especialmente fiable. La solución más sencilla que propone es calcular el coeficiente de Jaccard, aunque también menciona el coeficiente de Sørensen–Dice y el coeficiente de Ochiai. Después explica cómo tratar el problema como uno geométrico, con sus beneficios y penalizaciones, para pasar a comentar y mostrar las ventajas de usar TF-IDF y, finalmente, Okapi BM25.

    La segunda entrada se centra en el uso de factorización de matrices para reducir la dimensionalidad de los datos antes de calcular la similitud entre dos artistas. Partiendo de la descomposición en valores singulares para hacer análisis de semántica latente, pasa a explicar e implementar el método descrito en «Collaborative Filtering for Implicit Feedback Datasets».

    Para el desarrollo ha usado python, acompañando los resultados de gráficos interactivos hechos con D3.js, lo que hace la lectura aún más interesante.

    Finding Similar Music using Matrix Factorization: Implicit ALS on "Iron Maiden"
  2. .

    Veía hace unos días una reseña en Hacker News sobre un sintetizador multi-toque hecho con Typescript/React aunque su creador, Luke Phillips, no da detalles de la implementación:

    http://femurdesign.com/theremin/

    No es la primera vez que menciono sintetizadores hechos con JavaScript, siendo el más conocido probablemente el que hizo Google como homenaje al Dr. Moog.

  3. .

    Veo el siguiente código en el blog de Robert Elder:

    cat /dev/urandom | hexdump -v -e '/1 "%u\n"' | awk '{ split("0,2,4,5,7,9,11,12",a,","); for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' | xxd -r -p | aplay -c 2 -f S32_LE -r 16000

    Introducido en una terminal de un sistema Linux con los programas necesarios, genera una melodía aleatoria. En el primer enlace hay una explicación detallada de lo que hace exactamente, aunque se resumir con cada orden entubada:

    1. cat /dev/urandom

      Vuelca los contenidos de /dev/urandom a stdout.

    2. hexdump -v -e '/1 "%u\n"'

      Convierte bytes binarios en enteros (opción -e '/1 "%u\n"') incluyendo las repeticiones (opción -v).

    3. awk '{ split("0,2,4,5,7,9,11,12",a,","); for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }'

      Procesa la información con AWK de modo que:

      1. split("0,2,4,5,7,9,11,12",a,",");

        Crea un array a con los número de semitonos relativos a la nota base en una escala mayor. Este array se usa para calcular la frecuencia en hercios de una nota de temperamento igual con esta fórmula: 440 × 2^(número de semitonos / 12) 440Hz representa la frecuencia de un La 440.

      2. for (i = 0; i < 1; i+= 0.0001)

        Un contador para generar los tonos. Variar el incremento de cada iteración altera el tempo y la frecuencia percibida de la melodía.

      3. printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i))

        Imprime números hexadecimales de 4 octetos representando la amplitud de la onda sonora en un momento determinado. La fórmula 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) se puede descomponer en varias partes:

        1. a[$1 % 8] / 12

          A partir del valor aleatorio de la entrada ($1) elige el semitono de la escala y lo divide por doce.

        2. exp(… * log(2))

          AWK no tiene una función para calcular potencias de una base cualquiera pero sí calcula potencias del número e y logaritmos naturales, así que para obtener 2x hay que calcular e(x × ln(2)).

        3. 1382

          Es un valor aproximado de 440 × π.

        4. 100

          Un factor de escala para la amplitud de la onda y, por consiguiente, el volumen.

    4. xxd -r -p

      Convierte los 8 bytes de valores hexadecimales en binario.

    5. aplay -c 2 -f S32_LE -r 16000

      Reproduce el sonido equivalente.

  4. .

    El mes pasado me topé con “Beat Detection Algorithms”, un texto en dos partes (1 y 2) sobre la implementación en Scala de un par de algoritmos sencillos con el objetivo titular. Aparte de la explicación de la teoría tras estas implementaciones se puede encontrar el resultado integrado en el código fuente de un proyecto del autor.

    Recuerdo haber echado un ojo a este tipo de análisis matemático (aunque sin llegar a aplicarlo) a finales de la década de los 90, en la estela de la demoscene y con el ascenso de WinAmp y sus complementos de visualización. Remontándome sólo al año pasado, tenía apuntado un artículo sobre detección de pulsaciones usando Web Audio, encontrado a través de EchoJS, nuevamente sin llevarlo a la práctica por mi parte.

    Grimes "Go". Peaks with a lowpass, highpass, and bandpass filter, respectively.Grimes – Go: Peaks with a lowpass, highpass, and bandpass filter, respectively.

    Este último enlace lo tenía apuntado junto con otra reseña en EchoJS de un proyecto denominado WaveGL, cuyo objetivo era “generar audio en la GPU y transmitirlo a la tarjeta de audio” y del que señalaban uno de varios ejemplos. Con tantos proyectos de programación que he visto recientemente no estaría mal sacar un poco de tiempo para programar por gusto en lugar de por compromiso.

  5. .

    No recuerdo dónde oí por primera vez “una idea es una responsabilidad” pero me resulta admirable la gente que es capaz de ponerla en práctica. Una de estas personas es Paul Lewis, trabajador de Google, que se planteaba los siguiente:

    Given we have the Web Audio API and getUserMedia, I wondered if I could make a passable guitar tuner. Looks like I can, and in the process I learned way more stuff about audio than I care to mention. Cool stuff, though! I thought I’d do a breakdown of what went into building it.

    No contento con desarrollar su idea en su página explica algunos detalles de todo este proyecto personal. Una lectura muy interesante y muy recomendable.

    Aerotwist - Guitar Tuner