Incom ist die Kommunikations-Plattform der Fachhochschule Potsdam

In seiner Funktionalität auf die Lehre in gestalterischen Studiengängen zugeschnitten... Schnittstelle für die moderne Lehre

Incom ist die Kommunikations-Plattform der Fachhochschule Potsdam mehr erfahren

skwt - schwarzer Kasten, weiße Tasten

Ein Musik-Interface auf Basis des Teensy-Microcontrollers zum Steuern eines MIDI-fähigen Musikprogramms.

Le Idee

Wichtig war es für mich ein Interface zu entwerfen, dass dem Nutzer volle Kontrolle über seine Eingaben ermöglicht. Zufall und Willkür sollten am Ende nicht die beherschenden Elemente bei der Melodieerzeugung sein. Da allerdings so gut wie jedes klassische Instrument diesem Ansatz folgt, war es recht schwierig hier auf etwas neues zu kommen. Nach einigen Irrwegen, wie zum Beispiel die Idee eine MIDI-Geige zu bauen, kam ich letzten Endes darauf ein Keytar ähnliches Gerät zu entwickeln, dass durch Auflösen der gewohnten Bedienstruktur, sowie ergänzender Funktionen, genug Eigenes hatte, um umgesetzt zu werden.

Le Konzept

SKWT_Erklaer.jpgSKWT_Erklaer.jpg

Von der Idee der MIDI-Geige blieben die vier über die Drucktasten anspielbaren Grundtöne E, A, D, G, sowie die Möglichkeit diese über ein Griffbrett zu modulieren. Ein Abweichen von den klassischen Konzepten ensteht bei der Bestimmung des Anschlags(Velocity). Auslösen des Tons und Bestimmen seiner Stärke werden voneinander entkoppelt, indem beim Drücken eines Knopfes mit einem der vier Finger, zeitgleich der Daumen auf einem Folienpotentiometer aufliegt, welcher abhängig von der berührten Stelle einen Wert für den Anschlag an das Musikprogramm sendet. Als weiteres Eingabeelement hat der Benutzer jederzeit die Möglichkeit zwischen drei Instrumenten zu wechseln, indem er den Hals des „skwt“ nach oben biegt.

Le Umsetzung

SKWT_bau.jpgSKWT_bau.jpg

Um für den Körper und das Griffbrett möglichst passgenaue Einzelteile zu bekommen, entschied ich mich dazu alle Elemente per Lasercutter ausschneiden zu lassen. Als Material kam Pappelsperrholz in 4mm Stärke zum Einsatz. Die Teile habe ich dann verleimt und mit einer Sprühdose eingefärbt. Der Hals besteht aus einem 12cm langen Kabelkanal in dessen Innerem sich ein Biegesensor (Flexsensor) sowie die Kabel für den langen SoftPot (Folienpotentiometer) befinden.

Le Fritzing

FritzingSketch.jpgFritzingSketch.jpg

Le Code

      int swipePot = A7;
      int NotePot = A6;
      int FlexPot = A5;

      int buttonPinE = 13;
      int buttonPinA = 12;
      int buttonPinD = 9;
      int buttonPinG = 10;

      int LED01 = 1;
      int LED02 = 3;
      int LED03 = 2;
      int LED04 = 4;
      int LED05 = 5;
      int LED06 = 6;

      int swipe;
      int flex;
      int channel;
      int hit = 90;


      int x1 = 0;
      int x2 = 0;
      int x3 = 0;
      int x4 = 0;

      void setup(){

       Serial.begin(9600);
        pinMode(buttonPinA,INPUT_PULLUP);
        pinMode(buttonPinE,INPUT_PULLUP);
        pinMode(buttonPinD,INPUT_PULLUP);
        pinMode(buttonPinG,INPUT_PULLUP);

        pinMode(LED01, OUTPUT); 
        pinMode(LED02, OUTPUT); 
        pinMode(LED03, OUTPUT); 
        pinMode(LED04, OUTPUT); 
        pinMode(LED05, OUTPUT); 
        pinMode(LED06, OUTPUT); 

      }

      void loop(){

        int buttonStateE = digitalRead(buttonPinE);
        int buttonStateA = digitalRead(buttonPinA);
        int buttonStateD = digitalRead(buttonPinD);
        int buttonStateG = digitalRead(buttonPinG);  

       //POTS/////////////////////////////////////////////

       int hit = analogRead(swipePot);
           hit = map(hit,0,1023,0,260);
           Serial.println(hit);

       int Note = analogRead(NotePot);
           Note = map(Note,0,1023,0,27);
           Serial.println(Note);

       int flex = analogRead(FlexPot);
           flex = map(flex,502,604,0,50);
           Serial.println(flex);

      //FLEX-Abfrage/////////////////////////////////////    

           if((flex >= 0)&&(flex <= 5)){
             channel = 1;
           }
           if((flex >=6)&&(flex <=15)){
              channel = 2;
           }
           if((flex >=16)&&(flex <=50)){
              channel = 3;
           }

      //LED-Abfrage////////////////////////////////////
      if(hit == 0){
            digitalWrite(LED01, LOW);
            digitalWrite(LED02, LOW);
            digitalWrite(LED03, LOW);
            digitalWrite(LED04, LOW);
            digitalWrite(LED05, LOW);
            digitalWrite(LED06, LOW);
      }
      if((hit >= 15)&&(hit <= 30)){
            digitalWrite(LED01, HIGH);
            digitalWrite(LED02, LOW);
            digitalWrite(LED03, LOW);
            digitalWrite(LED04, LOW);
            digitalWrite(LED05, LOW);
            digitalWrite(LED06, LOW);
      }      
      if((hit >= 45)&&(hit <= 60)){
            digitalWrite(LED01, HIGH);
            digitalWrite(LED02, HIGH);
            digitalWrite(LED03, LOW);
            digitalWrite(LED04, LOW);
            digitalWrite(LED05, LOW);
            digitalWrite(LED06, LOW);
      }      
      if((hit >= 61)&&(hit <= 79)){
            digitalWrite(LED01, HIGH);
            digitalWrite(LED02, HIGH);
            digitalWrite(LED03, HIGH);
            digitalWrite(LED04, LOW);
            digitalWrite(LED05, LOW);
            digitalWrite(LED06, LOW);
      }      
      if((hit >= 80)&&(hit <= 95)){
            digitalWrite(LED01, HIGH);
            digitalWrite(LED02, HIGH);
            digitalWrite(LED03, HIGH);
            digitalWrite(LED04, HIGH);
            digitalWrite(LED05, LOW);
            digitalWrite(LED06, LOW);
      }      
      if((hit >= 96)&&(hit <= 110)){
            digitalWrite(LED01, HIGH);
            digitalWrite(LED02, HIGH);
            digitalWrite(LED03, HIGH);
            digitalWrite(LED04, HIGH);
            digitalWrite(LED05, HIGH);
            digitalWrite(LED06, LOW);
      }      
      if(hit >= 111){
            digitalWrite(LED01, HIGH);
            digitalWrite(LED02, HIGH);
            digitalWrite(LED03, HIGH);
            digitalWrite(LED04, HIGH);
            digitalWrite(LED05, HIGH);
            digitalWrite(LED06, HIGH);
      }

      //BUTTONS//////////////////////////////////////

        if(buttonStateE == LOW){
          if(x1 == 0){
            usbMIDI.sendNoteOn((88+Note),hit,channel);
            x1 = 1;
            }
          }
          if(buttonStateE == HIGH){
            if(x1 == 1){
            usbMIDI.sendNoteOff((88+Note),0,channel);
            x1 = 0;
            }
          }
        if(buttonStateA == LOW){
          if(x2 == 0){
            usbMIDI.sendNoteOn((81+Note),hit,channel);
            x2 = 1;
            }
          }
          if(buttonStateA == HIGH){
            if(x2 == 1){
            usbMIDI.sendNoteOff((81+Note),0,channel);
            x2 = 0;
            }
          }
        if(buttonStateD == LOW){
          if(x3 == 0){
            usbMIDI.sendNoteOn((74+Note),hit,channel);
            x3 = 1;
            }
          }
          if(buttonStateD == HIGH){
            if(x3 == 1){
            usbMIDI.sendNoteOff((74+Note),0,channel);
            x3 = 0;
            }
          }
        if(buttonStateG == LOW){
          if(x4 == 0){
            usbMIDI.sendNoteOn((67+Note),hit,channel);
            x4 = 1;
            }
          }
          if(buttonStateG==HIGH){
            if(x4 == 1){
            usbMIDI.sendNoteOff((67+Note),0,channel);
            x4 = 0;
            }
          }
        }

Le Ausblick

Auch wenn ich mit dem Funktionsumfang des „skwt“ so weit sehr zufrieden bin, möchte ich über kurz oder lang noch einige technische Kinderkrankheiten ausbessern, sowie einen Modus anfügen, der es dem Benutzer ermöglicht nach dem Einspielen einer Spur in einen weiteren Modus umzuschalten, in dem die Potentiometer wirklich als Regler benutzt werden können.

Ein Projekt von

Fachgruppe

Interfacedesign

Art des Projekts

Studienarbeit im ersten Studienabschnitt

Betreuung

foto: Stefan Hermann

Entstehungszeitraum

WiSe 12 / 13 – SoSe 13