Incom ist die Kommunikations-Plattform der Fachhochschule Potsdam mehr erfahren

SIT DOWN

DIE BANALE TÄTIGKEIT DES SITZENS, WIRD ZUR SPANNENDEN INTERAKTION MIT MUSIK

SIEBEN SITZMÖGLICHKEITEN WURDEN MIT INSGESAMT FÜNFZEHN SENSOREN
AUSGESTATTET UND ERMÖGLICHEN DIE STEUERUNG VON ABLETON LIVE DURCH
SIMPLES HINSETZEN UND ANLEHNEN.

Die Idee

Wie waren uns von Anfang an einig, dass wir keinen herkömmlichen Controller mit Drehreglern und Knöpfen entwickeln, sondern eher etwas experimenteller an das Thema Musical Interfaces herangehen wollen. Unsere erste Idee war eine Murmelbahn die als eine Art Step-Sequencer funktioniert. Gleichzeitig interessierte uns aber auch die Frage, wie man den ganzen menschlichen Körper einsetzen könnte um ein Interface zu bedienen.
Bei unseren Überlegungen beschränkten wir uns auf Bewegungen und Abläufe die der Mensch kennt und gewohnt ist, damit für die Bedienung keine neuen Bewegungsabläufe erlernt werden müssen. Die vielfältigen Funktionen eines Bürostuhls brachten uns auf die Idee uns dem Thema Sitzen zu widmen.


Das Konzept

Ein gewöhnlicher Bürostuhl wird zum Instrument, bzw. zu einem Steuerelement zum erzeugen und verändern von Tönen. Ausgestattet mit verschiedenen Sensoren erkennt der Stuhl, dass man auf ihm sitzt, ob man sich anlehnt, sich dreht oder ob man die Armlehnen berührt. Es entstand ein erster Video-Prototyp um unsere Vorstellung zu verdeutlichen.


Videoprototyp


Prototyp

Nach dem Videoprototyp experimentierten wir viel mit dem Teensy Board und verschiedenen Sensoren die für uns interessant schienen. Unser erstes kleines Zwischenprojekt war das Piezo-Piano (siehe Video). Ziel dieses Projektes war es mit möglichst wenig Sensoren viele Töne zu erzeugen, damit man nicht für jeden Ton ein Sensor benötigt.
Durch das Klopfen auf eine Platte, setzten wir die Platte in Schwingung. Diese Schwingungen konnten wir durch die Piezos in elektische Signale umwandeln und an das Arduino senden.
Je nachdem wie stark die Schwingung war und an welchem Piezo die Schwingung zuerst angekommen ist, konnten wir eine Note und die dazugehörige Lautstärke berechnen.

Nachdem wir alle Sensoren ausprobiert hatten, versuchten wir alle Sensoren zusammen zu bringen um ein Musikstück in Ableton zu komponieren. Zu Beginn lagen alle Sensoren noch auf dem Schreibtisch um das Testen zu erleichtern.


Aufbau im Casino

Erst kurz vor der Präsentation konnten wir unser gesamtes Interface im Casino aufbauen und auch zum ersten mal richtig Testen.
Zuhause fehlte uns immer der Platz um alle Stühle gleichzeitig testen zu können.


Finales Video


Fazit

Nach der eigentlichen Präsentation wollten wir mit ein paar Kommilitonen noch ein Video für die Dokumentation drehen. Erst da merkten wir das unsere Konzept wirklich funktionierte, da unsere Kommilitonen nach und nach anfingen untereinander zu kommunizieren um das Musikstück zu planen. Wir wollten ein Interface entwickeln, dass nur mit mehreren Personen zusammen bedient werden kann und auch erst interessant klingt wenn man kommuniziert und ein Stück „komponiert“.

Eigentlich würden wir unsere Interface gerne erweitern und mehr in den öffentlichen Raum bringen um die Reaktion der Besucher zu beobachten.

Eine erste Idee war es einen Hörsaal mit Sensoren auszustatten um möglichst viele Menschen zu involvieren um zu schauen ob die Kommunikation auch mit mehr als 7 Personen funktioniert.


Fritzing


Arduino Quelltext

Quelltext der Piezos:

int laut, note;
int numPiezos = 4;
int sensor[4];
int sensorSettings[4][2];
int level[2];
String piezoPos;


void setup() {
  Serial.begin(38400);
}

void loop() {
  //alle Werte der Sensoren auslesen
  readSensor();
  if(sensor[0] > 10 || sensor[1] > 10 || sensor[2] > 10 || sensor[3] > 10) {
    level[0] = 1;
  }

  while(level[0] == 1) {
    //alle Werte der Sensoren auslesen
    readSensor();
    //max Werte der Sensoren berechnen
    setSensor();
    if(sensor[0] == 0 && sensor[1] == 0 && sensor[2] == 0 && sensor[3] == 0) {
      if (level[0] == 1) { 


        //max Lautstärke von allen Piezos herausfinden
        for (int i = 0; i < numPiezos; i++) {
          laut = max(laut, sensorSettings[i][0]);
        }


    //bei welchem Piezo ist das höchste Signal
    if(laut == sensorSettings[0][0]) {
      note = 60;
      piezoPos = „EINS“;
    }
    if(laut == sensorSettings[1][0]) {
      note = 62;
      piezoPos = „ZWEI“;
    }
    if(laut == sensorSettings[2][0]) {
      note = 63;
      piezoPos = „DREI“;
    }
    if(laut == sensorSettings[3][0]) {
      note = 67;
      piezoPos = „VIER“;
    }

    laut = map(laut, 0, 600, 0, 127);
    console(note, laut, 0, 0, piezoPos);
    playMidi(note, laut, 2, 100);   
    setAllToNull();

    break;
  } else {

    level[1] = 1;
  }
}
  }
}




void playMidi(int note, int laut, int channel, int pause) {
  usbMIDI.sendNoteOn(note,laut,channel);
  delay(pause);
  usbMIDI.sendNoteOff(note,laut,channel);
}




void setAllToNull() {
  for(int i = 0; i < numPiezos; i++) {
    for(int j = 0; j < numPiezos; j++) {
      level[i] = 0;
      sensorSettings[i][j] = 0;
    }
  }
}



void readSensor() {
  for (int i = 0; i < numPiezos; i++) {
      sensor[i] = analogRead(21-i);
  }

}




void setSensor() {
  for (int i = 0; i < numPiezos; i++) {
    if (sensor[i] >= sensorSettings[i][0]) {
      sensorSettings[i][0] = sensor[i]; //max
      sensorSettings[i][1]++; //dist
    }
  } 
}
void console(int var1, int var2, int var3, int var4, String var5) {
  Serial.print(„Var1: “);
  Serial.print(var1);
  Serial.print(„      Var2: “);
  Serial.print(var2);
  Serial.print(„      Var3: “);
  Serial.print(var3);
  Serial.print(„      Var4: “);
  Serial.print(var4);
  Serial.print(„      Var5: “);
  Serial.println(var5);
  Serial.println(„=======“);
}

Quelltext der restlichen Sensoren:

int triggerButton[7][3] = {{4,0,0},
                          {5,0,0},
                          {6,0,0},
                          {7,0,0},
                          {8,0,0},
                          {9,0,0},
                          {10,0,0}};
int controlButton[1][3] = {{3,0,0}};

int led = 0;
int mode;
int num = -1;
int numSensors = 6;
int numButton = 7;
int sensor[7];
int count2 = 0;
int trigger = 0;
int settings[7][5] =  {{55,400,0,127,0},  //min Input //max Input //min Output //max Output
                      {55,400,0,127,0},
                      {55,400,0,127,0},
                      {55,400,0,127,0},
                      {180,350,0,127,0},
                      {180,350,0,127,0},
                      {120,1023,0,127,0}};

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < 7; i++) {
    pinMode(triggerButton[i][0], INPUT); //next Sensor button
  }
  pinMode(controlButton[0][0], INPUT);
  pinMode(led, OUTPUT);
}



void loop() {
  for (int i = 0; i < numButton; i++) {
    //read all Buttons
    triggerButton[i][1] = digitalRead(triggerButton[i][0]);
    controlButton[0][1] = digitalRead(controlButton[0][0]);
    //wenn der button i zum ersten mal ein signal bekommt
    if(triggerButton[i][1] == 1 && triggerButton[i][2] == 0) {
      triggerButton[i][2] = 1;

      //wenn der control Button zum zweiten mal gedrückt wurde
      if(controlButton[0][2] > 2) {

        //langsam ein signal schicken
        for(int j = 0; j < 128; j++) {
          usbMIDI.sendControlChange(i,j, 3);

          delay(5);

          //signal auf 127 halten bis der button nicht mehr gedrückt wird
          if(j == 127) {
            usbMIDI.sendControlChange(i,127, 3);
          }
        }

      //wenn der cont knopf noch nie gedrückt wurde
      } else if (controlButton[0][2] == 0){
        usbMIDI.sendControlChange(i,127, 3);
        Serial.print(„Button: “);
        Serial.print(i);
        Serial.println(„ wird eingerichtet“);
      }
    }

    // wenn der button i kein signal mehr bekommt
    if(triggerButton[i][1] == 0 && triggerButton[i][2] == 1) {
     triggerButton[i][2] = 0;

     //wenn der control Button zum zweiten mal gedrückt wurde
     if(controlButton[0][2] > 2) {

       //langsam kein signal mehr schicken
       for(int j = 128; j > 0; j--) {
         usbMIDI.sendControlChange(i,j, 3); 
         delay(5);
           //signal auf 0 halten bis der button nicht mehr gedrückt wird
           if(j == 127) {
             usbMIDI.sendControlChange(i,127, 3);
           }
        }
      }
    }
  }



  //wenn der cont Button 
  if(controlButton[0][1] == 1 && controlButton[0][2] == 0) {
    digitalWrite(led, HIGH);
    controlButton[0][2]++;
  }
  if(controlButton[0][1] == 0 && controlButton[0][2] == 1) {
    digitalWrite(led, LOW);
    controlButton[0][2]++;
  }
  if(controlButton[0][1] == 1 && controlButton[0][2] == 2) {
    digitalWrite(led, HIGH);
    controlButton[0][2]++;
  }



  //alle Sensoren einlesen
  for (int i = 0; i < numSensors; i++) {
      sensor[i] = analogRead(21-i);
      /*if(i==5 && sensor[i] > 100) {
        Serial.println(sensor[i]);
      }*/
  }
  //Serial.println(sensor[4]);


  for(int i = 0; i < numSensors; i++) {

    //wenn der control button zum ersten mal gedrückt wurde und der button i auch gedrückt ist
    if(controlButton[0][2] == 2 && triggerButton[i][2] == 1) {
      //Serial.print(„Sensor: “);
      //Serial.print(i);
      //Serial.println(„ wird eingerichtet“);
      if(sensor[i] > settings[i][0]) {
        sensor[i] = map(sensor[i], settings[i][0], settings[i][1], settings[i][2], settings[i][3]);
        usbMIDI.sendControlChange(i,sensor[i], 1); 
        Serial.print(„sensor: “);
        Serial.print(i);
        Serial.println(„ wird eingerichtet“);
      }

    //wenn der control button zum zweiten mal gedrückt wurde
    } else if(controlButton[0][2] > 2) {
      if(sensor[i] > settings[i][0] && sensor[i] < settings[i][1]) {
        settings[i][4] = sensor[i];
        sensor[i] = map(sensor[i], settings[i][0], settings[i][1], settings[i][2], settings[i][3]);
        Serial.println(sensor[i]);
        usbMIDI.sendControlChange(i,sensor[i], 1); 
      }
    }
  }
  delay(10);
}

Art des Projekts

Studienarbeit im Grundstudium

Betreuung

Stefan Hermann

Zugehöriger Workspace

Musical Interfaces 2012

Entstehungszeitraum

Wintersemester 2012 / 2013

zusätzliches Material