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/

Responder a