private int[] GetOrCreatePitchesInDb(List<Pitch> pitches)
{
var newPitches = new List<LibiadaWeb.Pitch>();
var result = new int[pitches.Count];
for (int i = 0; i < pitches.Count; i++)
{
var pitch = pitches[i];
var noteSymbol = pitch.Step.ToString();
var accidental = pitch.Alter.ToString();
if (db.Pitch.Any(p => p.Midinumber == pitch.MidiNumber))
{
var databasePitch = db.Pitch.Include(p => p.NoteSymbol).Include(p => p.Accidental).Single(p => p.Midinumber == pitch.MidiNumber);
result[i] = databasePitch.Id;
if (pitch.Alter.ToString() != databasePitch.Accidental.Name
|| pitch.Step.ToString() != databasePitch.NoteSymbol.Name
|| pitch.Octave != databasePitch.Octave)
{
throw new Exception("Found in db pitch not equals to local pitch.");
}
}
else
{
var newPitch = new LibiadaWeb.Pitch
{
AccidentalId = db.Accidental.Single(a => a.Name == accidental).Id,
NoteSymbolId = db.NoteSymbol.Single(n => n.Name == noteSymbol).Id,
Octave = pitch.Octave,
Midinumber = pitch.MidiNumber
};
newPitches.Add(newPitch);
result[i] = newPitch.Id;
}
}
db.Pitch.AddRange(newPitches);
db.SaveChanges();
return result;
}