In seiner Funktionalität auf die Lehre in gestalterischen Studiengängen zugeschnitten... Schnittstelle für die moderne Lehre
In seiner Funktionalität auf die Lehre in gestalterischen Studiengängen zugeschnitten... Schnittstelle für die moderne Lehre
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.
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.
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.
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.
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.
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.
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);
}