2010-06-26 5 views
9

Lorsqu'il est chargé dans n'importe quel hôte VST sur le marché, il permet à l'hôte d'envoyer un signal (vraisemblablement MIDI) au VSTi. Le VSTi traitera alors ce signal et produira un son synthétisé créé par un instrument logiciel dans le VSTi. Par exemple, l'envoi d'une note A4 (note MIDI, je crois) au VSTi le fera synthétiser le A au dessus de Middle C. Il renvoie les données audio à l'hôte VST, qui peut alors soit le lire sur mon haut-parleurs ou enregistrez-le au format .wav ou un autre format de fichier audio.Comment pourrais-je interagir par programmation avec les plugins VST (i) pour synthétiser l'audio? Par exemple, prenez le VSTi <a href="http://www.tweakbench.com/triforce" rel="noreferrer"><strong>Triforce</strong></a>, par Tweakbench.

Disons que je Triforce, et essaie d'écrire un programme dans ma langue de choix qui pourrait interagir avec le VSTi en envoyant une note A4 à synthétiser, et enregistrer automatiquement un fichier sur le système ? Finalement, j'aimerais pouvoir analyser un fichier MIDI entier à une piste (en utilisant des bibliothèques établies et stables déjà disponibles à cet effet) et l'envoyer au VSTi pour le "render"/le synthétiser en audio fichier.

Comment est-ce que j'irais à ce sujet, et dans quelle langue devrais-je regarder pour établir le cadre principal? En fin de compte, il sera utilisé dans un projet basé sur Ruby, de sorte que tous les pointeurs vers des ressources Ruby spécifiques seraient bien aussi.

Cependant, j'essaie simplement de comprendre en gros comment l'API d'un VSTi fonctionne. (J'ai réalisé que cette question est très liée à la question de la construction d'un hôte VST en premier lieu, mais qui ne peut enregistrer que les sorties VST et ne pas les lire, et avec une portée considérablement plus petite)

Merci d'avance pour toute aide =)

+0

Pour tous ceux qui trouveront cette question dans le futur, la bibliothèque JUCE C++ (http://www.juce.com/) pourrait être un bon point de départ pour construire un système comme celui-ci; il a des classes pour le MIDI, l'audio, l'hébergement de plugin, et l'écriture de plugin, et est bien testé et largement utilisé. – btown

Répondre

8

Eh bien, puisque vous avez demandé, le langage idéal pour un projet comme celui-ci va être C++. Bien qu'il existe des wrappers pour les langages de plus haut niveau tels que Java & .NET pour le SDK VST, je ne pouvais pas en trouver un pour Ruby (bien que j'ai trouvé ce projet plutôt cool qui vous permet program VST plugins in Ruby). Vous serez donc bloqué en faisant un peu d'intégration en C/C++ par vous-même.

Cela dit, vous avez deux options:

  1. Écrire un hôte VST en C++, et le lancement comme un processus distinct de l'intérieur Ruby.
  2. Intégrez votre code Ruby directement au SDK VST et chargez les DLL/bundles du plugin directement à partir de votre code. C'est probablement le moyen le plus propre mais le plus difficile pour atteindre votre objectif.

J'ai écrit un VST host programming tutorial sur mon blog un certain temps que vous pouvez trouver utile dans les deux cas. Il détaille comment vous ouvrez et communiquez avec les plugins VST sur Mac OSX et Windows. Une fois que vous avez demandé à votre hôte de charger les plugins, vous devez être capable d'envoyer des événements MIDI directement au plugin, soit en les lisant à partir d'un fichier ou d'un type de communication entre votre code Ruby et l'hôte VST (c.-à-d. pipe nommée, douille, dossier, etc.).Si vous n'êtes pas familier avec le protocole MIDI, consultez ces liens:

Comme vous peut-être déjà compris, VST est fondamentalement un protocole basé sur un bloc. Vous demandez des petits blocs de données audio à partir du plugin, et vous envoyez tout événement MIDI au plugin juste avant qu'il ne traite ce bloc. Assurez-vous que pas pour ignorer le champ delta MIDI; cela garantira que le plugin commence à traiter l'événement MIDI directement sur l'échantillon souhaité. Sinon, le plugin sonnera un peu hors-tempo, surtout dans le cas des instruments. Le kit VST SDK est également basé sur des blocs à virgule flottante. Par conséquent, toutes les données que vous récupérez contiennent des échantillons individuels dans la plage {-1,0 .. 1,0}. En fonction du format de sortie souhaité, vous devrez peut-être les convertir dans un autre format. Heureusement, il semble y avoir un Ruby binding for the audiofile library, donc vous pouvez être en mesure d'envoyer votre sortie dans le but de générer un fichier AIFF/WAV approprié.

En tout, ce sera un travail considérable pour atteindre l'objectif final que vous souhaitez atteindre, mais ce n'est pas impossible. Bonne chance!

+0

Je ne m'attendais vraiment pas à une réponse aussi utile =) Merci beaucoup! –

+0

Je suis heureux d'avoir pu vous aider. Avez-vous trouvé une bonne solution ou une combinaison de solutions pour votre projet? –

+0

Super réponse, cela m'a vraiment aidé. Merci! – Leif

Questions connexes