Saturday, October 06, 2012

Digitising the Vernus V110 Pressure-sensitive Floor

The Vernus V110 pressure-sensitive floor is a historical controller unit from the era of analog synthesis. The unit itself is a large wooden triangle structure, with a sturdy frame and a single pressure sensor in the centre of the platform. Four such triangles can be pushed together in various configurations to form different shapes for a performance context.

The aim of this blog post is demonstrate a simple, efficient, cost-effective method of using these floor sensors with modern studio equipment. This is achieved by digitising the control signals,  thereby affording the ability to map the state of the floor sensors to a wide range of parameters - and encouraging their use in the modern age of computer and laptop music. This is done via a hardware layer, a firmware layer and a software layer. 

Pressure Sensor
The pressure sensor itself is very simple in design, consisting of what appears to be two conductive plates- perhaps separated by a non-conductive material such as foam - combined with a passive resistor to form a voltage divider. In practice, the sensor is actually very sensitive, and is suited to the task perfectly. 

Control Voltage Conditioning
Each unit features a single cable, which carries the output of the sensor back to a control voltage box that conditions the control signal.

The role of the control voltage box is two fold:
• To provide a voltage to drive the pressure sensor;
• And to scale and offset the output signal control voltage so that it is suitable for analog synthesiser use

The box includes four inputs (one for each of the V110 units), four outputs (representing the control voltage outputs) and two sets of four knobs (controlling the voltage offset and voltage output scaling).

The signal measured from the control voltage  output lines measure from -6.8V to +6.8V, depending on the offset and output scaling controls and the particular floor unit that is measured.

Cable Connection Pin Designations
The connection that carries the signal from each floor sensor to the control voltage unit is a five pin-DIN cable. The positioning of the pins is not identical to a standard MIDI cable. Only the outer two and middle pins are used. The middle pin is the signal pin, while the outer two pins carry the positive and negative voltage supply. The control voltage box unit supplies -7.5V and +7.5V.

Of course, the aim of this post is to basically bypass the control voltage box and to be able to read the pressure sensors directly into the digital realm. The male pins of the cable connector can be easily accessed via a set of three alligator clips for breadboarding and prototyping purposes. However, for a more permanent solution, a DIN female connector is required.

Hardware Layer
An Arduino Uno was used to measure and convert the control signals from the four floor pressure units for use in the digital realm. The positive pin from each floor unit cable was connected to 5V on the Arduino board. The negative pin from each floor unit cable was connected to ground on the Arduino board. The signal pin from each of the floor units was connected to analog inputs 0, 1, 2 and 3 respectively.

Thus, the 5V supply voltage from the Arduino board is divided by the pressure sensor circuit, the output of which is connected to the analog to digital converters for digitisation.

The onboard analog to digital converters of the Arduino board (accessed via the analog inputs as described above) have a resolution of 10 bits. Data is then sent via a USB cable to a host computer for sonic mapping. A software layer was used in this instance to visually represent the incoming data as well as allow for the muting and unmuting of each floor sensor individually.

Firmware Layer
The Arduino code was written in the Arduino 1.0 IDE for the Uno board. The program is straight forward and every line is commented.

The data is formatted as MIDI data but is sent via a serial connection. A Max patch or similar is required to convert the data from serial / com port to an actual MIDI-useable stream.

The code sends each of the floor sensors as a high resolution value and a low resolution value:
• High-resolution (14-bit) pitch bend data on MIDI channels 1-4
• Low-resolution (7-bit) MIDI continuous control (CC) data on MIDI channel 1 via MIDI CC #0 - MIDI CC #3.

for Arduino Uno board | Arduino 1.0 IDE
by Sebastian Tomczak, October 2012


int data;       // storing the analog to digital conversion from presure sensitive floor unit
int dataRes;    // storing the low resolution value
int dataLow;    // storing the least significant byte value
int dataHigh;   // storing the most significant byte value

void setup() {  // start setup
  Serial.begin(57600); // open serial port
}  // end setup

void loop() {  // start main loop
  for(int i = 0; i < 4; i ++) {  // the loop is four iterations long
    data = analogRead(i); // read the value of a floor unit
    dataRes = data / 8; // store a low resolution version of the value for MIDI CC data
    dataLow = data % 128;  // store the low byte for MIDI pitch bend data
    dataHigh = data / 128;  // store the high byte for MIDI pitch bend
    // let's format a MIDI mesage for sending MIDI CC data on channel 1... (7-bit value with sensor reading from 0 - 127)
    Serial.write(0xB0); // status byte with MIDI CC | channel 1
    Serial.write(i); // data byte with controller number - this is dependent on the loop iteration
    Serial.write(dataRes); //data byte with controller value - this is dependent on the data that is stored 
    // let's format a MIDI mesage for sending MIDI pitch bend data on channel's 1 - 4 (14-bit value with sensor reading from 0 - 1023)
    Serial.write(0xE0 + i); // status byte with MIDI pitch bend | the channel number is dependent on the loop iterations
    Serial.write(dataLow); // low byte for MIDI pitch bend - this is dependent on the data that is stored 
    Serial.write(dataHigh); // high byte for MIDI pitch bend - this is dependent on the data that is stored 

    delay(10); // short delay
  } // end loop// end main loop 

Download the Arduino .ino file here.

Software Layer
A Max patch was used read a serial stream of values from the Arduino Uno board, and route them to a virtual MIDI device. This patch includes a visual representation of the data via two sets of multislider objects. The data from each sensor can be muted, as this may make mapping easier (depending on the DAW or software used for sound generation).

Download the Max patch here.

Demonstration Video
Here is a (very brief) "proof of concept" video. This is an example of controlling sound from the pressure sensitivity of two of the sensors via Ableton Live.