+#endif /* HAVE_SLV2 */
+
+#ifdef VST_SUPPORT
+
+VstEvents*
+BufferSet::get_vst_midi (size_t b)
+{
+ MidiBuffer& m = get_midi (b);
+ VSTBuffer* vst = _vst_buffers[b];
+
+ vst->clear ();
+
+ for (MidiBuffer::iterator i = m.begin(); i != m.end(); ++i) {
+ vst->push_back (*i);
+ }
+
+ return vst->events();
+}
+
+BufferSet::VSTBuffer::VSTBuffer (size_t c)
+ : _capacity (c)
+{
+ _events = static_cast<VstEvents*> (malloc (sizeof (VstEvents) + _capacity * sizeof (VstEvent *)));
+ _midi_events = static_cast<VstMidiEvent*> (malloc (sizeof (VstMidiEvent) * _capacity));
+
+ if (_events == 0 || _midi_events == 0) {
+ free (_events);
+ free (_midi_events);
+ throw failed_constructor ();
+ }
+
+ _events->numEvents = 0;
+ _events->reserved = 0;
+}
+
+BufferSet::VSTBuffer::~VSTBuffer ()
+{
+ free (_events);
+ free (_midi_events);
+}
+
+void
+BufferSet::VSTBuffer::clear ()
+{
+ _events->numEvents = 0;
+}
+
+void
+BufferSet::VSTBuffer::push_back (Evoral::MIDIEvent<framepos_t> const & ev)
+{
+ if (ev.size() > 3) {
+ /* XXX: this will silently drop MIDI messages longer than 3 bytes, so
+ they won't be passed to VST plugins or VSTis
+ */
+ return;
+ }
+ int const n = _events->numEvents;
+ assert (n < (int) _capacity);
+
+ _events->events[n] = reinterpret_cast<VstEvent*> (_midi_events + n);
+ VstMidiEvent* v = reinterpret_cast<VstMidiEvent*> (_events->events[n]);
+
+ v->type = kVstMidiType;
+ v->byteSize = sizeof (VstMidiEvent);
+ v->deltaFrames = ev.time ();
+
+ v->flags = 0;
+ v->detune = 0;
+ v->noteLength = 0;
+ v->noteOffset = 0;
+ v->reserved1 = 0;
+ v->reserved2 = 0;
+ v->noteOffVelocity = 0;
+ memcpy (v->midiData, ev.buffer(), ev.size());
+ v->midiData[3] = 0;
+
+ _events->numEvents++;
+}
+
+#endif /* VST_SUPPORT */