Desarrollo VSTi, frecuencias muestreo y tablas lookup

BlahBlah
#1 por BlahBlah el 05/09/2016
Buenas,


incitado por algunos amigos, me he atrevido a desempolvar un instrumento VST que comencé hace como 11 años y que se quedó como casi todo en mi vida: a medias.

Pero tras todos estos años, ha habido una evolución en este terreno que yo no he seguido muy de cerca y se me plantean nuevas dudas.

La principal tiene que ver con la frecuencia de trabajo. Yo empecé la programación pensando en trabajar a 44.1 KHz y 48 KHz.
Me pareció más que suficiente en su época.
Sin embargo, no tengo costumbre de trabajar con instrumentos virtuales: ¿es común hoy en día usarlos en entornos de producción a 96 KHz o más?

En caso afirmativo, y ya que nunca he trabajado a esa frecuencia (más que para volcar mezclas finales o másters), lo primero que se me ocurre es qué pasa con las formas de onda generadas.

El sinte original usaba unas tablas de lookup con una especie de tabla de ondas básicas (en realidad un seno, para evitar hacer cálculos trigonométricos al vuelo).

¿Cuál sería la recomendación en este caso? ¿Hacer las tablas lookup con resolución 96 KHz y luego algún tipo de dithering para trabajar con menos frecuencia de muestreo?

¿O hacer que la aplicación trabaje internamente como si fuese 48 KHz y convertir formato a la salida?
Subir
jd800 forever Baneado
#2 por jd800 forever el 06/09/2016
:comer:
Subir
1
BlahBlah
#3 por BlahBlah el 06/09/2016
#2

Sí.... túuuuuuuu :-D :-D :-D
Subir
vagar
#4 por vagar el 06/09/2016
Tu instrumento debe poder trabajar a cualquier frecuencia de muestreo, cuyo valor recibe como parámetro en el momento de crear una instancia.

Hoy en día con la potencia que tienen las CPU hacer cálculos trigonométricos tampoco implica tanta sobrecarga, pero si quieres optimizar puedes hacer varias cosas. Puedes usar librerías ya creadas, o hacer aproximaciones como éstas:

http://www.dspguru.com/book/export/html/62

También puedes precalcular una tabla de cuarto de onda a 192 kHz e interpolar si necesitas menos frecuencia. Si no requieres precisión de fase más allá de la frecuencia de muestreo no necesitarías interpolar a 192, 96 y 48. Para 44.1 o 88.2 seguramente una interpolación lineal te daría precisión suficiente, pero también podrías precalcular otro cuarto de onda a 88.2.
Subir
BlahBlah
#5 por BlahBlah el 06/09/2016
#4

Gracias.

El asunto es que en la nueva versión ya sí voy a tener que añadir formas de onda más complejas (tomadas de un sintetizador digital de los 80).

En ese caso tengo que usar lookup table sí o sí. Y sí, justamente lo que necesito aquí es precisión de fase.

Resumiendo, entonces, entiendo que lo mejor es almacenar las formas de onda en la máxima resolución de frecuencia (entiendo que 192 KHz) y luego interpolar para frecuencias menores, ¿es así?
Subir
vagar
#6 por vagar el 06/09/2016
Si quieres precisión total de fase tienes que interpolarlo absolutamente todo, de lo contrario sólo podrías arrancar osciladores coincidiendo con los instantes de muestreo.

Respecto al resto de señales, resolverlas con tablas de onda o algorítmicamente depende de lo bien que se pueda describir dicha onda usando operaciones matemáticas poco costosas.
Subir
BlahBlah
#7 por BlahBlah el 06/09/2016
#6

Pues ahí estoy.
Al menos dos de las formas de onda las puedo resolver algorítmicamente (entre ellas el seno y el ruido).

Las otras son una especie de diente de sierra pero cuya rampa está suavizada como si fuese un cuarto de seno, pero con alguna variación.
Creo que puedo hacer una aproximación algorítmicamente. Sin embargo, si quiero reproducir el sinte original (como me gustaría, ciertamente) quizás me salga más a cuenta samplear un ciclo de cada forma de onda y almacenarlo en la tabla.

Creo que tocará hacer pruebas con ambas versiones y quedarme con la que suene más fiel al original.
Subir
vagar
#8 por vagar el 06/09/2016
#7

Posiblemente sea entonces una exponencial periódica, es una señal fácil de producir analógicamente conmutando un circuito RC. Se puede aproximar polinómicamente con una serie de Maclaurin.
Subir
BlahBlah
#9 por BlahBlah el 06/09/2016
#8

Exacto, es la forma en que pensé hacerlo.

Pero queda ahí como un "piquito" que... hmmm no me termina de encajar matemáticamente. Intentaré hacerlo así y si veo algún matiz que difiera del original, no me complico y recurro a la tabla lookup (que, además, será más eficiente, un asunto que me importa mucho pues, si consigo acabar el proyecto con éxito la versión VSTi, también lo quiero "raspberrear" y ahí los recursos de cálculo ya no son tantos).
Subir
pablofcid mod
#10 por pablofcid el 06/09/2016
El piquito podría ser un remanente del rearmado del oscilador analógico en cada ciclo. Le dan un pequeño plus de brillo, pero generalmente no se estrechan tanto al cambiar de una nota a otra, sino q aprox permanecen fijos. Así q muestrear sin más no sería lo más fiel. Puedes pensar en descomponer en el piquito, y ver si es fijo y muestreabke, más la caída que puedes hacer algorítmicamente cono decías, o bien almacenar un lookup muy altamente sobremuestreado para ahorrarte interpolaciones elevadas y que te baste una lineal o incluso orden cero para el grado de SNR final que quieras manejar.
Subir
BlahBlah
#11 por BlahBlah el 06/09/2016
#10

Alguien escribió:
El piquito podría ser un remanente del rearmado del oscilador analógico en cada ciclo


El original es un oscilador digital, y a juzgar por cómo evoluciona con la frecuencia la forma de onda, apostaría a que los valores también los toma de una tabla interna.

El piquito, por cierto, varía según la onda escogida. Digamos que, entre otras, tiene Sawtooth 1, Sawtooth 2, Sawtooth 3, etc. y cada "versión" de la "Sawtooth" tiene ese piquito más agudo. Dado que es un sinte sin filtros, aparentemente quisieron simular de esta forma distintas versiones "filtradas" del diente de sierra.
Subir
pablofcid mod
#12 por pablofcid el 06/09/2016
Hoy que no hay q ajustar nada por problemas de tamaño rom/ram, pensaría lo del lookup sobremuestreado a lo bestia. Puedes hacer el cálculo interpolando con una sinc enorme y partiendo de suficientes ciclos de la señal, para luego quedarte uno. Puedes reducir así todo cuanto quieras el error de interpolación y el cálculo de la señal se convierte solo en cálculo del avance del puntero para leer el lookup. Pero ojo con si hay varias ondas grabadas en el original para cada zona del registro, por el problema de alias al leer el lookup para notas altas.
Subir
BlahBlah
#13 por BlahBlah el 06/09/2016
#12

Eso es lo que trato de averiguar ahora.

Después de cenar voy a hacer la prueba de samplear el instrumento en la octava superior, y comparar esa onda con la de la octava inferior tras un proceso de "repitch" equivalente.

Si ambas ondas se parecen lo suficiente, con toda probabilidad el instrumento original sólo tiene una tabla pata todo el rango tonal. Y espero que así sea.
Subir
BlahBlah
#14 por BlahBlah el 07/09/2016
Bueno, pues como me temía, estoy complicándome más de la cuenta.

El sinte original parece usar una tabla lookup centrada en el C medio, única para todo el rango tonal, sin interpolación y sin filtrar el aliasing resultante.

He grabado un wav directamente del instrumento original cubriendo todo el rango y el aliasing superior es claramente un síntoma de usar una tabla lookup sin interpolación de ninguna clase:

https://drive.google.com/open?id=0B2YAF8t0-U8yTnEzcGFLcFBWaHc

En las frecuencias graves también se escuchan cosas raras, supongo debido a lo mismo.

Ahora el dilema es: se trata de un sinte FM. Esta grabación es de un operador a pelo (usando una envolvente aplicada a tono en dos tramos).

Es obvio que ese brutal aliasing, cuando este operador esté trabajando como modulador de otro, debe formar parte inequívoca del carácter del sonido y de los resultados finales en cada preset.

Es un "defecto" pero si lo evito, habrá patches que directamente suenen irreconocibles respecto del original.
Subir
Hilos similares
Nuevo post

Regístrate o para poder postear en este hilo