2010-06-26 18 views
9

Prendere, ad esempio, il VSTi Triforce, da Tweakbench. Quando viene caricato in qualsiasi host VST sul mercato, consente all'host di inviare un segnale (presumibilmente MIDI) al VSTi. Il VSTi elaborerà quindi quel segnale e produrrà l'audio sintetizzato come creato da uno strumento software all'interno del VSTi.Come posso interagire programmaticamente con i plug-in VST (i) per sintetizzare l'audio?

Ad esempio, inviando un A4 (nota MIDI, credo) al VSTi, verrà generato il sintetizzatore A sopra Middle C. Esso invia i dati audio all'host VST, che quindi può essere riprodotto sul mio altoparlanti o salvarlo su .wav o qualche altro formato di file audio.

Diciamo che ho Triforce, e sto cercando di scrivere un programma in mia lingua di scelta che potrebbe interagire con il VSTi inviando una nota A4 da sintetizzare, e automaticamente il salvataggio in un file sul sistema ?

Eventualmente, mi piacerebbe essere in grado di analizzare un intero file MIDI a una traccia (usando le librerie stabili e già disponibili per questo scopo) e inviarlo al VSTi per "renderizzarlo"/sintetizzarlo in un audio file.

Come potrei andare su questo, e in quale lingua dovrei cercare di costruire il framework principale?

In definitiva, verrà utilizzato in un progetto basato su Ruby, quindi qualsiasi suggerimento per specifiche risorse Ruby sarebbe bello.

Tuttavia, sto solo cercando di capire in pratica come funziona l'API di un VSTi. (Mi sono reso conto che questa domanda è molto correlata alla questione della costruzione di un host VST in primo luogo, sebbene possa salvare solo le uscite VST in file e non riprodurle e con uno scope considerevolmente più piccolo)

Grazie in anticipo per qualsiasi aiuto =)

+0

Per chi trova questa domanda in futuro, la libreria JUCE C++ (http://www.juce.com/) potrebbe essere un buon punto di partenza per costruire un sistema come questo; ha classi per MIDI, audio, hosting di plug-in e scrittura di plug-in, ed è ben collaudato e ampiamente utilizzato. – btown

risposta

8

Bene, dal momento che hai chiesto, il linguaggio ideale per un progetto come questo sarà C++. Sebbene esistano wrapper per linguaggi di livello superiore come Java & .NET per VST SDK, non sono riuscito a trovarne uno per Ruby (anche se ho trovato questo progetto piuttosto interessante che ti consente di effettuare il program VST plugins in Ruby). Quindi sarai bloccato a fare un po 'di integrazione con C/C++ da solo.

Detto questo, si hanno sostanzialmente due opzioni qui:

  1. Scrivi una VST Host in C++, e lanciarlo come un processo separato dall'interno Ruby.
  2. Integra il tuo codice Ruby direttamente nel VST SDK e carica le DLL/i pacchetti del plugin direttamente dal tuo codice. Questo è probabilmente il modo più pulito ma più difficile per raggiungere il tuo obiettivo.

Ho scritto un VST host programming tutorial sul mio blog un po 'indietro che potresti trovare utile in entrambi i casi. Descrive in dettaglio come si apre e comunica con i plug-in VST sia su Mac OSX che su Windows. Una volta che hai ottenuto l'host per caricare i plug-in, devi essere in grado di inviare eventi MIDI direttamente al plug-in, leggendoli da file o qualche tipo di comunicazione tra il tuo codice Ruby e l'host VST (ad esempio, un named pipe, socket, file, ecc.).Se non si ha familiarità con il protocollo MIDI, prova anche questi link:

Come si potrebbe aver già capito, VST è fondamentalmente un protocollo basato su blocchi. Richiedete piccoli blocchi di dati audio dal plug-in e inverete qualsiasi evento MIDI al plugin subito prima che elabori quel rispettivo blocco. Assicurati che non ignori il campo delta MIDI; questo assicurerà che il plugin inizi ad elaborare l'evento MIDI direttamente sul campione desiderato. Altrimenti, il plugin suonerà un po 'fuori tempo, specialmente nel caso degli strumenti.

L'SDK VST si basa anche su blocchi a virgola mobile, quindi tutti i dati che si ricevono contengono singoli campioni nell'intervallo {-1.0 .. 1.0}. A seconda del formato di output desiderato, potrebbe essere necessario convertirli in un altro formato. Fortunatamente, sembra esserci un Ruby binding for the audiofile library, quindi potresti essere in grado di inviare il tuo output in quello per generare un file AIFF/WAV appropriato.

In tutto, sarà una buona quantità di lavoro per raggiungere l'obiettivo finale desiderato, ma non è impossibile con qualsiasi mezzo. In bocca al lupo!

+0

Sicuramente non mi aspettavo una risposta così utile =) Grazie mille! –

+0

Felice di poter essere di aiuto. Hai finito per trovare una buona soluzione o un mix di soluzioni per il tuo progetto? –

+0

Risposta stupenda, questo mi ha davvero aiutato. Grazie! – Leif

Problemi correlati