He resistido la tentación de programar un delay porque ya están muy explotados y me he puesto a jugar con senos y cosenos. El resultado ha sido un par de plugins que a lo mejor no tienen mucha utilidad pero me ha servido tela para saber como funciona la comunicación entre el host y la DLL. Lo mejor para aprender es hacer algo por tu cuenta y pasar un poco de los ejemplos.
He hecho un generador de tonos con dos frecuencias independientes, el nucleo del proceso que me ha salido es:
procedure Ejemplo.processReplacing(inputs, outputs: PPSingle; sampleframes: Longint);
var
in1, out1, out2 : PSingle;
tempL,tempR : Single;
incremento1,incremento2,frecuencia1,frecuencia2:real;
i: integer;
begin
//punteros a los canales de entrada y salida
in1 := inputs^;
out1 := outputs^;
inc(outputs);
out2 := outputs^;
//calculo de frecuencias
frecuencia1:=50+(3000-50)*fFac1+(random(10)-5);
frecuencia2:=50+(3000-50)*fFac2;
incremento1:=2*PI*frecuencia1/44100;
incremento2:=2*PI*frecuencia2/44100;
for i := 0 to sampleframes-1 do
begin
tempL := in1^;
tempR:=in1^;
//amplitud flojita "0.05" para que a nadie le reviente el altavoz
tempL :=0.05*cos(t1*incremento1);
tempL:=tempL+0.05*cos(t2*incremento2);
inc(t1);
inc(t2);
//acotamos la base de tiempos para no desbordar los integers;
if t1*incremento1>=2*PI then t1:=0;
if t2*incremento2>=2*PI then t2:=0;
out1^ := tempL;
out2^ := tempL;
inc(in1);
inc(out1);
inc(out2);
end;
end;
Mi primera dificultad fue utilizar una base de tiempos para generar tonos para lo cual hice la catetada de ir pidiendole la hora del reloj al sistema en milisegundos, cuando se puede extraer directamente de la distancia entre muestras... eso sí, por ahora solo me funciona a 44100hz, tengo que ver una forma de preguntarle al host por la frecuencia de muestreo que se está usando para recalcular las frecuencias.
Ahora quiero meterle mano ya a la FFT para hacer cositas guapas, para lo cual quiero buscarme una rutina de transformada de fourier que sea rapidita (paso de hacerla yo que es un puto coñazo) y el problema es empezar a usar buffers para almacenar los coeficientes de fourier, ya que por ahora solo puenteo el puntero de entrada que me da el cubase "inputs^" con el de salida "outputs^" a través de un flotante de 32 bits que uso temporalmente. Si alguien tiene experiencia en usar buffers dinámicos y recorrerlos en VST que me aconseje como hacerlo porque me da a mi que se me van a ir los punteros de baretas.
¡Otra cosa!, me da a mi tambien que la manera de llevar las bases de tiempo t1 y t2 se podría hacer mejor porque para algunas frecuencias no salen tonos perfectos y creo que es por culpa de la manera que tengo de acotar la fase del seno entre 0 y 2PI. Cualquier ayudita se recompensaría con una birrita.
Bueno, aqui os dejo por si os pica la curiosidad los dos efectos VST que he programado. (usalos bajo tu responsabilidad).
el generador de tonos:
http://www.iespana.es/intercambiando/generador_tonos.dll
y un modulador de banda lateral que se me ha ocurrido a partir del anterior:
http://www.iespana.es/intercambiando/modulacion_banda_lateral.dll
En este último lo unico que he hecho es utilizar los tonos generados como portadoras para modular la señal (la accion preferida de un teleco, ja).
Casi se me han saltado las lagrimas al ver la doble banda lateral resultante al monitorizar la salida en el analizador de espectro del cubase.
Salu2