Interfaces 3 – Audiovisual Lutherie

Digital lutherie is the art of designing and building electronic musical instruments and sound-generating tools using digital technology. Like traditional luthiers craft physical instruments, digital lutherie creates musical instruments through software, hardware interfaces, and digital signal processing. It combines programming, sound design, and interface design.

Examples:

  • Creating software instruments (virtual synthesizers, samplers)

  • Designing hardware controllers and interfaces

  • Developing new ways to interact with sound through technology

  • Building custom instruments using platforms (Pure Data, Max/MSP, SuperCollider)

  • Exploring novel approaches to sound generation and manipulation

Augmented by sensors: orientation sensors / accelerometer: example Terrain Study (see below)

"Smart" Instruments:

Integrated – wearables as interfaces:

Augmented sound: Microphone with ML-Software that interprets phrases, pitches etc to produce/add sound. Similar approaches can be used for audiovisual instruments.

1 Hand Tracking – Leap Motion

The Ultraleap sensor (former Leap Motion Sensor) is a hardware device designed for hand tracking and motion control. It uses infrared cameras and LEDs to detect and track hand movements and gestures in 3D space. The sensor creates a hemispherical interaction area above the device. It allows to control systems using hand movements without touching any physical controls. Initially targeted at desktop computer control, it was used in virtual reality, augmented reality, robotics, and can of course also be used to design audiovisual instruments.

Applications

Mimu Glover (commercial)

Geco Multi-dimensional MIDI expression through hand gestures

https://www.youtube.com/watch?v=fwn7_Czh5Y0&t=1s

2 Body Tracking, Environment – Kinect and others

3 DIY with sensors: from Augmented Musical Instruments to Audiovisual Instruments

Sensor-enhanced musical instruments utilize sensors to transform player interaction and musical output in innovative ways.

Hardware

  • Controller: ESP32 Wemos Lolin32

  • Sensor: Bosch BNO055 / Adafruit Breakout

  • Battery: LiPo / Li-ion 3.7V

Controller

The ESP32 is a low-cost microcontroller system-on-chip with wireless connectivity options. It has integrated Wi-Fi and Bluetooth, allowing for wireless communication in IoT and embedded applications. The ESP32 can be powered by a battery, including deep sleep which draws only microamps of current, making it suitable for portable and battery-operated devices. Its has also been used widely in arts.

Sensor

BNO055 chip by Bosch.

Board by Adafruit.

Software

Arduino/ESP32 Library by Adafruit:

WIFI messages can be broadcasted by using the UDP protocol.

  • UDP is a connectionless protocol, meaning that messages are sent without negotiating a connection and that UDP does not keep track of what it has sent.

  • It has no handshaking dialogues and thus exposes the user's program to any unreliability of the underlying network.

  • there is no guarantee of delivery, ordering, or duplicate protection.

// -------------------------------------------
// Esp32 Code to send orientation data
// of the BNO055 sensor via UDP.
// -------------------------------------------

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>

#include <WiFi.h>
#include <WiFiUdp.h>

// I2C Clock Pin: 4
// I2C Data Pin: 0

// WiFi credentials
const char* ssid = "";
const char* password = "";

// UDP settings
const char* udpServerIP = "192.168.0.61";  // Replace with your computer's IP address
const int udpPort = 8888; 
WiFiUDP udp;

unsigned long previousMillis = 0;
const long udpInterval = 5000;   


#define BNO055_SAMPLERATE_DELAY_MS (100) /* Set the delay between fresh samples for the BNO055*/
Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28, &Wire); //(by default address is 0x29 or 0x28)

void setup(void) {
  Serial.begin(115200);
  Wire.begin(0,4);          // Important! Define the I2C Pins manually

  // wait for serial port to open
   while (!Serial)
    delay(10);              

  // Initialise BNO055 Orientation Sensor 
    if(!bno.begin())        
  {
    Serial.print("BNO055 not found.");
    while(1);
  }
  delay(1000);
  bno.setExtCrystalUse(true);

  // Establish WIFI Connection
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected, IP address: ");
  Serial.println(WiFi.localIP());

  // Establish UDP
  udp.begin(udpPort);
  Serial.print("UDP started on port ");
  Serial.println(udpPort);
}

void loop() {

  /* Get a new sensor event */
  sensors_event_t event;
  bno.getEvent(&event);

  /* Display the floating point data */
  Serial.print("X: ");
  Serial.print(event.orientation.x, 4);
  Serial.print("\tY: ");
  Serial.print(event.orientation.y, 4);
  Serial.print("\tZ: ");
  Serial.print(event.orientation.z, 4);
  Serial.println("");
  
  sendUDPMessage("RotX:"+String(event.orientation.x)+",RotY:"+String(event.orientation.y)+",RotZ:"+String(event.orientation.z));

  unsigned long currentMillis = millis();
  
  // Check WiFi connection
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi disconnected. Reconnecting...");
    WiFi.begin(ssid, password);
    return;
  }
  
  // Send message at an interval (currently deactivated)
  if (currentMillis - previousMillis >= udpInterval) {
    previousMillis = currentMillis;
    sendUDPMessage("RotX:"+String(event.orientation.x)+",RotY:"+String(event.orientation.y)+",RotZ:"+String(event.orientation.z));
  }

  /* Wait the specified delay before looping and requesting next data */
  delay(BNO055_SAMPLERATE_DELAY_MS);
}

void sendUDPMessage(String message) {
  udp.beginPacket(udpServerIP, udpPort);
  udp.print(message);
  bool success = udp.endPacket();
  
  if (success) {
    //Serial.println("UDP message sent: " + message);
  } else {
    Serial.println("Failed to send UDP message");
  }
}

Cheaper but less accurate option is e.g. the MPU-6050, 3-axis gyroscope and acceleroscope. https://www.az-delivery.de/en/products/gy-521-6-achsen-gyroskop-und-beschleunigungssensor

TouchDesigner

The network of operators in TouchDesigner needs to process the following program blocks:

  • Receive the UDP messages from the sensor

  • Process the received data

  • Map the processed data to visual processes

  • Send the data processed or raw via OSC to sound software (e.g SuperCollider)

Last updated