/* this code is a result of combining two different sources. the drum sample waveshapes were written by Sebastian Tomczak, and the original code is here: http://little-scale.blogspot.com/2008/04/arduino-drum-machine.html the second source is the Play Melody code from the Arduino Tutorials, which can be found here: http://www.arduino.cc/en/Tutorial/PlayMelody joe saavedra 4/3/2009 */ //---DRUM SAMPLE ARRAYS--- byte kick[]={ 127, 80, 42, 5, 165, 242, 241, 233, 128, 73, 48, 22, 127, 69, 55, 113, 151, 183, 209, 217, 223, 228, 233, 215, 161, 117, 91, 76, 65, 49, 37, 31, 31, 48, 83, 120, 146, 166, 183, 198, 206, 210, 209, 199, 178, 145, 111, 88, 78, 73, 69, 67, 72, 80, 88, 97, 109, 124, 137, 150, 163, 171, 174, 172, 168, 160, 144, 125, 114, 110, 108, 104, 104, 106, 109, 110, 112, 117, 124, 129, 135, 142, 145, 145, 143, 140, 137, 132, 128, 125, 122, 119, 118, 119, 119, 119, 118, 118, 120, 124, 126, 129, 132, 135, 137, 137, 135, 132, 131, 130, 129, 128, 126, 126, 124, 123, 121, 120, 120, 122, 123, 124, 126, 128, 129, 130, 130, 131, 131, 131, 130, 130, 130, 129, 129, 128, 126, 125, 125, 124, 124, 124, 124, 125, 126, 126, 128, 128, 128, 129, 129, 129, 129, 129, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 128, 127, 126, 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126 }; byte snare[]={ 127, 215, 65, 212, 56, 102, 135, 122, 51, 201, 220, 46, 175, 80, 152, 95, 123, 116, 184, 155, 59, 122, 100, 161, 143, 173, 101, 155, 97, 73, 112, 98, 176, 96, 140, 77, 134, 109, 132, 149, 112, 149, 97, 161, 98, 151, 98, 155, 149, 112, 157, 103, 133, 106, 167, 97, 166, 108, 129, 124, 136, 146, 124, 136, 129, 150, 94, 130, 105, 141, 146, 128, 129, 99, 150, 121, 141, 99, 142, 116, 131, 114, 118, 143, 127, 143, 115, 144, 120, 137, 109, 129, 131, 139, 129, 113, 144, 119, 145, 117, 135, 129, 134, 136, 124, 130, 130, 139, 121, 136, 121, 132, 128, 127, 126, 122, 130, 126, 138, 120, 136, 122, 131, 123, 130, 128, 127, 128, 118, 132, 125, 131, 122, 131, 125, 131, 122, 126, 128, 126, 129, 121, 129, 123, 132, 129, 127, 131, 123, 128, 125, 130, 123, 131, 123, 128, 131, 129, 128, 126, 125, 124, 131, 121, 124, 129, 130, 126, 124, 126, 127, 130, 125, 126, 128, 126, 128, 126, 126, 126, 126, 125, 128, 126, 126, 126, 126, 126, 126, 125, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128, 128, 126, 128, 126, 127, 126, 128, 125, 127, 128, 128, 126, 126, 128, 126, 126, 128, 128, 128, 128, 128, 126, 128, 126, 126, 128, 128, 126, 126, 128, 128, 126, 126, 127, 126, 128, 126, 126, 128, 128, 128, 126, 126, 126, 128, 128, 126, 126, 126, 128, 128, 126, 128, 128, 126, 126 }; byte hat[]={ 127, 128, 225, 217, 99, 38, 61, 153, 152, 144, 133, 73, 122, 144, 65, 188, 87, 170, 164, 111, 122, 151, 114, 88, 174, 77, 140, 92, 122, 141, 156, 124, 121, 123, 126, 133, 132, 139, 119, 120, 127, 141, 130, 122, 129, 127, 132, 121, 139, 118, 130, 131, 129, 132, 130, 134, 126, 128, 130, 126, 122, 132, 129, 127, 131, 126, 128, 127, 126, 125, 127, 125, 128, 125, 128, 128, 127, 127, 126, 127, 128, 128, 128, 127, 127, 127, 127, 127, 128, 127, 127, 126, 127, 127, 128, 127, 128, 126, 127, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 126, 126, 128, 127, 126, 127, 126, 127, 127, 126, 127, 126, 127, 127, 127, 127, 127, 126, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 127, 127, 126, 127, 127, 127, 126, 127, 127, 126, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 127, 127, 126, 127, 126, 126, 127, 126, 127, 126, 126, 126, 126, 126, 126, 126, 127, 127, 126, 127, 127, 127, 127, 126, 126, 127, 127, 127, 126, 127, 126, 127, 127, 127, 127, 127, 126, 126, 127, 127, 126, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127 }; byte crash[]={ 127, 128, 225, 217, 99, 38, 61, 153, 152, 144, 133, 73, 122, 144, 65, 188, 87, 170, 164, 111, 122, 151, 114, 88, 174, 77, 140, 92, 122, 141, 156, 124, 121, 123, 126, 133, 132, 139, 119, 120, 127, 141, 130, 122, 129, 127, 132, 121, 139, 118, 130, 131, 129, 132, 130, 134, 126, 128, 130, 126, 122, 132, 129, 127, 131, 126, 128, 127, 126, 125, 127, 125, 128, 125, 128, 128, 127, 127, 126, 127, 128, 128, 128, 127, 127, 127, 127, 127, 128, 127, 127, 126, 127, 127, 128, 127, 128, 126, 127, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 126, 126, 128, 127, 126, 127, 126, 127, 127, 126, 127, 126, 127, 127, 127, 127, 127, 126, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 127, 127, 127, 126, 127, 127, 127, 126, 127, 127, 126, 127, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 126, 126, 127, 127, 126, 127, 126, 126, 127, 126, 127, 126, 126, 126, 126, 126, 126, 126, 127, 127, 126, 127, 127, 127, 127, 126, 126, 127, 127, 127, 126, 127, 126, 127, 127, 127, 127, 127, 126, 126, 127, 127, 126, 127, 127, 127, 127, 126, 127, 127, 127, 127, 127, 127, 127, 127 }; //---EXPERIMENTAL SINE WAVE ARRAY--- byte sine[]={ 127, 130, 133, 136, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179, 182, 185, 187, 190, 193, 195, 198, 201, 203, 206, 208, 211, 213, 215, 217, 220, 222, 224, 226, 228, 230, 232, 233, 235, 237, 238, 240, 241, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 253, 253, 252, 252, 251, 250, 250, 249, 248, 247, 246, 244, 243, 242, 240, 239, 237, 236, 234, 232, 231, 229, 227, 225, 223, 221, 219, 216, 214, 212, 209, 207, 204, 202, 199, 197, 194, 191, 189, 186, 183, 180, 177, 175, 172, 169, 166, 163, 160, 157, 154, 150, 147, 144, 141, 138, 135, 132, 129, 125, 122, 119, 116, 113, 110, 107, 104, 100, 97, 94, 91, 88, 85, 82, 79, 77, 74, 71, 68, 65, 63, 60, 57, 55, 52, 50, 47, 45, 42, 40, 38, 35, 33, 31, 29, 27, 25, 23, 22, 20, 18, 17, 15, 14, 12, 11, 10, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28, 30, 32, 34, 37, 39, 41, 43, 46, 48, 51, 53, 56, 59, 61, 64, 67, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, 108, 111, 114, 118, 121, 124, 127 }; //---DRUM COMPOSITION ARRAY (SIZE APPLIES TO BOTH DRUMS AND MELODY)--- int beatComp[]={ 1,2,3,4, 1,2,3,4, 3,4,2,1, 2,3,1,4 }; //Sharps int sharpIR1 = 0; int valSharp1 = 0; //LEDs int ledOH = 9; int led1 = 5; int led2 = 7; int led3 = 6; int led4 = 8; int beat = 0; int tempo = 10; int bb = 20; //---THIS IS THE MICROSECOND DELAY FOR READING THROUGH DRUM WAVETABLE int bb1 = 0; char pin=0; //LED FADING int dur=0; //---MEDLODIZER PINS--- int speakerPin = 3; //---DRUM PINS--- int kickPin = 10; int hatPin = 11; int crashPin = 12; int snarePin = 13; int length = 15; // the number of notes char notes[] = "aceacegdcgdcedCcg"; // a space represents a rest "ccggaagffeeddcd_" int beats[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; //--ACCELEROMETER-- int xAxis = 4; int yAxis = 3; void setup(){ pinMode(kickPin,OUTPUT); //"kick" sample pinMode(hatPin,OUTPUT); //"hihat" sample pinMode(crashPin,OUTPUT); //"crash" sample pinMode(snarePin,OUTPUT); //"snare" sample pinMode(speakerPin,OUTPUT); //FUNDAMENTAL FREQUENCY pinMode(led1,OUTPUT); pinMode(led2,OUTPUT); pinMode(led3,OUTPUT); pinMode(led4,OUTPUT); pinMode(ledOH,OUTPUT); //Serial.begin(115200); //HIGHEST BAUD RATE = BETTER digitalWrite(led1,HIGH); delay(200); digitalWrite(led2,HIGH); delay(200); digitalWrite(led3,HIGH); delay(200); digitalWrite(led4,HIGH); delay(200); digitalWrite(ledOH,HIGH); delay(2000); digitalWrite(led4,LOW); delay(200); digitalWrite(led3,LOW); delay(200); digitalWrite(led2,LOW); delay(200); digitalWrite(led1,LOW); delay(200); digitalWrite(ledOH,LOW); delay(200); digitalWrite(led1,HIGH); digitalWrite(led2,HIGH); digitalWrite(led3,HIGH); digitalWrite(led4,HIGH); digitalWrite(ledOH,HIGH); delay(1000); digitalWrite(led1,LOW); digitalWrite(led2,LOW); digitalWrite(led3,LOW); digitalWrite(led4,LOW); digitalWrite(ledOH,LOW); } void loop(){ bb = 20; for(int i=0; i<16; i++){ checkRange(); beat = beatComp[i]; //---LOAD FIRST BEAT OF DRUM COMPOSITION //playNote(notes[i], beats[i] * tempo); //---NESTED FOR LOOP TO PLAY MELODY--- if (beat == 1){ //---PLAY DRUM SAMPLES AS COMPOSITION ARRAY DICTATES--- digitalWrite(led1,HIGH); playSnare(); delay(tempo/8); digitalWrite(led1,LOW); } else if (beat == 2){ digitalWrite(led2,HIGH); playKick(); delay(tempo/8); digitalWrite(led2,LOW); } else if (beat == 3){ digitalWrite(led3,HIGH); playHat(); delay(tempo/8); digitalWrite(led3,LOW); } else if (beat == 4){ digitalWrite(led4,HIGH); playCrash(); delay(tempo/8); digitalWrite(led4,LOW); } else if (beat == 5){ delay(tempo/8); } } //---TRIGGER LIGHTNING--- while (valSharp1 > 450){ bb = tempo; playThunder(150); digitalWrite(kickPin,LOW); digitalWrite(ledOH,HIGH); delay(random(150,500)); digitalWrite(ledOH,LOW); playThunder(100); delay(random(250,750)); digitalWrite(ledOH,HIGH); playThunder(75); digitalWrite(ledOH,LOW); //fadeUp(led1,5); playSnare(); delay(random(10,1000)); //fadeUp(led2,5); playCrash(); digitalWrite(ledOH,HIGH); delay(random(1,10)); digitalWrite(ledOH,LOW); delay(random(10,1000)); //fadeUp(led3,5); playSnare(); digitalWrite(ledOH,HIGH); delay(random(1,30)); digitalWrite(ledOH,LOW); delay(random(10,1000)); //fadeUp(led4,5); playCrash(); /* fadeDown(led1,random(10,20)); fadeDown(led2,random(10,20)); fadeDown(led3,random(10,20)); fadeDown(led4,random(10,20)); */ for(int i=255;i<0;i-=5){ analogWrite(ledOH,i); } digitalWrite(speakerPin,LOW); checkRange(); delay(tempo/random(10,30)); bb = 20; } } void checkRange(){ //---SENSOR READINGS valSharp1 = analogRead(sharpIR1); tempo = map(valSharp1,0,500,7000,750); //---TEMPO DEFINITION-- } void playSnare(){ //---DRUM SAMPLES PLAYBACK--- for(int i=0; i<256; i++){ analogWrite(snarePin,snare[i]); delayMicroseconds(bb); } digitalWrite(snarePin,LOW); } void playKick(){ for(int i=0; i<256; i++){ analogWrite(kickPin,kick[i]); delayMicroseconds(bb); } digitalWrite(kickPin,LOW); } void playHat(){ for(int i=0; i<256; i++){ analogWrite(hatPin,hat[i]); delayMicroseconds(bb); } digitalWrite(hatPin,LOW); } void playCrash(){ for(int i=0; i<256; i++){ analogWrite(crashPin,crash[i]); delayMicroseconds(bb); } digitalWrite(crashPin,LOW); } void playThunder(int bb1){ for(int i=0; i<256; i++){ analogWrite(speakerPin,kick[i]); delayMicroseconds(bb1); } digitalWrite(speakerPin,LOW); } //---- MELODIZER--- void playTone(int tone, int duration) { for (long i = 0; i < duration*50L; i += tone * 2) { digitalWrite(speakerPin, HIGH); delayMicroseconds(tone*2); digitalWrite(speakerPin, LOW); delayMicroseconds(tone*2); } } void playNote(char note, int duration) { char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; // play the tone corresponding to the note name for (int i = 0; i < 8; i++) { if (names[i] == note) { playTone(tones[i], duration); } } } void fadeUp(int pin, int dur){ for (int i=0; i<50; i+=5){ analogWrite(pin, i); delay(dur); } } void fadeDown(int pin, int dur){ for (int i=50; i>=0; i-=5){ analogWrite(pin, i); delay(dur); } }