
How it works...
You added four GameObjects to the scene, containing AudioSources linked to 140 bpm music clips. You created a C# script class, LoopScheduler, and added an instance to an empty GameObject. You associated the four AudioSources in your GameObjects with the four slots in the public AudioSource array variable in your scripted component.
The numbers of music clips you use can easily be changed by changing the size of the public array variable.
The Start() method counts the length of the array to set the numLoops variable. It then calculates the number of seconds to delay before starting each clip (this is fixed according to the beats-per-minute and beats-per-measure). Finally, it sets the current time to be the time to start the first loop.
The Update() method decides whether it's time to schedule the next loop, by testing whether the current time plus a 1-second look-ahead, is past the time to start the next loop. If so, the StartNextLoop() method is invoked. Regardless of whether we have started the next loop, the PrintLoopPlayingStatus() method to display to the user which loops are playing or not is printed to the Console.
The PrintLoopPlayingStatus() method loops for each AudioSource reference in the array, creating a string of trues and falses to be then printed out.
The StartNextLoop() method sends a PlayScheduled(...) message to the next AudioSource to be played, passing the nextEventTime value. It then adds the time between plays for the next event time. The next value of the loop index is then calculated (add one, if past the end of the array, then reset to 0 again).