Traficante escribió:Hola!
A mí me interesa mucho el mundo de los vsti y la programación musical!! Pero si te soy sincero, no tengo muy claro lo que estás publicando en este hilo
Un saludo
Hola,
perdona que haya tardado en responder, pero es que ando liadísimo y lo que iba a ser una revisión de CUSTOM9 para corregir sobre todo,un problema con la exportación de audio con el nuevo FluidSynth, se ha convertido en mucho mas debido a cambios mas profundos y añadidos.
Voy a intentar responderte a ti y a otras personas que puedan necesitar alguna información extra.
Partamos por el principio: MIDI es un protocolo de comunicación donde los dispositivos se conectan unos a otros y se envían una serie de eventos desde por ejemplo, un dispositivo fuente (por ejemplo, un teclado MIDI) hacia uno o más dispositivos receptores para que los procesen.
Si en un teclado MIDI pulsamos una tecla, se generará un evento "Note On", que codificará información sobre la nota, el canal que debe recibirla y la "velocidad" (fuerza con la que se pulsó, volumen, en la práctica) que se enviará al dispositivo receptor para que éste haga lo que considere oportuno. Cuando dejemos de pulsar esa tecla, se enviará un evento "Note Off" con la información necesaria para que cese la nota correspondiente.
Dicho de otra forma: si necesito que la nota DO suene durante 1 segundo, habrá que enviar un Note On que codifique dicha nota, esperar un segundo y luego, enviar un Note Off para silenciarla.
Así pues, tenemos un sistema de comunicación que trabaja en tiempo real, donde un instrumento como un teclado, genera eventos de notas (o de otro tipo) hacia otro dispositivo que los trate. Pero de igual forma, esos eventos pueden ser capturados y guardados en un formato de fichero (los ficheros MIDI .mid) de forma que luego puede ser reproducido como si se estuviera generando en tiempo real. Esto, básicamente, sería como una grabadora de sonido, pero aquí en lugar de grabar el audio, lo que se graban son los eventos que generan ese audio al ser procesados: si tu grabas el audio de un instrumento es lo que obtienes, pero si has grabado las notas a tocar, puedes obtener la misma melodía pero con el audio de instrumentos diferentes.
Por otra parte, al tener grabados esos eventos nos permite poder editarlos y modificarlos a nuestro antojo: a lo mejor los eventos del canal 0 (MIDI soporta hasta 16 canales) nos interesa reproducirlos en el canal 7. O a lo mejor me interesa cambiar el instrumento que sonará, o la duración de las notas... Así pues, necesitaríamos un editor.
Esta imagen muestra en el editor una representación de una nota, con el visor de eventos a la derecha:
Se puede apreciar una nota seleccionada, la E4 (Mi, Octava 4) que se visualiza justo arriba (algo nuevo de la CUSTOM10, cuando se pone el cursor encima) y a la derecha se ven los datos en detalle del evento (se pueden editar esos datos desde ahí, ojo). Visualmente, la longitud de la nota representa la duración, pero a efectos reales, todo se limita a un Note On en el tick 1821 y un Note Off en el tick 2142 (los ticks es la forma temporal como se guardan las notas. El como se corresponde con el tiempo real, depende del "Tempo" y de que como se acumule si se va cambiando en otra sección. Sí, lo sé, suena complejo
)
Por cierto, con esta representación, si otros canales superponen notas, como por ejemplo un E4 que sea tapado o tape al anterior, se hace algo dificil trabajar. En "Channels" tenemos la posibilidad de ocultar canales o de desplazar visualmente las notas, como se muestra aquí:
Podéis ver que es "1" con fondo verde en Channel 1, es un desplazamiento de todas las notas del canal, que sin variar el valor, desplaza la posición, en este caso, una octava arriba (se ve que E4 está en la posición de E5). Esto es marcado de forma especial, con diferente textura al dibujar la nota y con el marcador que se muestra de fondo amarillento). Como digo, esta transposición solo afecta de forma visual y no sonora.
El MidiEditor de base, permitía conectarse a un dispositivo de entrada (como un teclado), grabar sus eventos, editarlos, añadir a mano otras cosas y luego conectarse a un dispositivo de salida (podría ser el mismo teclado u otro instrumento, el dispositivo interno de Windows (Microsoft GS Wavetable Synth 0, me aparece a mi en Windows 10) u otro externo, virtual, etc). También disponía de la posibilidad de conectar la entrada con la salida, de forma que, en tiempo real, pudieramos escuchar lo que se toca en el dispositivo de entrada.
MidiEditor CUSTOM se destaca, para empezar, porque añade de forma interna un dispositivo de salida "virtual" llamado FluidSynth. Y esto le permite reproducir directamente el sonido, sin depender de otro dispositivo de salida. Y lo hace de forma que se pueden utilizar bancos de instrumentos que el usuario puede importar desde un fichero Sound Font y expandir nuestro universo. Pero antes de hablar mas a fondo de esto, pongamos imágenes.
Pulsando en el menú Midi->Settings, podemos ver en Midi I/O algo similar a esto, cuando hay un dispositivo de entrada conectado:
Podemos ver que como dispositivo de salida, está fijado "** Fluid Synth **" , pero también el dispositivo de Microsoft y los de mi teclado Roland (este teclado no "suena". Enviar eventos sería mas bien para programarlo internamente o para usarlo como paso a otros instrumentos que se conecten a el). Y como dispositivo de entrada, vemos A-PRO 1 1 también de mi teclado Roland. La flecha roja señala al botón que conecta MIDI in y MIDI out, de forma que así como se ve en la imagen, si toco notas en mi teclado, se reproduce el sonido en tiempo real a través de Fluid Synth. Eso permite que un "cacho de plástico" que solo hace ruido si cruje, se convierta potencialmente en un sintetizador de la leche con el que "jugar"
Como editor, MidiEditor puede cargar un fichero MIDI que generamos de otra parte o crear nosotros mismos los eventos con la herramienta de lápiz u otras. Eso nos puede permitir trabajar sin tener un dispositivo de entrada, pero es obvia la necesidad de tener un dispositivo de salida.
Gracias a Fluid Synth tenemos la necesaria conversión de eventos de notas a audio. MidiEditor permite tanto el filtrado y procesado de los eventos de entrada de un dispositivo externo (Mediante Midi In Control, que es ese icono que se ve de teclado a la derecha de la flecha roja en la imagen anterior, o accediendo desde Menu->MIDI), como los de salida mediante Fluid Synth.
Accediendo a Fluid Synth Control (el engranaje azul a la derecha de la flecha roja de la imagen anterior, o accediendo desde Menu->MIDI) podemos ajustar o conectar elementos de una mesa de mezcla (pestaña Main Volume):
Se pueden apreciar 12 de los 16 canales estéreo con los que trabajamos. MIDI está limitado a 16 canales (y son los mismos, estén en la pista que estén, pues el concepto "Track" es a nivel de archivo, no de evento) y una vez que tenemos audio se abre la vía a procesarlo con módulos como los VST, claro. Por eso se acabó metiendo el soporte
La otra cara de Fluid Synth Control (y no menos importante) es la pestaña "config":
Se puede apreciar la Sound Font que utilizo, así como los datos de audio de salida de mi portátil (siempre stereo o bien a 16 bits con signo o a 32 bits en coma flotante. En este caso, coma flotante para mejor calidad), los datos de la conversión previa a WAV (se puede exportar el audio a WAV, MP3 y FLAC) así como datos de configuración necesarios para MP3 y datos ID3. Guardar los ID3 tags se hace en el propio MIDI en un evento de texto tipo "copyright.
Sound Fonts (.sf2 y .sf3) podéis encontrar por ahí, a patadas. Importante es que tengáis alguno que recoja los instrumentos GM (General Midi). Es posible editar estos archivos y añadir cosas. De hecho, el .sf2 que utilizo es muy grande, pues dispone de varios bancos con montones de instrumentos,
Una imagen donde se aprecian algunos de los presets del banco 0, en el editor:
Bueno y ahora ya explicado esto,
vayamos al soporte VST. VST de Virtual Studio Technology, nos permite añadir o bien módulos de procesamiento de señal (efectos de audio) o bien generadores de señal (sintetizadores de audio). Los primeros procesan los samples de audio procedentes del sintetizador interno de FluidSynth, que los genera a través del banco de instrumentos de la Sound Font. Los segundos requieren recibir al menos, los eventos de las notas de audio. MidiEditor CUSTOM soporta los dos tipos, pudiendo, en la versión de 64 bits, utilizar módulos de 32 bits (viejos). Obviamente, como los VSTi requiren eventos, se fijan como VST1 del canal, dejando VST2 en este caso, como un módulo de efectos a aplicar sobre el resultado de VST1.
Voy a poner unos ejemplos de audio con o sin empleo de VST/VSTi.
Audio limpio, sin VST:MP3 La Fiesta - sin VSTAudio con VST de efectos BYOD "Jimmy Hendrix":MP3 La Fiesta - con VST EfectosAudio con VST sintetizador Elsa Panther:MP3 La Fiesta - con VST SintetizadorEn este último, que el instrumento seleccionado sea una Guitarra eléctrica es irrelevante, pues es el VST el que genera el sonido.
Y bueno, ha sido largo, pero es todo por el momento
. A ver si termino la CUSTOM10. Saludos
--------------
Edit:
Buenas,
ayer tuve un problema con Fluidsynth y su manera caprichosa de tratar los bancos de instrumentos y los eventos de programa (cambio de instrumentos), que ya pensaba que tenía solucionado... aunque ahora parece que si. Es un problema que se da desde que cambiaron a la versión 2.x y, sinceramente, mira que es raro que yo sea el único que parece darse cuenta que algo no va bien con el asunto... tal vez porque uso un .sf2 grande o yo que se. El caso es que tirando de una de las flautas que tengo en uno de los bancos... sonaba piano. Y esta vez era al reproducir, no al importar (que utiliza un método distinto, que es el que mas problema dió). Y a pesar de que me empeñé en que forzosamente, se enviaran primero los eventos de control antes que los de prg, ocurría. Incluso si ponía una espera entre ambos de 10 segundos (por poner algo bestia), pasaba lo mismo (yo creo que es un problema multihilo, que hace que aunque envies uno antes que el otro, se recepcionen al revés....). Si embargo, si el evento de programa se produce en la línea de tiempo de la reproducción, sí que funciona de forma correcta. ¿Solución?. Implementar un sistema que al enviar un cambio de banco en un canal, activa un "flag" que hace que justo antes de la primera nota musical afectada, se envíe el cambio de programa (cambio de instrumento) y así, funciona bien...
Estoy un poco cansado ya, jolines: si de por sí, es bastante trabajo y simplemente, publicar la release y hacer una somera descripción de los cambios, ya supone lo suyo y da pereza... también me gustaría detallaros cosas sobre el manejo del editor y no doy para todo... y que encima, surjan complicaciones, no ayuda. En fin, voy a trabajar unos días mas a ver si podemos librar al programa de alguno de sus defectos...
Los cambios efectuados en CUSTOM 10:
- Mejor manejo de las lineas de división de la "trama" del editor (menú View->Raster), donde se incluye una nueva opción que al hacer click sobre ella, ajusta sobre los BPM de la caja de ritmos (Drum Rhythm Box). Eso unido a la herramienta "Magnet" (el botón del imán o en Tools->Magnet), que permite alinear notas en base a esa trama, usando o bien el inicio de la nota o el final. Antes, Magnet era un desastre... ahora parece funcionar bien.
- La "Standard Tool" (la de la flecha), que permite trabajar a una nota (aunque permite hacer selección múltiple pulsando la tecla SHIFT o MAYUSCULAS) para que suene, seleccionarla, moverla o redimensionarla, ha cambiado de forma que ahora el cursor del ratón se visualiza de forma estable, la redimensión de la nota es mas sencilla y solo si mantienes el botón del ratón más de un segundo, permite mover la (o las) notas. Esto último con la idea de intentar evitar que las notas se desplacen un poquito tratando de seleccionarlas.
Además, al posicionar el cursor sobre una nota, muestra datos sobre ella. Y si se pulsa CONTROL en el teclado y luego click sobre la nota, esta suena sin peligro a modificar nada. Y tambien se ha cambiado la duración de tiempo de ese sonido, de forma que se ajuste a la longitud de la nota (salvo que éste sea muy largo, que entonces se topa a 2 segundos). Todo ello pensando en una reproducción nota a nota mas fiel, por así decir.
- Otra mejora tiene que ver con el Undo/redo (hacer/rehacer) que incluye una limitación seleccionable a 64 pasos (en Edit->Limit list Undo to 64 steps) para evitar un disparo excesivo en el consumo de memoria. Pero también se ha añadido un sistema que almacena en fichero una lista de hasta 16 entradas conteniendo las últimas modificaciones que afecten al archivo midi... La idea es que si se produce un fallo inesperado del programa (puede pasar... ya que no solo el programa tiene sus bugs, si no que puede fallar al asignar memoria o comerse un bug que tenga un plugin VST y a tomar viento...), se puede recuperar ese archivo que estaba sin guardar o ir a un punto anterior.
Si el programa falla aparecerá una caja de mensajes con varias opciones. Ojo por que esta caja puede aparecer si hemos modificado un archivo y abrimos otra estancia de Midieditor -(haciendo click sobre un .mid por ejemplo)... esa instancia detectará un archivo que se crea al efecto y solo se borra cuando salimos normalmente del programa.
En el menú File->Recover file from Backup list, podemos ver la lista a recuperar siendo la mas reciente la de más arriba.
- Tambien se ha mejorado el tema de la liberación de memoria, tanto al abrir/cerrar ficheros como en la lista Undo/Redo, que de forma original, se pasaban por el forro el uso del destructor de las clases C++ en las que se programa esta aplicación. Y claro, es contribuye a gastar cantidades de memoria poco decentes que acaban contribuyendo a un final inexperado del programa. No sabéis cuantos quebraderos de cabeza me ha dado esto y sobre todo el Undo/redo de los cojones...
- La implementación de Fluidsynth 2.x se ha mejorado y remozado, sobre todo al nivel de exportación. Digamos que Fluidsynth tiene dos formas de tratar los eventos: de forma directa o en tiempo real, donde una nota de un segundo implica que pase ese segundo realmente. O de forma "secuenciador" donde el tiempo es indicado de otra forma y mas allá de lo que consuma el procesado de samples, la reproducción se acelera bastante y eso acorta el tiempo que se tarda en exportar ficheros. Aunque es curioso: la forma de resolver los problemas encontrados, implican el envío de forma directa de los eventos de control, etc, y a través de secuenciador de las notas. De tal forma, que al final, el resultado sea el mismo, pero la espera no, claro.
- Por último, se ha cambiado la interfaz visual del programa. En un principo, la CUSTOM pretendía añadir mejoras a Midieditor y no desplazar de forma alguna al autor original, etc. Pero los años han pasado... y viendo que el autor original no incorpora mis cambios, cuando todo está modulado de forma que es muy sencillo compilar sin Fluidsynth, etc, pero aprovecharse de otras mejoras y en realidad, parece que agotó su tiempo y está a otras cosas, pues... ¿por que no hacer otros cambios con mayor libertad?
Esto es código libre, el fuente está disponible y en realidad, todo está añadido de forma que hace muy sencillo revertir ciertos cambios y volver a lo original. Por ejemplo, si no se define CUSTOM_MIDIEDITOR_GUI al compilar, la nueva GUI desaparece sin molestar. Así que considero que esos cambios, que a mi me gustan, no rompen de ninguna manera con lo original, pero si marcan una diferencia entre lo que era MidiEditor y lo que es MidiEditor CUSTOM.
Hay otras cosas que me dejo en el tintero, pero así "resumido" es lo que está hecho.
Me gustaría compartir el temita que me dió problemas con una de las flautas. Es un tema que armé en el 2020 y que ahora tiene algunas modificaciones, de corte clásico con el uso de flautas y un instrumento de cuerda. Una curiosidad, aquí se hace uso del plugin VST BYOD para el efecto "panner" entre los canales izquierda/derecha y modo de control de ganancia:
https://raw.githubusercontent.com/Estwa ... r%20v2.mp3