This circuit uses four push buttons connected to pins 4-7 on the Arduino to control sound in Processing. For each button pressed, a different drum sound is played in Processing. For example: when the button connected to pin 4 is pressed, a cowbell sound is played. The sounds can also be played by pressing keys k, j, h, and g.
Arduino code:
int switchPin1 = 4; // declares variables
int switchPin2 = 5; int switchPin3 = 6; int switchPin4 = 7; void setup() {
Serial.begin(9600); // begin serial communication at 9600 bps pinMode(switchPin1, INPUT); // set switchPins to input pinMode(switchPin2, INPUT); pinMode(switchPin3, INPUT); pinMode(switchPin4, INPUT); } void loop() {
if(digitalRead(switchPin1) == HIGH) { // if button is pressed Serial.print(1, DEC); // print this number delay(100); // and delay for 100 milliseconds } else if(digitalRead(switchPin2) == HIGH) { Serial.print(2, DEC); delay(100); } else if(digitalRead(switchPin3) == HIGH) { Serial.print(3, DEC); delay(100); } else if(digitalRead(switchPin4) == HIGH) { Serial.print(4, DEC); delay(100); } } Processing code:
import processing.serial.*; // import libraries
import ddf.minim.*; Minim minim; // declare variables
AudioSample cowbell; AudioSample bass; AudioSample kick; AudioSample snare; Serial myPort; void setup()
{ // sets screen size size(512, 200, P2D); // always start Minim before you do anything with it minim = new Minim(this); // load file from the data folder, with a 512 sample buffer cowbell = minim.loadSample("Cowbell.mp3"); bass = minim.loadSample("Bass.wav"); kick = minim.loadSample("Kick.wav"); snare = minim.loadSample("Snare.wav"); // sets port to read from String portName = Serial.list()[0]; myPort = new Serial(this, Serial.list()[0], 9600); } void draw()
{ int val = 0; // resets value every time draw is run background(0); // sets background color stroke(255); // sets stroke color // use the mix buffer to draw the waveforms. // because these are MONO files, we could have used the left or right buffers and got the same data for (int i = 0; i < cowbell.bufferSize() - 1; i++) { line(i, 100 - cowbell.left.get(i)*50, i+1, 100 - cowbell.left.get(i+1)*50); } for (int u = 0; u < bass.bufferSize() - 1; u++) { line(u, 100 - bass.left.get(u)*50, u+1, 100 - bass.left.get(u+1)*50); } for (int y = 0; y < kick.bufferSize() - 1; y++) { line(y, 100 - kick.left.get(y)*50, y+1, 100 - kick.left.get(y+1)*50); } for (int t = 0; t < snare.bufferSize() - 1; t++) { line(t, 100 - snare.left.get(t)*50, t+1, 100 - snare.left.get(t+1)*50); } if (myPort.available() > 0) { // if there is data available to read, val = myPort.read(); // read it and store it in val println(val); // print the value of val } if (val == 49 ) cowbell.trigger(); // if val is this, play the sound if (val == 50 ) bass.trigger(); if (val == 51 ) kick.trigger(); if (val == 52 ) snare.trigger(); } void keyPressed()
{ if ( key == 'k' ) cowbell.trigger(); // if this key is pressed, play this sound if ( key == 'j' ) bass.trigger(); if ( key == 'h' ) kick.trigger(); if ( key == 'g' ) snare.trigger(); } void stop()
{ // always close Minim audio classes when you are done with them cowbell.close(); bass.close(); kick.close(); snare.close(); minim.stop(); super.stop(); } This one took me a while to figure out. It took me a couple tries to figure out where exactly to save the sound clips so that they could be read in the program, and then when i got that worked out the sound would repeat until another button was pressed, and then that sound would repeat. I solved that by resetting val every time the void draw function was run. I still have no idea where the values change from 1-4 to 49-52, but I got the program working and I didn't want to mess it up. A Fritzing picture of my circuit is attached. |