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/

Responder a