Programando mi primer efecto VST

edding
#1 por edding el 28/09/2004
Vaya mañanita mas divertida que me he pegado jugando con el SDK de steinberg, en concreto una traducción a delphi q me he pillado por la red. (como se nota q terminaron los examenes!)

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. :wink:
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
Subir
OFERTASVer todas
  • -40%
    Roland SPD-20 Pro BK Octapad
    398 €
    Ver oferta
  • -33%
    Roland GAIA 2
    498 €
    Ver oferta
  • -11%
    Focusrite Scarlett 8i6 3rd Gen
    177 €
    Ver oferta
edding
#2 por edding el 05/12/2004
Ninguna ayudita?
¿es que nadie le ha metido mano al sdk o que?.... ¡que es gratis! :wink:
Subo la recompensa de una birra a dos birras.
Subir
HorD
#3 por HorD el 06/12/2004
wauuuu .... q tiempito!!
Subir
VocoderPower
#4 por VocoderPower el 06/12/2004
Hey ya los he estado viendo, estan d pm! sobre todo el segundo, enhorabuena, no se muy bien en q consiste el sdk de steinberg. ¿podrias explicar un poco?

Siento no poder ayudarte, solo si tienes alguna duda de java, c o pascal y no mucho :s, un saludo.
Subir
texvo
#5 por texvo el 06/12/2004
hola:

no puedo aydarte, ya me gustaria...

he estado probando el modulador de banda lateral y va perfecto. practicamtne para conseguir sonidos metalizados de percusion, platos etc.

con la guiatrra tambien lo he probado y se consiguen sonidos muy curiosos, le falta un skin ;)

que tal un vocoder ;)

salud.
Subir
texvo
#6 por texvo el 06/12/2004
por cierto, si tienes curiosodad podrias bajarte el sdk de synthedit y pasar el codigo por el, estariamos muy agradecidos de disponer de algun modulo mas.... :oops:

salud
Subir
edding
#7 por edding el 06/12/2004
VocoderPower escribió:
Hey ya los he estado viendo, estan d pm! sobre todo el segundo, enhorabuena, no se muy bien en q consiste el sdk de steinberg. ¿podrias explicar un poco?


Hola. SDK son las siglas de Software Development Kit. En concreto el SDK de Steinberg son un conjunto de "reglas y normas" para programar efectos VST.
Como se usa programación orientada a objetos, lo que hace el SDK es definirte los objetos: sus atributos y métodos.
En concreto el método más importante es el que he posteado, ya que es el nucleo del proceso de VST.
En este método te pasan dos punteros a dos flotantes de 32 bits que son las muestras de entrada, tu haces las perrerias que quieras con las muestras y despues devuelves dos punteros a las muestras de salida.
El SDK original está en C++, pero hay un tal "tobybear" que lo ha traducido a delphi, y si sabes pascal puedes meterle a éste porque pascal y delphi son casi el mismo lenguaje:
http://www.axiworld.be/vst.html
Yo lo he compilado en delphi 7 y va de escandalo.

Es imprescindible que sepas programación orientada a objetos ya que si no, te puedes perder un poco. EL original escrito en C++ y lo puedes pillar del servidor de Steinberg:
http://ygrabit.steinberg.de/users/ygrab ... index.html
Tambien he probado a compilar el original con el Builder C++ 6 y tienes que hacer algunos truquillos que te explican en el primer enlace que te he dado, pero tambien va canela.

Animarse y meterle mano. Cuesta un poco solo al principio, pero si te gusta programar verás que no es nada del otro mundo. Te recomiendo que te bajes al principio plantillas "templates" para no tener que escribir todo el código y hacerte la vida mas facil. Si tienes cualquier duda y estoy por aqui te puedo echar un cable.

Salu2.
Subir
VocoderPower
#8 por VocoderPower el 06/12/2004
Hey edding muchas gracias, nada mas tenga un momento me pongo con ello, parece muy interesante, en POO me defiendo medianamente asi q a ver que pasa.

Si necesitas pruebas aqui estaré para testear tus progresos ;). (una iniciativa d pm la de programar algo de este estilo, q al fin y al cabo, en el futuro alguien lo tendra q hacer, ¿pq no nosotros xD?
Subir
Antonio Escobar
#9 por Antonio Escobar el 06/12/2004
Hola hermano!

Me has convencido :-), voy a bajarme ese SDK y recordar mi época de master del Delphi...

Un abrazo.
Subir
soem
#10 por soem el 06/12/2004
Alguien escribió:
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


Hola, supongo que ya lo habras visto pero en la documentacion del SDK viene el metodo getSampleRate:

virtual float getSampleRate ();

Saludos.
Subir
edding
#11 por edding el 07/12/2004
soem escribió:


Hola, supongo que ya lo habras visto pero en la documentacion del SDK viene el metodo getSampleRate:
virtual float getSampleRate ();
Saludos.


Si, al final lo llegué a ver! hay muchas cosas que puedes preguntarle al Host, incluso como se llama:
function getMasterVersion: Longint; virtual;
Y lo flipé con lo que llaman VSTutils porque vienen funciones bastante útiles pa manejar strings:
FourCharToLong
// FMod
// dB2string
// db2stringRound
// float2string
// long2string
// float2stringAsLong
// Hz2string (new)
// ms2string (new)
// gapSmallValue
// invGapSmallValue
Te quitan el trabajo sucio de convertir cadenas para representar en pantalla las unidades: Hz, dB, milisegundos...

En cuanto termine los examenes quiero hacer un GUI para que quede mas vistoso. Incluso puedes dibujar con el canvas de windows para pintar en pantalla pixeles a lo bruto para dibujar espectros y lo que se te antoje.

Viendo las facilidades que ha dado steinberg para programar VSTs no me extraña que se haya estandarizado.
Subir
Hilos similares
Nuevo post

Regístrate o para poder postear en este hilo