Final

posted Aug 26, 2010, 8:59 PM by Unknown user   [ updated Aug 30, 2010, 7:11 PM ]
So I've written the codes in Arduino and Processing for my drum glove to work. I made the glove out of 1/2 inch pipe insulator foam with a push button inserted into each of the 4 chunks of foam, one for each of the 4 fingers on one hand. I decided against making one for the thumb because it was too awkward to play it at the angle I needed to mount the push button at. I know using push buttons isn't the greatest way of building the glove, but it works the same as if they were pressure sensors. I haven't taught myself a song with it yet, but with enough time playing with it and it shouldn't be too long. Here are the codes:
 
Arduino:
 
int pushPin1 = 2;      // denote which push pins are connected to which pins on the Arduino board
int pushPin2 = 3;
int pushPin3 = 4;
int pushPin4 = 5;
int val;                // set up the variables
int val2;
int val3;
int val4;
void setup() {
  Serial.begin(9600);          // begin serial communication at 9600 bps
  pinMode(pushPin1, INPUT);    // set the pins on the Arduino board to input
  pinMode(pushPin2, INPUT);
  pinMode(pushPin3, INPUT);
  pinMode(pushPin4, INPUT);
}
void loop() {
  val = digitalRead(pushPin1);        // read the value, store it in the variable
  val2 = digitalRead(pushPin2);
  val3 = digitalRead(pushPin3);
  val4 = digitalRead(pushPin4);
  if(val == HIGH) {                    // if the value is high,
    Serial.print(val, DEC);            // print the value to the serial port as a decimal (will be a 1 for high)
    Serial.print("\t");                // and separate this value from the next with a tab
  }
  if(val == LOW) {                     // if the value is low,
    Serial.print(val, DEC);            // print the value to the serial port as a decimal (will be a 0 for low);
    Serial.print("\t");                // and separate this value from the next with a tab
  }
  if(val2 == HIGH) {
    Serial.print(val2, DEC);
    Serial.print("\t");
  }
  if(val2 == LOW) {
    Serial.print(val2, DEC);
    Serial.print("\t");
  }
  if(val3 == HIGH) {
    Serial.print(val3, DEC);
    Serial.print("\t");
  }
  if(val3 == LOW) {
    Serial.print(val3, DEC);
    Serial.print("\t");
  }
  if(val4 == HIGH) {
    Serial.println(val4, DEC);
  }
  if(val4 == LOW) {
    Serial.println(val4, DEC);
  }
  delay(100);                            // delay 100 milliseconds before reading the values again
}
 
 
Processing:
 
import processing.serial.*;      // import serial library
import ddf.minim.*;              // import minim sound library
Serial myPort;                   // this next block of code just sets up the variables
AudioSample bass;
AudioSample snare;
AudioSample hiHat;
AudioSample cowbell;
Minim minim;
int fillBass;
int fillSnare;
int fillCymbalR;
int fillCymbalG;
int fillCowbellR;
int fillCowbellG;
void setup() {
  size(400, 400);                      // sets the screen size
  myPort = new Serial(this, Serial.list()[0], 9600);      // tells the program to start paying attention to the serial port
  myPort.bufferUntil('\n');                               // store the data from the serial port until the value is reached
  minim = new Minim(this);                                // begins the minim sound library
  bass = minim.loadSample("Bass2.wav", 2048);             // loads the audio samples
  snare = minim.loadSample("Snare.wav", 2048);
  hiHat = minim.loadSample("Hi_Hat.wav", 2048);
  cowbell = minim.loadSample("Cowbell.wav", 2048);
  background(0);                                          // sets the background color
  fillBass = 255;                                         // these are used later to help distinguish when an element of the drum set is being played
  fillSnare = 255;
  fillCymbalR = 230;
  fillCymbalG = 161;
  fillCowbellR = 153;
  fillCowbellG = 77;
}
void draw() {
  stroke(0);                                            // set the stroke color
  fill(fillBass);                                       // set the fill color. I used a variable so the color could change when a button is pressed
  ellipse(width/2, 3*height/4, 150, 150);               // draw the bass drum
  fill(255);
  rect(163, 3*height/8, 75, 30);                       
  fill(fillSnare);
  ellipse(width/2, 3*height/8, 75, 50);                 // draw the snare drum
  fill(fillCymbalR, fillCymbalG, 0);
  ellipse(width/4, height/4, 75, 25);                   // draw the cymbal
  fill(fillCowbellR, fillCowbellG, 0);
  stroke(fillCowbellR+10, fillCowbellG+10, 0);          // I made the cowbell look 3-D just for kicks and giggles
  rect(3*width/4, height/4, 30, 20);                    // draw the cowbell
  quad(3*width/4, height/4, 320, 75, 340, 75, 330, 100);
  quad(330, 100, 340, 75, 340, 85, 330, 120);
  fill(0);
  rect(305, 104, 20, 12);
}
void serialEvent(Serial myPort) {                            // when data is being received from the serial port, proceed with this function
  String myString = myPort.readStringUntil('\n');            // read the data from the serial port until the value is reached
  print (myString);                                          // print the data being received
  if (myString != null) {                                    // if there is data
    String myString1 = trim(myString);                       // cut out any whitespace
    println(myString1);                                      // print the data again to ensure it hasn't changed
    int buttons[] = int(split(myString1, '\t'));             // split the string of numbers at the tabs so they can be distinguished from each other
    for (int buttonNum = 0; buttonNum < 4; buttonNum++) {    // create 4 new variables (buttons[0-3]
      println("Button " + buttonNum + ": " + buttons[buttonNum]); // print the new variables and their values
    }
    println();                                                // add a line after to separate old data from new incoming data. It just makes it easier on the eyes
    if(buttons[0] == 0) {                                    // if this button is pressed,
        bass = minim.loadSample("Bass2.wav", 2048);          // load this audio sample
        bass.trigger();                                      // and play it
        fillBass = 150;                                      // change the fill color of the element of the drum set
        delay(100);                                          // delay so the color change is noticeable and the sound doesn't repeat too rapidly
        fillBass = 255;                                      // reset the fill color
    }
    if(buttons[1] == 0) {
      snare = minim.loadSample("Snare.wav", 2048);
      snare.trigger();
      fillSnare = 150;
      delay(100);
      fillSnare = 255;
    }
    if(buttons[2] == 0) {
      hiHat = minim.loadSample("Hi_Hat.wav", 2048);
      hiHat.trigger();
      fillCymbalR = 255;                                       // I used 2 different variables here to denote the element's red and green fill amounts
      fillCymbalG = 179;
      delay(100);
      fillCymbalR = 230;
      fillCymbalG = 161;
    }
    if(buttons[3] == 0) {
      cowbell = minim.loadSample("Cowbell.wav", 2048);
      cowbell.trigger();
      fillCowbellR = 179;
      fillCowbellG = 89;
      delay(100);
      fillCowbellR = 153;
      fillCowbellG = 77;
    }
  }
}
void stop() {                // when the window is closed,
  bass.close();              // close the audio samples
  snare.close();
  hiHat.close();
  cowbell.close();
  minim.stop();              // and stop minim
  super.stop();
}
 
 
Here are some pics of the glove setup and a short video of the program working is attached.
 
 
So I realize this isn't exactly the same as the Megatap 3000, but it works in the same fashion. If I had time to order the force sensitive resistors online I would have, but these push buttons were the best alternative I could find.
ċ
Unknown user,
Aug 30, 2010, 6:56 PM
Comments