2010-06-26 11 views
9

Tome, por ejemplo, el VSTi Triforce, por Tweakbench. Cuando se carga en cualquier host VST en el mercado, permite al host enviar una señal (presumiblemente MIDI) al VSTi. El VSTi procesará esa señal y emitirá audio sintetizado creado por un instrumento de software dentro del VSTi.¿Cómo me relacionaría programáticamente con los complementos de VST (i) para sintetizar audio?

Por ejemplo, al enviar un A4 (nota MIDI, creo) al VSTi causará que se sintetice el A por encima del medio C. Envía los datos de audio al host VST, que luego podría reproducirlos en mi altavoces o guárdelo en .wav o en algún otro formato de archivo de audio.

Digamos que tengo Trifuerza, y estoy tratando de escribir un programa en mi idioma de su elección que podría interactuar con el VSTi mediante el envío de una nota A4 que se sintetizan y guardarlo automáticamente en un archivo en el sistema de ?

Eventualmente, me gustaría poder analizar todo un archivo MIDI de una pista (usando bibliotecas establecidas y estables ya disponibles para este propósito) y enviarlo al VSTi para "renderizarlo"/sintetizarlo en un audio archivo.

¿Cómo voy a hacer esto, y en qué idioma debo buscar para construir la estructura de núcleo?

En última instancia, se utilizará en un proyecto basado en Ruby, por lo que cualquier sugerencia a los recursos específicos de Ruby sería agradable también.

Sin embargo, estoy tratando de entender básicamente cómo funciona la API de un VSTi. (Me he dado cuenta de que esta pregunta está muy relacionada con la cuestión de construir un host VST en primer lugar, aunque solo pueda guardar las salidas VST en un archivo y no reproducirlas, y con un alcance considerablemente menor)

Gracias de antemano por cualquier ayuda =)

+0

Para cualquiera que encuentre esta pregunta en el futuro, la biblioteca JUCE C++ (http://www.juce.com/) podría ser un buen punto de partida para construir un sistema como este; tiene clases para MIDI, audio, alojamiento de complementos y escritura de complementos, y está bien probado y ampliamente utilizado. – btown

Respuesta

8

Bueno, ya que lo ha preguntado, el lenguaje ideal para un proyecto como este va a ser C++. Aunque hay envoltorios para lenguajes de alto nivel como Java & .NET para VST SDK, no pude encontrar uno para Ruby (aunque encontré este proyecto bastante genial que te permite program VST plugins in Ruby). Así que estarás atrapado haciendo algún grado de integración con C/C++ por tu cuenta.

Dicho esto, usted tiene básicamente dos opciones aquí:

  1. para tu dispositivo host VST en C++, y lanzarlo como un proceso independiente desde el interior de Ruby.
  2. Integre su código de Ruby directamente al SDK de VST, y cargue los archivos DLL/Bundles del complemento directamente desde su código. Esta es probablemente la manera más limpia pero más difícil de lograr su objetivo.

Escribí un VST host programming tutorial en mi blog hace un tiempo atrás que puede ser útil en cualquier caso. Detalla cómo se abre y se comunica con los complementos de VST en Mac OSX y Windows. Una vez que haya conseguido que su host cargue los complementos, debe poder enviar eventos MIDI directamente al plugin, ya sea leyéndolos desde un archivo o algún tipo de comunicación entre su código Ruby y el host VST (es decir, un tubería, conector, archivo, etc.).Si no está familiarizado con el protocolo MIDI, echa un vistazo a estos enlaces:

Como podría haber ya descubierto, VST es fundamentalmente un protocolo basado en bloques. Solicitas pequeños bloques de datos de audio desde el complemento y envías cualquier evento MIDI al complemento justo antes de que procese ese bloque respectivo. Asegúrese de no para ignorar el campo delta MIDI; esto asegurará que el complemento comience a procesar el evento MIDI directamente en la muestra deseada. De lo contrario, el complemento sonará un poco off-tempo, especialmente en el caso de los instrumentos.

El VST SDK también se basa en bloques de coma flotante, por lo que cualquier dato que obtenga contendrá muestras individuales en el rango {-1.0 .. 1.0}. Dependiendo del formato de salida que desee, puede necesitar convertirlos a algún otro formato. Afortunadamente, parece haber un Ruby binding for the audiofile library, por lo que puede enviar su salida a eso para generar un archivo AIFF/WAV adecuado.

En total, será una gran cantidad de trabajo para llegar a su objetivo final deseado, pero no es imposible de ninguna manera. ¡Buena suerte!

+0

Definitivamente no esperaba una respuesta así de útil =) ¡Muchas gracias! –

+0

Me alegro de poder ser de ayuda. ¿Acabaste encontrando una buena solución o una combinación de soluciones para tu proyecto? –

+0

Respuesta impresionante, esto realmente me ayudó. ¡Gracias! – Leif

Cuestiones relacionadas