Virtual Controller Based MIDI System

The goal of this project is to be able to control any VST Host software from hardware controllers. There are many VST Hosts, like Cubase, Ableton but all of them are almost impossible to be controlled completely from hardware controllers. Many times you have to click on tiny buttons on the PC screen, and go through menus. VCBMS is trying to accomplish a way of working with no mouse, but real hardware controllers. These controllers can be configured using some simple Excel sheets for the basics, or using code generation to perform complex changes and inversions.

VCBMS can control Cubase, Ableton or its incorporated VST Host. One key feature it uses, is to abstract away all hardware dependencies and VST software dependencies into a Virtual Control Layer. This is somewhat comparable with Macky control or Ableton surfaces but goes much further (almost 128 parameters, based on V/A architectures)


VCBMS acts as a bridge between all these components. Now you can setup various hardware controllers in an abstract way to control a music system. For now, interfaces were created for Behringer BCR2000, Korg Nanokontrol2, Steinberg FD-CMC and also software GUI’s for android, web and Windows Touchscreens.

Touch Interface


In the default settings you have the following features:

  • Controlling of 32 VST Instruments.
  • Controlling of several popular VST Hosts.
  • Saving/Loading all settings of all VSTs.
  • Controller based hiding/showing of VST Plugins in Host
  • Controller changes flow through the full system: Changing a knob somewhere reflects on changes on all controllers.
  • Preset selection, loading/saving bank data.
  • Keyboard remapping, merging, transposing and splitting.
  • Auto transposing of selected VSTs, triggered by keys on the master keyboards.
  • Graphical UI showing most settings. Also quick editing is possible.
  • Effects like multimbral synth, waveplay, simple sequencer, etc.

Update September 2016:

The system is now fully Total Recall: Any change in a controller will be sent to the DAW but also any change in a DAW parameter will be reflected by the hardware: Hardware and software are always in sync. Note that an important prerequisite for this to work is that the DAW supports notification of (parameter of controller) changes. This is the case with Cubase, Ableton, Reaper and my own DAW Host. However, Cubase has only very limited support (no parameter changes), but both Ableton and Reaper have extended programmable support (in respectively python and C++ or EEL) for having so called control surfaces. I've build a proof of concept in Python, but since I am not using Ableton, that's all for that. However, for Reaper I created a full interface as a C++ dll (32bit and 64bit) in order to present a communication interface to my virtual system as a control surface for Reaper. This communication interface supports both  MIDI or UDP as transport/session layer. The application layer used is an inhouse developed protocol, called RMS.

Techniques Used:

  • Written in Object Pascal.
  • buildin VST Host uses this fantastic library: Delphi Asio Vst (Make sure you use version 1.4 or newer)
  • Model View Controller (extensively!)
  • Component Based development
  • Source code generation from definition files
  • Win32 techniques like (asynchronous) eventing, threading, shared memory
  • Behringer BCL control language for realtime updates
  • Web frontends written in Javascript (NodeJS/Express etc.)
  • C++ / Lua / EEL /Python for Control Surfaces

RMS protocol (global version):

There are many MIDI protocols defined upon the original specification. However, they all are pretty specific. Here I propose a simple protocol which extends the original protocol with the following aspects:

  • 128 Midi channels.
  • 128 Status
  • Two 14 bit databytes (data1, data2)
  • Any string value (dataS)

Implementation: Messages are send as SysEx message as follows:

$F0 $25 midichannel, status, data1lo, data2lo, data1hi, data2hi dataS $F7

Trailing zeroes may be omitted. (Sorry for pinching the $25 manufacturer byte: It used to belong to Crumar, than it was unassigned, but nowadays it is assigned to Twister. It's just an example).