VST (Virtual Studio Technology) is a trademark of Steinberg Media Technologies. A VST host program gets music note and instrument information from a MIDI file or keyboard and sends it to a VST plug-in, which reads the information and sends its relevant WAVE data back to the VST host program, which then sends the WAVE data to the computer's operating system or sound card or an ASIO driver to play the music. To write either a VST plug-in or a VST host software program, you need to get the freely available VST SDK 2.4 from Steinberg. This SDK contains very little helpful information, but it does have all the C++ APIs (Application Program Interfaces) needed to write such a program. There are newer VST SDKs, but they add more complexity than improvements, so I don't recommend them. HOWEVER, the SDK 2.4 will no longer be available from Steinberg after the end of 2013! The VST SDK 2.4 also includes source code for three very simple VST plug-ins and a very simple VST host. They're good starting-points if you're going to write a VST plug-in or host. When writing a VST host for Windows, you need to replace LoadLibrary in minihost.cpp (in the VST SDK 2.4) with this: LoadLibraryEx(fileName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); (fileName can be "C:\\Program Files\\VstPlugins\\VSTSynthFont.dll" or whatever) The MIDI note/instrument format is in 3 bytes: 0x90|MIDI channel) | MIDI note << 8 | MIDI note velocity << 16) The 0x90 means it's note information, MIDI channel can be 0 thru 15 (and is part of the "status byte" (users call them channels 1 thru 16)) Channels hold the instrument designations (piano, violin, etc). A note's end is signaled by sending 0x80 in the status byte instead of 0x90 (0 being the channel). Or 0x90 with 0 velocity. MIDI note is a music note converted to MIDI numbers, where low A on an 88-key piano is 21, middle C is 60, and the highest C is 108. MIDI note velocity is note volume (0 thru 127). Other MIDI data can be sent in the same 3 byte format. See the Internet for more about the MIDI Specification. MIDI information is placed in an array named VstEvent (in aeffectx.h). An array of these arrays named VstEvents (also in aeffectx.h) is sent from the VST host to the VST plug-in. Minihost.cpp, which is included in the VST SDK 2.4, doesn't send MIDI data, so somewhere following the line: effect->dispatcher (effect, effMainsChanged, 0, 1, 0, 0); // which sends a "resume" to the plug-in you have to insert: effect->dispatcher(effect, effProcessEvents, 0, 0, vstEvents, 0.0); // give plugin vstEvents data The plug-in will call processEvents to receive the MIDI note info, and then processReplacing to send its WAVE data. Examples of both are in vstxsynthproc.cpp in the VST SDK 2.4. Disregard the handling of deltaFrames in that example, because it's outdated. According to AdmiralQuality at kvraudio.com, deltaFrames is now defined as limited to between 0 and the size of the outputs array, which is shown in the following example. Because of this definition of deltaFrames, you have to send MIDI data one note (or simultaneous notes) at a time to the VST plug-in. Minihost.cpp receives the WAVE data in the outputs array thus: effect->processReplacing (effect, inputs, outputs, kBlockSize); // tell plugin to fill kBlockSize outputs array for (x = 0; x < kBlockSize; x++) { Buf[x] = outputs[0][x]; // left channel x++; Buf[x] = outputs[1][x]; // right channel } Use Steinberg's ASIO to play the WAVE data. The ASIO API is also free and is fairly well documented. What's not mentioned is that it puts WAVE data that it receives into another buffer, which it keeps filling, while playing it. This means that it can be done getting the WAVE data just as fast as the VST plug-in can send it. But of course the music is played usually at 44,100 samples/second, which is much slower than the WAVE data is transferred. ASIO expects everything to be exactly as it wishes, and will happily crash if it's not, at least when using ASIO4ALL, as I do in PianoRollComposer. PianoRollComposer.cpp includes VST and ASIO host source code in the VSTthread routine.