In PComp class Billy and I make a Music Instrument that can adjust the pitch by pressing and tapping. Check this out!
#include "pitches.h" int lastButtonState = LOW; boolean switchIsOn = false; const int threshold = 10; const int speakerPinNum = 8; const int noteDuration = 20; const int potenPinNum = 5; int volumeAnalogValue = 0; int volume = 0; const int potPinNum = 2; float saveNote; int note[] = { NOTE_C4, NOTE_E4}; void setup() { Serial.begin(9600); saveNote = note[1]; } void loop() { int buttonState = digitalRead(2); if (buttonState != lastButtonState) { if (buttonState == HIGH) { switchIsOn = !switchIsOn; } } lastButtonState = buttonState; if (switchIsOn == true) { int pitchRead = analogRead(0); int noteRead = analogRead(1); float pitch = map(pitchRead, 0, 950, 0, 100); if (pitch > 0) { note[1] += pitch; } else { note[1] = saveNote; } Serial.print(pitch); Serial.print(" "); Serial.println(noteRead); if(noteRead > threshold) { tone(speakerPinNum, note[1], noteDuration); } } }
As for my review for this on Sunday, I made a basic music kit that you can control on/off, volumes, pitches(higher/lower), and tempo. But since it’s a single-note playing machine instead of templates/clip of music triggered one, it makes no difference with the changes of tempo.
And thanks to almighty Moon! I got the idea of setting button-“released” as the command to adjust pitches, so that pitches won’t go crazy because of the unmeasurable amount/time of button-“pressed” when you press the button. Thank you Moon 😀
What I want to do next–
- make chords (office hour w/ resident booked!)
- play continuous clips instead of single notes
- be creative! not just pressing buttons… not interesting at all… go go go!
And here’s the code.
#include "pitches.h" int lastButtonState = LOW; boolean switchIsOn = false; const int threshold = 600; const int speakerPinNum = 8; const int switchPinNum = 2; const int higherPitchPinNum = 4; const int lowerPitchPinNum = 3; int pre_higherPitchRead = 0; int pre_lowerPitchRead = 0; const int tempoPinNum = 0; const int noteGPinNum = 1; const int noteEPinNum = 2; const int noteCPinNum = 3; const int noteDuration = 20; int saveNote[3]; int note[] = {NOTE_C4, NOTE_E4, NOTE_G4}; void setup() { Serial.begin(9600); // save the original notes for (int i=0; i<3; i++) { saveNote[i] = note[i]; } } void loop() { // on-off switch setting int buttonState = digitalRead(switchPinNum); if (buttonState != lastButtonState) { if (buttonState == HIGH) { switchIsOn = !switchIsOn; } } lastButtonState = buttonState; // read different notes int noteCRead = analogRead(noteCPinNum); int noteERead = analogRead(noteEPinNum); int noteGRead = analogRead(noteGPinNum); // set up duration of notes int tempoRead = analogRead(tempoPinNum); int tempo = map(tempoRead, 0, 1023, 5, 100); // press buttons to make notes go higher/lower int higherPitchRead = digitalRead(higherPitchPinNum); int lowerPitchRead = digitalRead(lowerPitchPinNum); // when switch is on if (switchIsOn == true) { Serial.print(tempo); Serial.print(" "); // make notes go higher or lower for (int i=0; i<3; i++) { if (higherPitchRead == LOW && pre_higherPitchRead == HIGH) { note[i] *= 2; } if (lowerPitchRead == LOW && pre_lowerPitchRead == HIGH) { note[i] /= 2; } note[0] = constrain(note[0], 32, 4192); note[1] = constrain(note[1], 41, 5280); note[2] = constrain(note[2], 49, 6272); } // make sounds! if(noteCRead < threshold && noteERead < threshold && noteGRead < threshold) { for (int i=0; i<3; i++) { tone(speakerPinNum, note[i], tempo); } } else if(noteCRead < threshold && noteERead < threshold) { tone(speakerPinNum, note[0], tempo); tone(speakerPinNum, note[1], tempo); } else if(noteCRead < threshold && noteGRead < threshold) { tone(speakerPinNum, note[0], tempo); tone(speakerPinNum, note[2], tempo); } else if(noteGRead < threshold && noteERead < threshold) { tone(speakerPinNum, note[2], tempo); tone(speakerPinNum, note[3], tempo); } else if(noteCRead < threshold) { tone(speakerPinNum, note[0], tempo); } else if(noteERead < threshold) { tone(speakerPinNum, note[1], tempo); } else if(noteGRead < threshold) { tone(speakerPinNum, note[2], tempo); } Serial.print(note[0]); Serial.print(" "); Serial.print(note[1]); Serial.print(" "); Serial.print(note[2]); Serial.print(" "); Serial.println(" "); } else { for (int i=0; i<3; i++) { // when swtich-off note[i] = saveNote[i]; // restore the original notes } } // remember the previouse higher/lower pitch buttons status pre_higherPitchRead = higherPitchRead; pre_lowerPitchRead = lowerPitchRead; }