Multiple tone outputs

You can get lots of tones, you just need to do some programming.
For example, middle has a frequency of 440 Hz, or a period of 1/440 = 2272 microseconds. So every 1136uS it changes from high to low.
You can do the math for other notes.
Thus you can capture the time using micros() when a button is pressed, and every 1136 uS change an output from high to low, or low to high.
Write a loop that checks if a key is being held down and turn an output on/off accordingly.
So something like this:

byte noteA = 0;
unsigned long noteAmicros;
unsigned long noteAduration = 1136;
keyA = 2;
noteApin =3 
// etc for other notes


void loop(){
if (keyA==0 & micros() >=noteAmicros){
noteAmicros = micros() +noteAduration; // set for next on/off
digitalWrite (noteApin, 1-noteA); // result is 0,1,0,1...
}
if (keyB==0 & micros() >=noteBmicros){
noteBmicros = micros() +noteBduration; // set for next on/off
digitalWrite (noteBpin, 1-noteB); // result is 0,1,0,1...
}
if (keyC==0 & micros() >=noteCmicros){
noteCmicros = micros +noteCduration; // set for next on/off
digitalWrite (noteCpin, 1-noteC); // result is 0,1,0,1...
}
if (keyD==0 & micros() >=noteDmicros){
noteDmicros = micros +noteDduration; // set for next on/off
digitalWrite (noteDpin,1-noteD); // result is 0,1,0,1...
}
} // end void loop