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

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

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 Video

Le Fritzing

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

Art des Projekts

Studienarbeit im Grundstudium

Betreuung

Stefan Hermann

Zugehöriger Workspace

Musical Interfaces 2012

Entstehungszeitraum

WS 12 / 13 – SS 13