I quite like rachet freaks's idea, however whilst making an example for you his answer hadn't been posted. SO i'll chip in anyway!
In general it is possible to control and measure more than one input and output at the same time by the use of millis(). millis() is an arduino function that returns the number of milliseconds since the arduino fired up.
This probably doesnt sound overly useful to you straight away. But millis can be used in place of delay() if used correctly. Essentially you create a long variable to hold the beginning of an event and check the time since that event started with an if statement. If the difference in the current time and the start time is equal to the time you want the event to occur. Stop the event.
I appreciate my explanation might not be overly clear. So I wrote an example sketch. The sketch has two button inputs. And two button outputs. If one of the buttons is pressed one led will blink for 10 seconds, pressing the button mid blink will extend the time the led blinks by another 10 seconds. Whilst this is happening if you press the second button the other led will turn on, but only when the button is pressed. Using delay() to achieve this would not work nearly as well.
//Setup led and button pins
int ledPin1 = 3;
int ledPin2 = 4;
int butPin1 = 5;
int butPin2 = 6;
//Setup timers
unsigned long currentMillis = 0;
unsigned long blinkStartMillis = 0;
unsigned long ledOnMillis1 = 0;
unsigned long ledOffMillis1 =0;
//Setup variables to store input and output states.
int ledState1 = 0, ledState2 = 0; //State 1 for on, 0 for off;
int butState1 = 0, butState2 = 0; //State 1 for trigger, 0 for off;
//Setup trigger for event
int blinkTrigger = 0;
void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(butPin1, INPUT);
pinMode(butPin2, INPUT);
delay(500);
}
void loop() {
//Sets current millis for this loop
currentMillis = millis();
//Reads Button States
butState1 = digitalRead(butPin1);
butState2 = digitalRead(butPin2);
//Setup to start blink if button 1 input is high
if(butState1) {
blinkTrigger = 1;
blinkStartMillis = currentMillis;
}
//Handles Blinking
if(blinkTrigger) {
//If led1 off, and has been off for 500 milliseconds. led 1 on
if(ledState1 == 0 && currentMillis - LedOffMillis >= 500) {
digitalWrite(ledPin1, HIGH);
ledState1 = 1;
ledOnMillis = currentMillis;
}
//If led1 on, and has been on for 500 milliseconds. led 1 off
if(ledState1 == 1 && currentMillis - LedOnMillis >= 500) {
digitalWrite(ledPin1, LOW);
ledState1 = 0;
ledOffMillis = currentMillis;
}
//If led1 has been blinking for more than 10 seconds
//Stop blinking
if(currentMillis - blinkStartMillis > 10000) {
digitalWrite(ledPin1, LOW);
ledState1 = 0;
blinkTrigger = 0;
}
}
//While Button 2 pressed led 2 on
if(butState2) digitalWrite(ledPin2, HIGH);
if(!butState2) digitalWrite(ledPin2, LOW);
}
Note: The code style is a bit off because i rushed it, I would also usually use structs to hold the timers and event triggers.
Now for the Wave module rachet is bang on the money, you would need a file for every single note and every single chord.
I hope I helped, if not for your project maybe you may have learnt how to handle more than one event using event timings.