Skip to content

Instantly share code, notes, and snippets.

@ebenoist
Last active February 19, 2017 15:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ebenoist/263447603eb6449b14320fab381643d7 to your computer and use it in GitHub Desktop.
Save ebenoist/263447603eb6449b14320fab381643d7 to your computer and use it in GitHub Desktop.
VST Host
#include "../JuceLibraryCode/JuceHeader.h"
class App : public JUCEApplication {
public:
App() {}
~App() {}
void initialise(const String& commandLine) override {
AudioPluginInstance* plugin = findAndCreateVST(commandLine.getIntValue());
AudioProcessorGraph* graph = buildBasicGraph();
AudioProcessorGraph::Node* pluginNode = graph->addNode(plugin);
// Add audio in to pluginNode
graph->addConnection(graph->getNode(0)->nodeId, 0, pluginNode->nodeId, 0);
// Add midi in to pluginNode
graph->addConnection(
graph->getNode(2)->nodeId, AudioProcessorGraph::midiChannelIndex,
pluginNode->nodeId, AudioProcessorGraph::midiChannelIndex);
// Add pluginNode to audio out
graph->addConnection(pluginNode->nodeId, 0, graph->getNode(1)->nodeId, 0);
std::cout << "Started\n";
}
AudioPluginInstance* findAndCreateVST(int index) {
std::cout << "You selected plugin number: ";
std::cout << index;
std::cout << "\n";
AudioPluginFormatManager* pluginManager = new AudioPluginFormatManager();
KnownPluginList* list = loadPlugins(pluginManager);
PluginDescription* desc = list->getType(index);
String error;
AudioPluginInstance* plugin =
pluginManager->createPluginInstance(*desc, 0, 0, error);
if (!error.isEmpty()) {
std::cout << "Could not initialize the specified plugin: ";
std::cout << desc->name;
std::cout << "\n";
}
return plugin;
}
AudioProcessorGraph* buildBasicGraph() {
AudioDeviceManager* device = new AudioDeviceManager();
device->initialiseWithDefaultDevices(3, 2);
device->setMidiInputEnabled("my-midi", true);
device->addMidiInputCallback("my-midi", player);
AudioProcessorPlayer* player = new AudioProcessorPlayer();
AudioProcessorGraph* graph = new AudioProcessorGraph();
player->setProcessor(graph);
device->addAudioCallback(player);
graph->clear();
AudioProcessorGraph::AudioGraphIOProcessor* in;
in = new AudioProcessorGraph::AudioGraphIOProcessor(
AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode);
AudioProcessorGraph::AudioGraphIOProcessor* out;
out = new AudioProcessorGraph::AudioGraphIOProcessor(
AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode);
AudioProcessorGraph::AudioGraphIOProcessor* midiIn;
midiIn = new AudioProcessorGraph::AudioGraphIOProcessor(
AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode);
graph->addNode(in);
graph->addNode(out);
graph->addNode(midiIn);
return graph;
}
KnownPluginList* loadPlugins(AudioPluginFormatManager* pluginManager) {
std::cout << "======SCANNING FOR PLUGINS======\n";
pluginManager->addDefaultFormats();
KnownPluginList* list = new KnownPluginList();
File file;
for (int i = 0; i < pluginManager->getNumFormats(); i++) {
AudioPluginFormat* format = pluginManager->getFormat(i);
PluginDirectoryScanner* scanner = new PluginDirectoryScanner(
*list, *format, format->getDefaultLocationsToSearch(), true, file,
false);
String name;
while (scanner->scanNextFile(true, name)) {
// Load each plugin and then continue
}
}
std::cout << "=======SCANNING DONE=======\n";
std::cout << "Loaded a total of ";
std::cout << list->getNumTypes();
std::cout << " plugins. \n";
std::cout << "========PLUGIN LIST========\n";
for (int i = 0; i < list->getNumTypes(); i++) {
std::cout << i;
std::cout << ": ";
std::cout << list->getType(i)->name;
std::cout << "\n";
}
return list;
}
void shutdown() override { std::cout << "Goodbye"; }
const String getApplicationName() override { return "VST HOST"; }
const String getApplicationVersion() override { return "1.0"; }
};
// this generates boilerplate code to launch our app class:
START_JUCE_APPLICATION(App)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment