2009/9/14 Juan I Reyes <[email protected]>: > > Hola, > > En referencia a la duda de convertir frecuencias a MIDI la siguiente > función podría ser útil. > > > MIDINOTE = INT (69.5 + (12(log(freq/440))/log(2)) > > > El código en C++, adaptable a Java o Processing puede ser algo como: > > double a440= 440.0; > int freq2midi(double freq) > { > return (int)(69.5 + 12 * log10(freq/a440)/log10(2.0)); > } > > Varios puntos para tener en cuenta: > > - MIDINOTE es un subconjunto entre [0-127] de enteros solamente. > - La función 'INT' en C regresa un entero dependiendo de si el decimal > esta mas cerca a la cota por encima o por debajo.
Una aclaración/detalle: el casteo a int, trunca, no redondea[1], lo que pasa aca es que se esta trabajando con números positivos y alcanza con sumarle 0.5 y truncar. No la revisé en detalle, pero creo que la fórmula en realidad suma 69 (correspondiente a A4 en MIDI, LA 440) y 0.5 más por esto que digo. Saludos [1] Para eso hay que definir algo como esto: #define round(x) (x>=0?(int)(x+0.5):(int)(x-0.5)) > - Esta formula esta basada en LA=440. > > Se me ocurre que un subpatch en Pd con [expr $f1], podría hacer la > conversión facilmente. De hecho debe ser algo como: > > Si log10(2) = 0.30103 > > > [expr $f1 (int)(69.5 + 12 * log10($f1/440)/0.30103))] > > Si alguien lo puede ensayar (con el debug), sería bueno que pasara el > parche de vuelta!. > > Suerte, > > --* Juan > > _______________________________________________ > > Expyezp mailing list > [email protected] > http://lists.slow.tk/listinfo.cgi/expyezp-slow.tk > > Archivo de mensajes: > http://lists.slow.tk/pipermail/expyezp-slow.tk/ > -- Hernán http://h.ordia.com.ar GnuPG: 0xEE8A3FE9 _______________________________________________ Expyezp mailing list [email protected] http://lists.slow.tk/listinfo.cgi/expyezp-slow.tk Archivo de mensajes: http://lists.slow.tk/pipermail/expyezp-slow.tk/
