Solve-It 4 : 2010

Antes de continuar con los solve-its de este año, vamos a hacer un inciso y a detenernos un momento en un solve-it del año 2010. De los más difíciles (yo creo) que ha puesto marcan.

Nos propone el siguiente enunciado:

Captura_Enunciado.PNG

Dentro de éste hay un enlace a lo que parece un fichero. Se trata de una imgen .png:

goindown.png

“goindown.png”

Antes de continuar he de decir, que tras estar dandole vueltas varios días y también dando la caca a @marcan42 por twitter pidiendole pistas … este solve-it no lo saqué … la verdad es que es de los “mas o menos” difíciles de marcan (como él bien me dijo por twitter 😉

En esta imagen hay que fijarse en un par de cosas; de hecho, en tres para ver por donde van los tiros:

La primera es que se trata de un .png y … es una fotografía … normalmente las fotografías son en formato .jpg. Si hacemos un ‘file’ sobre el archivo .png nos da la siguiente información:

Captura_FileGoindown

Se trata de un PNG de 1659×866, 8 bits de profundidad de color y lo realmente importante: tiene una capa de color Alpha (RGBA).

La segunda es la pista que nos da en el propio level. Todo es cada elemento tiene su razon de ser. Esto significa que los puntos están a diferentes alturas bien marcados en un cuaderno cuadriculado para indicar que es así porque tiene que ser así; es decir, que si un punto esta a 0.5 cuadrados más abajo que otro, es porque tiene que serlo.

Y finalmente la tercera son esas 2 líneas horizontales marcadas en la gráfica. Si nos fijamos cada una divide a la grafica en 6 cuadrados del cuaderno de altura; además de esto, hay que tener en cuenta que los cuadrados del cuaderno nos los divide por la mitad, lo que hacen que haya 12 alturas cada división.

Vamos por partes.

En primer lugar vamos a extraer el canal alpha de la imagen a ver qué vemos. Para ello usamos el comando “convert -alpha extract goindown.png alpha.png”. Luego abrimos la imagen con imageMagick y veremos que sale toda en blanco:

Captura_alpha.PNG

Sin embargo, si le damos a rellenar con negro en cualquier punto de la imagen obtenemos:

Captura_MiReDo.PNG

MiReDo>>

Esto es otra pista, que esencialmente nos esta diciendo que la gráfica se trata de notas musicales, que tenemos que pasar muy rapidamente.

Es por eso por lo que hay 12 divisiones entre lineas: se trata de divisiones entre octavas de todas las notas musicales:

Captura_ascendente_piano

Averiguado esto, y sabiendo ya de antemano la solucion, cogí y (con mis prácticamente nulos conocimientos de música) asumí lo siguiente (tras varias ojeadas en wikipedia y alguna otra web):

Captura_ascendente.PNG

Total, que teníamos que ponernos a producir música en base a las notas de esa gráfica.

Echemos mano de Octave (que para esto nos va a venir bien y así aprendemos un poco cómo funcionan las notas). Vamos a ver si conseguimos que suene algo decente.

En la wikipedia (entre otros) nos dan la frecuencia a la que vibran cada una de las ondas de las notas musicales (he puesto antes la captura).

Así que vamos a empezar por eso:

Captura_notas_octave

Esta realmente es la parte fácil … ahora hay que hacer sonarlas, lo cual realmente no es muy complejo tampoco … y más si buscamos un poco por internet, que encontraremos información de cómo hacerlo, ya sea con Octave o Matlab.

En primer lugar hay que elegir una frecuencia de muestreo (el mundo digital es lo que tiene…). Esto me da un poco igual, pero ya que es gratis voy a poner 44100Hz que es más o menos lo normal (además de 48000Hz):

>> fs=44100;

Posteriormente hay que hacer una señal sinusoidal (o cosenoidal, da lo mismo), que oscile con la velocidad la frecuencia de la nota que queremos. Para ello en Octave primero definimos una variable en la que introduciremos de tiempo que queremos que suene la nota, por ejemplo 1 segundo. Con esto creamos un array de tiempos que utilizaremos a continuación para generar la onda:

>> duracion = 1;
>> t = [0:1/fs:duracion];

Esto nos da un array de tiempos de 44101 valores/muestras. Como vemos, cuanta más frecuencia de muestreo, más muestras tendremos en el array ‘t’.

Ahora sencillamente hay que generar la onda con una de las frecuencias correspondientes a una nota, por ejemplo, la nota ‘LA’ (440Hz). Para generar una onda de amplitud S (en este caso cogeré S=1 para simplificar) cuya frecuencia sea 440Hz tenemos que hacer lo siguiente:

S·sin(w) , donde w = 2·pi·f => nota = sin(2·pi·440·t)

Aplicando esto en Octave tendríamos que hacer:

>> x = sin(LA*2*pi*t);

Si ploteamos la forma de esta señal tenemos:

>> plot(t(1:500),x(1:500));

(con el comando de arriba ploteamos solamente las 500 primeras muestras de la señal ‘x’)

Captura_SinLA.PNG

Donde el eje de abscisas es el tiempo (en segundos) y el eje de las ordenadas es la amplitud.

Si queremos oir esta señal, bastará que escribamos lo siguiente en la ventana de comandos de Octave:

>> sound(x,fs);

Ahora bien, aquí hemos representado y escuchado unicamente una nota (LA) durante 1 segundo… pero ahora tenemos que poner todas las notas, que nos presenta marcan en el dibujo, una de tras de otras y hacerlas sonar.

Bueno, antes de seguir comentar que en la captura que puse antes, las notas están colocadas de forma errónea en la octava, ya que no es ascendente desde el origen (desde el eje de ordenadas = 0 hacia arriba no empieza en DO (C4), luego al llegar a la posicion 12 es DO (C5), etc…) sino que la linea horizontal superior (24) se trata de la nota DO (C5) y la siguiente linea horizontal (12) representa la nota DO (C6). La forma correcta es:

Captura_nOTAS_bIEN.PNG

Hay que decir que para deducir este orden lo que hice fue prueba-error en relación a la solución que yo ya sabía … 😉

Cabe destacar que los puntos intermedios entre notas de la gráfica corresponden a las teclas negras de los pianos (notas sostenidas/bemoles (en la escala mayor; la típica, vamos): en la lista que he creado antes en Octave son las notas que llevan la ‘_’ al final son las notas sostenidas de la escala mayor).

>> c = 2*pi*t;
>> x = [sin((DO*2)*c), sin((SOL)*c), sin((DO*2)*c),sin((MI*2)*c),sin((SOL*2)*c), sin((DO*4)*c), sin((SOL*2)*c), sin((SOL_)
*c), sin((DO*2)*c),sin((RE_*2)*c), sin((FA_*2)*c), sin((RE_*2)*c), sin((FA_*2)*c), sin((DO*4)*c),sin((RE_*3)*c), sin((SOL_*4)*c), si
n((RE_*4)*c), sin((LA_)*c), sin((RE*2)*c), sin((FA*2)*c), sin((LA_*2)*c), sin((FA*2)*c), sin((LA_*2)*c), sin((RE*4)*c), sin(FA*4)*c, sin(LA_*4)*c, sin(FA*4)*c ];

He metido el array de tiempos en la variable ‘c’, que se ve arriba, para que el codigo quedase algo más legible.

Lo que hace esa linea de código es concatenar los arrays de las ondas que generamos para cada nota (cada diferente frecuencias), en un único array ‘x’.

Si os dáis cuenta también, hay algunas ‘notas’ multiplicadas por 2 o por 4.

Esto es debido a la octava. Según en la octava en la que estemos, si estamos haciendo un DO (C4), para subir de octava, DO (C5), hay que multiplicarlo por 2 (su frecuencia en una octava mayor es el doble). Y si queremos hacer un C6, habría que multiplicarlo por 4 (o la C5 por 2) y así sucesivamente y con todas las notas.

El resultado de hacer esto es un array gigantesco de 1190727 elementos:

Captura_chorizo.PNG

Con esto tenemos un sonido que dura 27 segundos (1 segundo por nota) … cosa que no cuadra mucho con el ‘>>’ que vimos en la primera pista del .png (en el canal alpha).

A partir de aquí es probar distintas velocidades hasta que de algo decente.

Si hacemos que la duración del sonido sea en total de 1 segundo => 1/27 = 0.031s por nota:

>> duracion = 0.031;
>> t = [0:1/fs:duracion];
>> c = 2*pi*t;
>> x = [sin((DO*2)*c), sin((SOL)*c), sin((DO*2)*c),sin((MI*2)*c),sin((SOL*2)*c), sin((DO*4)*c), sin((SOL*2)*c), sin((SOL_)
*c), sin((DO*2)*c),sin((RE_*2)*c), sin((FA_*2)*c), sin((RE_*2)*c), sin((FA_*2)*c), sin((DO*4)*c),sin((RE_*4)*c), sin((SOL_*4)*c), si
n((RE_*4)*c), sin((LA_)*c), sin((RE*2)*c), sin((FA*2)*c), sin((LA_*2)*c), sin((FA*2)*c), sin((LA_*2)*c), sin((RE*4)*c), sin(FA*4)*c, sin(LA_*4)*c, sin(FA*4)*c ];

Con esto finalmente, pasamos a .ogg el fichero:

>> fich=’menudaCrisis.ogg’;
>> audiowrite(fich,x,fs);

Y sonará así:

Descargar fichero .ogg final

… para el que después de oír el fichero de sonido aún no sepa cual es la contraseña… os diré que es:

seta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s