/* Record Piano * Yongsu Park. (sncosmos@empal.com) * * note frequency period timeHigh * c 261 Hz 3830 1915 * d 294 Hz 3400 1700 * e 329 Hz 3038 1519 * f 349 Hz 2864 1432 * g 392 Hz 2550 1275 * a 440 Hz 2272 1136 * b 493 Hz 2028 1014 * C 523 Hz 1912 956 * * http://www.arduino.cc/en/Tutorial/Melody */ // Function Key Pin Number int keyFunc = 0; // Piano Key Pin Number int keyDo = 2; int keyRe = 3; int keyMe = 4; int keyFa = 5; // Record Button Pin Number int keyRec = 8; // Speacker int speakerPin = 10; // Record LED int ledPin = 12; // Record Memory Area // Recording Time = 1900 / ( 1000/dTime ) // Dura Time : 5 10 20 30 40 50 100 // Rec Time : 10 20 40 60 80 100 200 (sec) byte recMem[1900]; int dTime = 50; // duration time int flagRec = 0; // 0 - unRecording , 1-Recording int flagIsPress = 0; int recCount = 0; int playCount = 0; // Do Re Mi Fa Sol Ra Si Do int tones_bas[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(speakerPin, HIGH); delayMicroseconds(tone); digitalWrite(speakerPin, LOW); delayMicroseconds(tone); } } void blinkeLED(int delaytime) { digitalWrite(ledPin, HIGH); delay(delaytime); digitalWrite(ledPin, LOW); delay(delaytime); } void playRec() { // indicate start LED blinkeLED(200); blinkeLED(200); // play recording music for (int i = 0; i < playCount; i++) { if (recMem[i] == 255) { delay(dTime); digitalWrite(ledPin, LOW); } else { playTone(tones_bas[recMem[i]], dTime); digitalWrite(ledPin, HIGH); } } // indicate END LED blinkeLED(150); blinkeLED(150); blinkeLED(150); } void setup() { pinMode(keyFunc, INPUT); pinMode(keyDo, INPUT); pinMode(keyRe, INPUT); pinMode(keyMe, INPUT); pinMode(keyFa, INPUT); pinMode(keyRec, INPUT); pinMode(speakerPin, OUTPUT); pinMode(ledPin, OUTPUT); // initial rec memory for (int i=0; i < 1900 ; i++) { recMem[i] = 255; } } void loop() { // unRecording if ( flagRec == 0 ) { // unPress Func Key if ( digitalRead(keyFunc) == HIGH ) { if (digitalRead(keyDo)==LOW) { playTone(tones_bas[0], dTime); } else if (digitalRead(keyRe)==LOW) { playTone(tones_bas[1], dTime); } else if (digitalRead(keyMe)==LOW) { playTone(tones_bas[2], dTime); } else if (digitalRead(keyFa)==LOW) { playTone(tones_bas[3], dTime); } // Rec button Press Control else if (digitalRead(keyRec)==LOW && flagIsPress==0 ) { // Recording Code flagIsPress = 1; delay(500); // prevent double click flagRec = 1; } else if (digitalRead(keyRec)==HIGH && flagIsPress==1 ) { flagIsPress = 0; } } // Press Func Key else if ( digitalRead(keyFunc) == LOW ) { if (digitalRead(keyDo)==LOW) { playTone(tones_bas[4], dTime); } else if (digitalRead(keyRe)==LOW) { playTone(tones_bas[5], dTime); } else if (digitalRead(keyMe)==LOW) { playTone(tones_bas[6], dTime); } else if (digitalRead(keyFa)==LOW) { playTone(tones_bas[7], dTime); } // Rec button Press Control else if (digitalRead(keyRec)==LOW && flagIsPress==0 ) { flagIsPress = 1; playRec(); } else if (digitalRead(keyRec)==HIGH && flagIsPress==1 ) { flagIsPress = 0; } } } // Recording else if ( flagRec == 1 ) { digitalWrite(ledPin, HIGH); // Loop for (recCount = 0; recCount<1900 ; recCount++ ) { // unPress Func Key if ( digitalRead(keyFunc) == HIGH ) { if (digitalRead(keyDo)==LOW) { playTone(tones_bas[0], dTime); recMem[recCount] = 0; } else if (digitalRead(keyRe)==LOW) { playTone(tones_bas[1], dTime); recMem[recCount] = 1; } else if (digitalRead(keyMe)==LOW) { playTone(tones_bas[2], dTime); recMem[recCount] = 2; } else if (digitalRead(keyFa)==LOW) { playTone(tones_bas[3], dTime); recMem[recCount] = 3; } // Rec button Press Control else if (digitalRead(keyRec)==LOW && flagIsPress==0 ) { flagIsPress = 1; playCount = recCount; delay(500); // prevent double click break; } else if (digitalRead(keyRec)==HIGH && flagIsPress==1 ) { flagIsPress = 0; } else { recMem[recCount] = 255; delay(dTime); } } // Press Func Key else if ( digitalRead(keyFunc) == LOW ) { if (digitalRead(keyDo)==LOW) { playTone(tones_bas[4], dTime); recMem[recCount] = 4; } else if (digitalRead(keyRe)==LOW) { playTone(tones_bas[5], dTime); recMem[recCount] = 5; } else if (digitalRead(keyMe)==LOW) { playTone(tones_bas[6], dTime); recMem[recCount] = 6; } else if (digitalRead(keyFa)==LOW) { playTone(tones_bas[7], dTime); recMem[recCount] = 7; } else { recMem[recCount] = 255; delay(dTime); } } playCount = recCount; } digitalWrite(ledPin, LOW); flagRec = 0; } // unknown signal else { flagRec = 0; } }