Introduction: Studio Drums
Drummers would spend hours and hours practicing ... But not everyone can have a drum at home: space and noise are a big problem!
For this reason, we wanted to create a portable and silence drumkit which you could play at home.
This drumkit is very easy to use, you just have to hit the pads and it will sound like a real drum! It also comes with a display where you can see wich pad are you hitting at. And if you want to use it in a silence mode, just conect your headphones to the laptop!
Step 1: What You'll Need
MATERIAL
- Arduino Uno
- Breadboard
- Some wire
- 5x piezos
- 5x 1M Ohm resistors
- 5 jar lids
- Eva foam
- Foam board
PROGRAMS:
- Arduino IDE
- Processing
*To download the above programs onto your computer, follow the links below:
Step 2: Assemble Circuit
First of all we need to solder to the piezos (GND to the yellow part and the analog pin wire to the white part of the piezo).
We will use a breadboard to connect everything.
Connect the resistor and the wires of the piezo as shown in the diagram above. Then connect the GND wire of breadboard to GND on Arduino. Finally, connect each wire of the piezo to an analog pin on your Arduino as shown below.
Piezos connected to analog pins:
- Caixa = A0;
- Charles = A1;
- Tomtom = A2;
- Crash = A3;
- Bombo = A4;
Step 3: Program It
We decided to create our own display for the drumkit instead of using a preset program. We've used Processing for this.
We have programmed it so that when a piezo is hit, the sound of the corresponding drum will sound. In addition, the corresponding drum pattern will illuminate on the screen.
You'll need to import processing sound, and processing serial libraries.
Don't forget to add the drum sounds to a data folder!
ARDUINO CODE
//PIEZOS ARE CONNECTED TO ANALOG PINS
const int caixa = A0;
const int charles = A1;
const int tomtom = A2;
const int crash = A3;
const int bombo = A4;
const int threshold = 100; // threshold value to decide when the detected sound is a knock or not
// READ AND STORE THE VALUE READ FROM SENSOR PINS
int caixaReading = 0;
int charlesReading = 0;
int tomtomReading = 0;
int crashReading = 0;
int bomboReading = 0;
void setup() {
Serial.begin(9600); // use the serial port
}
void loop() {
// read the sensor and store it in the variable sensorReading:
caixaReading = analogRead(caixa);
// if the sensor reading is greater than the threshold:
if (caixaReading >= threshold) {
// IF YOU HIT THE CAIXA, SEND 0 TO PROCESSING
Serial.print("0,");
Serial.println(caixaReading);
}
charlesReading = analogRead(charles);
if (charlesReading >= threshold) {
// IF YOU HIT THE CHARLES, SEND 1 TO PROCESSING
Serial.print("1,");
Serial.println(caixaReading);
}
tomtomReading = analogRead(tomtom);
if (tomtomReading >= threshold) {
// IF YOU HIT THE CAIXA, SEND 2 TO PROCESSING
Serial.print("2,");
Serial.println(tomtomReading);
}
crashReading = analogRead(crash);
if (crashReading >= threshold) {
// IF YOU HIT THE CAIXA, SEND 3 TO PROCESSING
Serial.print("3,");
Serial.println(crashReading);
}
bomboReading = analogRead(bombo);
if (bomboReading >= 15) {
// IF YOU HIT THE CAIXA, SEND 4 TO PROCESSING
Serial.print("4,");
Serial.println(bomboReading);
}
delay(10); // delay to avoid overloading the serial port buffer
}
PROCESSING CODE
//IMPORT SOUND AND SERIAL LIBRARIES
import processing.sound.*;
import processing.serial.*;
Serial myPort; // Create object from Serial class
String val; // Data received from the serial port
//DRUM SOUNDS
SoundFile caixa;
SoundFile charles;
SoundFile tomtom;
SoundFile crash;
SoundFile bombo;
//DRUMS STUDIO IMAGES
PImage img0;
PImage img1;
PImage img2;
PImage img3;
PImage img4;
PImage img5;
PImage img6;
//DRUMS STUDIO WAVES VARIABLES
float n = 0;
float n2 = 1;
float n3 = 2;
float n4 = 3;
float n5 = 4;
float y = 0;
float y2 = 1;
float y3 = 2;
float y4 = 3;
float y5 = 4;
void setup()
{
// OPEN WHATEVER PORT IS THE ONE YOU'RE USING
String portName = Serial.list()[0]; //change the 0 to a 1 or 2 etc. to match your port
myPort = new Serial(this, portName, 9600);
//DRUMS STUDIO CONSOLA
size(720, 680);
background(15, 15, 15);
strokeWeight(2);
//LOAD DRUM STUDIO IMAGES
img0 = loadImage("drumsstudio.png");
img1 = loadImage("res.png");
img2 = loadImage("caixa.png");
img3 = loadImage("charles.png");
img4 = loadImage("tomtom.png");
img5 = loadImage("crash.png");
img6 = loadImage("bombo.png");
//LOAD SOUNDS
caixa = new SoundFile(this, "caixa.aiff");
charles = new SoundFile(this, "charles.aiff");
tomtom = new SoundFile(this, "tomtom.aiff");
crash = new SoundFile(this, "crash.aiff");
bombo = new SoundFile(this, "bombo.aiff");
}
void draw()
{
//TITULO DRUMS STUDIO
image(img0, 125, 0);
//WAVES DRAWING
if (y>720) //Start the waves again
{
y = 0;
y2 = 1;
y3 = 2;
y4 = 3;
y5 = 4;
}
fill(0, 10);
rect(0, 0, width, height);
// Dejamos fill a blanco para
// dibujar la bola
fill(255);
stroke(250, 255, 3);
point(y, (height-40) + sin(n) * 30);
n = n + 0.05;
y = y + 1;
stroke(250, 255, 3);
point(y2, (height-40) + cos(n2) * 30);
n2 = n2 + 0.05;
y2 = y2 + 1;
stroke(250, 255, 3);
point(y3, (height-40) + sin(n3) * 30);
n3 = n3 + 0.05;
y3= y3 + 1;
stroke(250, 255, 3);
point(y4, (height-40) + cos(n4) * 30);
n4 = n4 + 0.05;
y4 = y4 + 1;
stroke(250, 255, 3);
point(y5, (height-40) + sin(n5) * 30);
n5 = n5 + 0.05;
y5 = y5 + 1;
//DIBUJO BATERIA SIN NINGUNA PARTE ILUMINADA
image(img1, 0, 80);
//MAKE OUTPUTS FOR EVERY INPUT
if ( myPort.available() > 0)
{ // If data is available,
val = myPort.readStringUntil('\n'); // read it and store it in val
println (val);
String[] list = split(val, ','); //Open a list for taking every input value
if (list!=null )
{
if (list[0].equals("0")) { //if you hit the caixa
caixa.play(); //Play caixa sound
image(img2, 0, 80);//The caixa is iluminated in the screen
println("caixa"); //print it out in the console
} else if (list[0].equals("1")) { //if you hit the charles
charles.play();//Play charles sound
image(img3, 0, 80);//The charles is iluminated in the screen
println("charles"); //print it out in the console
} else if (list[0].equals("2")) { //If you hit the tomtom
tomtom.play();//Play tomtom sound
image(img4, 0, 80);//Tomtom is iluminated in the screen
println("tomtom"); //print it out in the console
} else if (list[0].equals("3")) { //If you hit the crash
crash.play();//Play crash sound
image(img5, 0, 80); //Crash is iluminated in the screen
println("crash"); //print it out in the console
} else if (list[0].equals("4")) { //if you hit the bombo
bombo.play();//Play bombo sound
image(img6, 0, 80); //Bombo is iluminated in the screen
println("bombo"); //print it out in the console
}
}
}
}
Step 4: Build It
For the realization of the prototype, we have
used everyday elements to simplify the process, but always looking for functionality and a good finish.
The first step was to weld the cables to the piezoelectric, cutting these to a sufficient length to have freedom when arranging the battery on the table or where we go to practice.
After some research, we observed that it was important that the pad optimally transmitted the vibration of each impact to the piezoelectric, so that materials such as wood or plastic were discarded. Finally, we opted to use metal lids for canned food, which comply with their function and have a suitable appearance for their purpose.
Trying with the drumsticks and as expected, the impacts were too noisy and moved away from the solution of a silent drums. In order to solve it, we cover the surface with a Eva foam, cut to the dimensions of the central circumference of the lid. It is glued with double-sided tape thin enough so that the relief is not noticeable when playing. In addition, as the edge of the lids still made an annoying noise that prevented us from playing comfortably, we put a few small drops of hot melt glue on the edge to prevent the pad from slipping and softening each impact as much as possible.
To prevent the four pads from dispersing while touching, we joined them in pairs by means of a threaded bar that entered from the side, fixed from the inside with a small nut. The problem when we started playing was that since it was a metallic material, it transmitted the vibrations from one pad to the other, so when we played one, his partner sounded at the same time.
Finally we removed the rods and saw that it was enough and even more practical to use the piezo cable itself as a union.
As for the pedal, we had the initial idea of holding the piezo between a sandwich; to avoid the direct impact of the piezo against the ground. To do this we glued the piezo on a wooden plate and glued another PVC plate of the same size, to which we made a small crack facilitating and accommodating both the piezo and the cable.
At first we used PVC for both plates, but after several tests we realized that this material absorbed too much impact and transmitted it to the piezo.
To avoid having a pedal loose and moving as you step, we decided to place a rubber band between the sandwich to hold the pedal to our foot and ensure each stroke on the drum.
Finally, to achieve a better finish, we built a small box ourselves that housed the protoboard and the arduino. This is where the 5 cables enter through one side and allows the USB cable to be connected through the other. It is mounted in black feather cardboard, for its easy handling and to continue with the black and white aesthetics of the whole prototype.