A ver si luego paso los algoritmos también in memoriam JCR.
Para los Shepard Tones o para efectos de 'crescendi' o 'decrescendi' es necesario entender la función "exponencial" o mas comúnmente conocida como la distribución normal en términos de probabilidad y estadística[1]. Esta es otra de esas funciones de gran utilidad que a veces toma la forma de una campana, de sombrero mexicano o, mas técnicamente de Gaussians. Una característica intrínseca en estas funciones de estas es que en muchos casos no toma valores de cero. Nótese que la división por cero es bastante indeseada. Para los Tonos Shepard y las paradojas de Risset simplemente se utilizan varias normales desfasadas por un intervalo constante de tiempo (phase offsets). En síntesis aditiva, por ejemplo con un sonido con ocho o doce armónicos (sinusoidales), se utiliza una normal como factor que va cambiando la amplitud del fundamental y de cada armónico. Por esto la sensación de glissandi. Teoría y referencias en Dodge C., Computer Music, pp-94-96, Schirmer Books, 1985. David Huron hace una explicación bastante didáctica sobre el tema en [2]. Apropos, Huron es el autor de "Sweet Anticipation: Music and the Psychology of Expectation". Mas-o-menos este es el algoritmo traducido de mi código en Scheme: ================================================================== %% Defino una función para la dirección del proceso (up down): double dir(int d, double p) { if(d==1){return(p*12)}; if(d==-1){return(-p*12)}; } %% Función para convertir Hz a radianes double hz->radians (double hz) { return(2*pi*hz); } %% Definir un arreglo para los valores de los doce osciladores e %% inicializarlo. Tambien variable para con intervalo de tiempo %% para los desfases (offsets) de cada oscilador. La entrada a %% osciladores es frecuencia en radianes. double = osciladores[12]; long phaseoffs; int up=1; int down=-1; x =0; %% Loops para un sonido de dos segundos 48K-SR for i from 0 to (48000*2) do { long y=0.0; double oscbank = 0.0; %% loop osciladores For j from 0 to 12 do { %% offsets para cada uno de los osciladores phaseoffs = x + (j / 12); if(phaseoffs > 1.0) { phaseoffs = phaseoffs-1;}; y = 4 - (8.0 * phaseoffs); %% Suma de los osciladores con amplitud desfasada oscbank = exp(-0.5*y*y) * (osciladores[j] (hz->radians(expt(2, (dir up, phaseoffs)); j = j+1; } x = x + 0.00001; %% Sonido final que es la suma de todos los osciladores output = oscbank; } ======================================================================== IN MEMORIAM JCR! -- Juan [1] http://mathworld.wolfram.com/NormalDistribution.html [2] https://vimeo.com/34749558 _______________________________________________ Expyezp mailing list Expyezp@lists.randomlab.net http://lists.randomlab.net/listinfo.cgi/expyezp-randomlab.net Archivo de mensajes ------------------- * http://www.mail-archive.com/expyezp@lists.randomlab.net/ * http://www.mail-archive.com/expyezp@lists.slow.tk/