My son asked me a very similar question the other night except he was turning LEDs on and off and wanted to control them independently rather than sequentially. My suggestion was to use counter variables and a minimal delay which would control the amount of time any particular led was on or off.
For example, instead of using a delay of 300 ms all at one shot, put a 1 millisend delay at the end of the main loop and then set up counters at the beginning of the main loop that you increment with “var++”. Each time through the loop is 1 millisecond. 300 times through the loop would be 300 milliseconds (roughly). Use “if” (or “switch”) statements to check your counters if enough time has passed to turn the led (or sound) on and also if enough time has passed to turn it off again. Don’t forget to reset your variables back to 0 when your timers have expired.
If you need help with the actual code I can give you an example. I used 3 variables for each led I wanted to turn on and off. The first is the counter and incremented at the top of the loop (ledcnt1++). The second held the amount of time the led should be on (ledon1). The third held the amount of time the led should be off (ledoff1). When the “ledcnt1” reaches the “ledoff1” time it would turn the led on, when the counter reached the “ledoff1 + ledon1” time the led would be turned off and “ledcnt1” reset to 0. End of the loop delays 1 ms. Initialize the counters to 0 and initialize your on and off variables in the setup function.
This is a very basic way to do it. A more elegant way to do it would be to set an alarm though I am not sure at this point if that is supported on avr/Arduino. Here is a little info on setting up a timer:
In fact there is probably an even better basic way than I describe but it is the first thing that came to mind and it worked for us.