public void Generate()
{
// initialize tracks
for (int i = 0, j = _score.Tracks.Count; i < j; i++)
{
GenerateTrack(_score.Tracks[i]);
}
var controller = new MidiPlaybackController(_score);
MasterBar previousMasterBar = null; // store the previous played bar for repeats
while (!controller.Finished)
{
var index = controller.Index;
var bar = _score.MasterBars[index];
var currentTick = controller.CurrentTick;
controller.ProcessCurrent();
if (controller.ShouldPlay)
{
GenerateMasterBar(bar, previousMasterBar, currentTick);
for (int i = 0, j = _score.Tracks.Count; i < j; i++)
{
var track = _score.Tracks[i];
for (int k = 0, l = track.Staves.Count; k < l; k++)
{
var staff = track.Staves[k];
if (index < staff.Bars.Count)
{
GenerateBar(staff.Bars[index], currentTick);
}
}
}
}
controller.MoveNext();
previousMasterBar = bar;
}
for (int i = 0, j = _score.Tracks.Count; i < j; i++)
{
_handler.FinishTrack(_score.Tracks[i].Index, controller.CurrentTick);
}
TickLookup.Finish();
}