private void BuildModel()
{
// build score
for (int i = 0, j = _masterBars.Count; i < j; i++)
{
var masterBar = _masterBars[i];
Score.AddMasterBar(masterBar);
}
// add tracks to score
foreach (var trackId in _tracksMapping)
{
var track = _tracksById[trackId];
Score.AddTrack(track);
}
// process all masterbars
for (int masterBarIndex = 0; masterBarIndex < _barsOfMasterBar.Count; masterBarIndex++)
{
var barIds = _barsOfMasterBar[masterBarIndex];
// add all bars of masterbar vertically to all tracks
int staveIndex = 0;
for (int barIndex = 0, trackIndex = 0; barIndex < barIds.Length && trackIndex < Score.Tracks.Count; barIndex++)
{
var barId = barIds[barIndex];
if (barId != InvalidId)
{
var bar = _barsById[barId];
var track = Score.Tracks[trackIndex];
track.AddBarToStaff(staveIndex, bar);
// stave is full? -> next track
if (staveIndex == track.Staves.Count - 1)
{
trackIndex++;
staveIndex = 0;
}
else
{
staveIndex++;
}
}
else
{
// no bar for track
trackIndex++;
}
}
}
// build bars
foreach (var barId in _barsById.Keys)
{
var bar = _barsById[barId];
if (_voicesOfBar.ContainsKey(barId))
{
// add voices to bars
foreach (var voiceId in _voicesOfBar[barId])
{
if (voiceId != InvalidId)
{
bar.AddVoice(_voiceById[voiceId]);
}
else
{
// invalid voice -> empty voice
var voice = new Voice();
bar.AddVoice(voice);
var beat = new Beat();
beat.IsEmpty = true;
beat.Duration = Duration.Quarter;
voice.AddBeat(beat);
}
}
}
}
// build beats
foreach (var beatId in _beatById.Keys)
{
var beat = _beatById[beatId];
var rhythmId = _rhythmOfBeat[beatId];
var rhythm = _rhythmById[rhythmId];
// set beat duration
beat.Duration = rhythm.Value;
beat.Dots = rhythm.Dots;
beat.TupletNumerator = rhythm.TupletNumerator;
beat.TupletDenominator = rhythm.TupletDenominator;
// add notes to beat
if (_notesOfBeat.ContainsKey(beatId))
{
foreach (var noteId in _notesOfBeat[beatId])
{
if (noteId != InvalidId)
{
beat.AddNote(_noteById[noteId]);
if (_tappedNotes.ContainsKey(noteId))
{
beat.Tap = true;
}
}
}
}
}
// build voices
foreach (var voiceId in _voiceById.Keys)
{
var voice = _voiceById[voiceId];
if (_beatsOfVoice.ContainsKey(voiceId))
{
// add beats to voices
foreach (var beatId in _beatsOfVoice[voiceId])
{
if (beatId != InvalidId)
{
// important! we clone the beat because beats get reused
// in gp6, our model needs to have unique beats.
voice.AddBeat(_beatById[beatId].Clone());
}
}
}
}
// build automations
foreach (var barId in _automations.Keys)
{
var bar = _barsById[barId];
for (int i = 0, j = bar.Voices.Count; i < j; i++)
{
var v = bar.Voices[i];
if (v.Beats.Count > 0)
{
for (int k = 0, l = _automations[barId].Count; k < l; k++)
{
var automation = _automations[barId][k];
v.Beats[0].Automations.Add(automation);
}
}
}
}
// build automations
foreach (var barId in _automations.Keys)
{
var automations = _automations[barId];
var bar = _barsById[barId];
for (int i = 0, j = automations.Count; i < j; i++)
{
var automation = automations[i];
if (automation.Type == AutomationType.Tempo)
{
if (barId == "0") // // TODO find the correct first bar id
{
Score.Tempo = (int)(automation.Value);
Score.TempoLabel = automation.Text;
}
bar.MasterBar.TempoAutomation = automation;
}
}
}
}