LibiadaWeb.Models.Repositories.Sequences.ElementRepository.GetOrCreateNotesInDb C# (CSharp) Method

GetOrCreateNotesInDb() public method

The get or create notes in db.
public GetOrCreateNotesInDb ( Alphabet alphabet ) : long[]
alphabet Alphabet /// The alphabet. ///
return long[]
        public long[] GetOrCreateNotesInDb(Alphabet alphabet)
        {
            var newNotes = new List<Note>();
            var result = new long[alphabet.Cardinality];
            for (int i = 0; i < alphabet.Cardinality; i++)
            {
                var note = (ValueNote)alphabet[i];
                var pitches = GetOrCreatePitchesInDb(note.Pitch);

                var localNoteHash = BitConverter.ToString(note.GetHashCode()).Replace("-", string.Empty);
                if (db.Note.Any(n => n.Value == localNoteHash))
                {
                    var databaseNote = db.Note.Single(n => n.Value == localNoteHash);
                    result[i] = databaseNote.Id;
                    if (note.Triplet != databaseNote.Triplet || note.Duration.Denominator != databaseNote.Denominator
                        || note.Duration.Numerator != databaseNote.Numerator
                        || note.Duration.Odenominator != databaseNote.Odenominator
                        || note.Duration.Onumerator != databaseNote.Onumerator || (int)note.Tie != databaseNote.TieId)
                    {
                        throw new Exception("Found in db note not equals to local note.");
                    }
                }
                else
                {
                    var newNote = new Note
                    {
                        Value = BitConverter.ToString(note.GetHashCode()).Replace("-", string.Empty),
                        Triplet = note.Triplet,
                        Denominator = note.Duration.Denominator,
                        Numerator = note.Duration.Numerator,
                        Onumerator = note.Duration.Onumerator,
                        Odenominator = note.Duration.Odenominator,
                        TieId = (int)note.Tie,
                        Priority = note.Priority,
                        Pitch = db.Pitch.Where(p => pitches.Contains(p.Id)).ToList(),
                        NotationId = Aliases.Notation.Notes
                    };
                    newNotes.Add(newNote);
                    result[i] = newNote.Id;
                }
            }

            db.Note.AddRange(newNotes);
            db.SaveChanges();
            return result;
        }

Usage Example

        /// <summary>
        /// The create.
        /// </summary>
        /// <param name="sequence">
        /// The sequence.
        /// </param>
        /// <param name="sequenceStream">
        /// The sequence stream.
        /// </param>
        /// <exception cref="Exception">
        /// Thrown if congeneric tracks count not equals 1 (track is not monophonic).
        /// </exception>
        public void Create(CommonSequence sequence, Stream sequenceStream)
        {
            string stringSequence = FileHelper.ReadSequenceFromStream(sequenceStream);
            var    doc            = new XmlDocument();

            doc.LoadXml(stringSequence);

            var parser = new MusicXmlParser();

            parser.Execute(doc);
            ScoreTrack tempTrack = parser.ScoreModel;

            if (tempTrack.CongenericScoreTracks.Count != 1)
            {
                throw new Exception("Track contains more then one or zero congeneric score tracks (parts).");
            }

            MatterRepository.CreateOrExtractExistingMatterForSequence(sequence);

            BaseChain notesSequence = ConvertCongenericScoreTrackToNotesBaseChain(tempTrack.CongenericScoreTracks[0]);

            long[] notesAlphabet = ElementRepository.GetOrCreateNotesInDb(notesSequence.Alphabet);
            sequence.Notation = Notation.Notes;
            Create(sequence, notesAlphabet, notesSequence.Building);

            BaseChain measuresSequence = ConvertCongenericScoreTrackToMeasuresBaseChain(tempTrack.CongenericScoreTracks[0]);

            long[] measuresAlphabet = MeasureRepository.GetOrCreateMeasuresInDb(measuresSequence.Alphabet);
            sequence.Notation = Notation.Measures;
            sequence.Id       = default;
            Create(sequence, measuresAlphabet, measuresSequence.Building);

            sequence.Notation = Notation.FormalMotifs;
            var pauseTreatments = EnumExtensions.ToArray <PauseTreatment>().Where(pt => pt != PauseTreatment.NotApplicable);

            foreach (PauseTreatment pauseTreatment in pauseTreatments)
            {
                BaseChain fmotifsSequence = ConvertCongenericScoreTrackToFormalMotifsBaseChain(tempTrack.CongenericScoreTracks[0], pauseTreatment, false);
                long[]    fmotifsAlphabet = FmotifRepository.GetOrCreateFmotifsInDb(fmotifsSequence.Alphabet);
                sequence.Id = default;
                Create(sequence, fmotifsAlphabet, fmotifsSequence.Building, pauseTreatment, false);

                fmotifsSequence = ConvertCongenericScoreTrackToFormalMotifsBaseChain(tempTrack.CongenericScoreTracks[0], pauseTreatment, true);
                fmotifsAlphabet = FmotifRepository.GetOrCreateFmotifsInDb(fmotifsSequence.Alphabet);
                sequence.Id     = default;
                Create(sequence, fmotifsAlphabet, fmotifsSequence.Building, pauseTreatment, true);
            }
        }