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;
}